2017-10-11 115 views
0

enter image description here我有2個subplots - 1分散和一個欄我想共享x軸。散點圖有一個顏色條。由於這兩個地塊的座標軸不一致,因此sharex似乎不適用於此。 我的代碼:matplotlib sharex顏色條不工作

fig, (ax, ax2) = plt.subplots(2,1, gridspec_kw = {'height_ratios':[13,2]},figsize=(15,12), sharex=True) 

df_plotdata.plot(kind='scatter', ax=ax, x='index_cancer', y='index_g', s=df_plotdata['freq1']*50, c=df_plotdata['freq2'], cmap=cmap) 

df2.plot(ax=ax2, x='index_cancer', y='freq', kind = 'bar') 
+0

我認識的彩條的問題。試圖移動顏色條似乎不起作用。我似乎也無法擺脫它。 – Preethi

+0

Sharex表示軸限制相同並且軸同步。這並不意味着它們在彼此之上。這一切都取決於你如何創建顏色條。如果人們只是在問題中提供[mcve],可以複製並更改以輕鬆回答他們的問題,這不是很好嗎? – ImportanceOfBeingErnest

回答

0

Sharex表示軸限制相同並且軸同步。這並不意味着它們在彼此之上。這一切都取決於你如何創建顏色條。

pandas scatterplot創建的顏色條與matplotlib中的任何statndard顏色條一樣,是通過去掉與其相關的軸的一部分空間創建的。因此這個軸比網格中的其他軸小。

你的選項包括:

  • 比散點圖軸相同的量收縮電網的其它軸。
    這可以通過使用在第一軸的位置並相應地設置所述第二軸的位置,使用ax.get_position()ax.set_postion()

    import matplotlib.pyplot as plt 
    import pandas as pd 
    import numpy as np 
    import itertools as it 
    
    xy = list(it.product(range(10), range(10))) 
    df = pd.DataFrame(xy, columns=['x','y']) 
    df['score'] = np.random.random(100) 
    
    kw = {'height_ratios':[13,2]} 
    fig, (ax,ax2) = plt.subplots(2,1, gridspec_kw=kw, sharex=True) 
    
    df.plot(kind='scatter', x='x', y='y', c='score', s=100, cmap="PuRd", 
          ax=ax, colorbar=True) 
    df.groupby("x").mean().plot(kind = 'bar', y='score',ax=ax2, legend=False) 
    
    ax2.legend(bbox_to_anchor=(1.03,0),loc=3) 
    
    pos = ax.get_position() 
    pos2 = ax2.get_position() 
    ax2.set_position([pos.x0,pos2.y0,pos.width,pos2.height]) 
    
    plt.show() 
    

enter image description here

  • 創建完成網格包括彩條的軸。
    在這種情況下,您可以創建一個4乘4網格,並將顏色條添加到其右上角的軸。這需要散點圖供給fig.colorbar()並指定一個軸用於住在彩條,

    fig.colorbar(ax.collections[0], cax=cax)  
    

    然後取出右下軸,其中不需要(ax.axis("off"))。您仍然可以通過ax2.get_shared_x_axes().join(ax, ax2)共享軸,如果需要的話。

    import matplotlib.pyplot as plt 
    import pandas as pd 
    import numpy as np 
    import itertools as it 
    
    
    xy = list(it.product(range(10), range(10))) 
    df = pd.DataFrame(xy, columns=['x','y']) 
    df['score'] = np.random.random(100) 
    
    kw = {'height_ratios':[13,2], "width_ratios":[95,5]} 
    fig, ((ax, cax),(ax2,aux)) = plt.subplots(2,2, gridspec_kw=kw) 
    
    df.plot(kind='scatter', x='x', y='y', c='score', s=80, cmap="PuRd", 
         ax=ax,colorbar=False) 
    df.groupby("x").mean().plot(kind = 'bar', y='score',ax=ax2, legend=False) 
    
    fig.colorbar(ax.collections[0], cax=cax, label="score") 
    aux.axis("off") 
    ax2.legend(bbox_to_anchor=(1.03,0),loc=3) 
    ax2.get_shared_x_axes().join(ax, ax2) 
    ax.tick_params(axis="x", labelbottom=0) 
    ax.set_xlabel("") 
    
    plt.show() 
    

enter image description here