2017-10-11 2 views
0

enter image description here Ich habe 2 Unterplots- 1 Streuung und einen Balken, für den ich möchte eine gemeinsame X-Achse. Das Streudiagramm hat einen Farbbalken. Der sharex scheint damit nicht zu funktionieren, da die Achsen für die beiden Plots nicht übereinstimmen. My Code:matplotlib sharex mit Farbbalken funktioniert nicht

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

Ich weiß, das colorbar das Problem ist. Der Versuch, die Farbleiste zu verschieben, scheint nicht zu funktionieren. Ich kann auch nicht in der Lage sein, es los zu werden. – Preethi

+0

Sharex bedeutet, dass die Achsengrenzen gleich sind und dass die Achsen synchronisiert sind. Es bedeutet nicht, dass sie übereinander liegen. Alles hängt davon ab, wie Sie die Farbleiste erstellen. Wäre es nicht großartig, wenn die Leute nur Fragen in den Fragen stellen würden, die kopiert und geändert werden könnten, um ihre Fragen zu beantworten? – ImportanceOfBeingErnest

Antwort

0

Sharex bedeutet, dass die Achsen Grenzen gleich sind und dass die Achsen synchronisiert sind. Es bedeutet nicht, dass sie übereinander liegen. Alles hängt davon ab, wie Sie die Farbleiste erstellen.

Die von pandas scatterplot erstellte Farbleiste wird, genau wie jede andere Farbleiste in Matplotlib, erstellt, indem ein Teil des Platzes für die Achsen, auf die sie sich bezieht, weggenommen wird. Daher ist diese Achse kleiner als andere Achsen vom Gitter.

Optionen Sie haben, gehören:

  • die anderen Achsen des Gitters um den gleichen Betrag Schrumpfen als die Scatterplot-Achsen.
    Dies kann durch die Position der ersten Achse und die Position der zweiten Achsen Dementsprechend ax.get_position() und 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

  • eines mit SET erfolgen Erstellen Raster mit Achsen für die Farbleiste.
    In diesem Fall können Sie ein 4 mal 4 Raster erstellen und die Farbleiste den oberen rechten Achsen hinzufügen. Dies erfordert den Streudiagramm zu fig.colorbar() und geben Sie eine Achse für die colorbar zur Versorgung der unteren rechten Achsen zu leben,

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

    Dann entfernen, die nicht benötigt wird (ax.axis("off")). Sie können die Achsen, falls erforderlich, weiterhin über ax2.get_shared_x_axes().join(ax, ax2) teilen.

    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

Verwandte Themen