2017-10-11 14 views
0

enter image description here J'ai 2 sous-placettes - 1 dispersion et une barre pour laquelle je voudrais un axe x partagé. Le nuage de points a une barre de couleur. Le sharex ne semble pas fonctionner avec cela car l'axe pour les deux parcelles ne coïncident pas. mon code:matplotlib sharex avec la barre de couleurs ne fonctionne pas

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

Je me rends compte du colorbar est le problème. Essayer de déplacer la barre de couleurs ne semble pas fonctionner. Je n'arrive pas non plus à m'en débarrasser. – Preethi

+0

Sharex signifie que les limites des axes sont les mêmes et que les axes sont synchronisés. Cela ne signifie pas qu'ils se trouvent l'un sur l'autre. Tout dépend de la façon dont vous créez la barre de couleurs. Ne serait-ce pas génial si les gens fournissaient juste [mcv] des questions, qui pourraient être copiées et changées pour répondre facilement à leurs questions? – ImportanceOfBeingErnest

Répondre

0

Sharex signifie que les limites des axes sont les mêmes et que les axes sont synchronisés. Cela ne signifie pas qu'ils se trouvent l'un sur l'autre. Tout dépend de la façon dont vous créez la barre de couleurs.

La barre de couleurs créée par pandas scatterplot est, comme n'importe quelle barre de couleurs standard de matplotlib, créée en enlevant une partie de l'espace pour les axes auxquels elle se rapporte. Par conséquent, cet axe est plus petit que les autres axes de la grille.

options que vous avez comprennent:

  • rétrécissant les autres axes de la grille par la même quantité que les axes scatterplot.
    Cela peut être fait en utilisant la position des premiers axes et régler la position des seconds axes en conséquence, en utilisant ax.get_position() et 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

  • Créer une grille incluant un axe pour la barre de couleurs.
    Dans ce cas, vous pouvez créer une grille 4 par 4 et ajouter la barre de couleurs à son axe supérieur droit. Cela nécessite de fournir le nuage de points à fig.colorbar() et spécifier un axe pour le colorbar à vivre,

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

    Ensuite, retirer les axes en bas à droite, qui ne sont pas nécessaires (ax.axis("off")). Vous pouvez toujours partager les axes, si nécessaire, via 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