2017-06-20 3 views
6

Ich versuche, ein Bild (unter Verwendung matplotlib.imshow) und ein Streudiagramm innerhalb der gleichen Abbildung zu plotten. Wenn Sie dies versuchen, erscheint das Bild kleiner als das Streudiagramm. Kleines Beispiel-Code ist unten dargestellt:Erhalten der gleichen Unterplotgröße mit matplotlib imshow und scatter

import matplotlib.pyplot as plt 
import numpy as np 

image = np.random.randint(100,200,(200,200)) 
x = np.arange(0,10,0.1) 
y = np.sin(x) 

fig, (ax1, ax2) = plt.subplots(1,2) 
ax1.imshow(image) 
ax2.scatter(x,y) 

plt.show() 

, die die folgende Abbildung zeigt:

enter image description here

Wie kann ich die beiden sublpots die gleiche Höhe haben? (Und Breite nehme ich an)

ich versucht habe, mit gridspec wie in this Antwort gezeigt:

fig=plt.figure() 
gs=GridSpec(1,2) 

ax1=fig.add_subplot(gs[0,0]) 
ax2=fig.add_subplot(gs[0,1]) 
ax1.imshow(image) 
ax2.scatter(x,y) 

Aber das gibt das gleiche Ergebnis. Ich habe auch versucht die subplot manuell anpassen Größen unter Verwendung von:

fig = plt.figure() 
ax1 = plt.axes([0.05,0.05,0.45,0.9]) 
ax2 = plt.axes([0.55,0.19,0.45,0.62]) 

ax1.imshow(image) 
ax2.scatter(x,y) 

durch Versuch und Irrtum kann ich die beiden Handlungsstränge auf die richtige Größe bekommen, wenn eine Änderung der Gesamtzahl Größe bedeuten, dass die Handlungsstränge wird nicht länger gleich groß sein.

Gibt es eine Möglichkeit, imshow und scatter Plot die gleiche Größe in einer Abbildung erscheinen, ohne die Achsengrößen manuell zu ändern?

Ich verwende Python 2.7 und matplotlib 2.0.0

Antwort

6

Es ist nicht ganz klar, was Ihr gewünschtes Ergebnis ist.

  1. können Sie automatischen Aspekt auf dem Bild verwenden

    ax.imshow(z, aspect="auto") 
    

    enter image description here

  2. Oder Sie können den Aspekt der Linie Plotset auf seiner Achse Grenzen abhängig, so dass sie die gleiche Größe bekommen als das Bild (falls das Bild gleiche x- und y-Größen hat)

    asp = np.diff(ax2.get_xlim())[0]/np.diff(ax2.get_ylim())[0] 
    ax2.set_aspect(asp) 
    

    enter image description here kompletter Code:

    import numpy as np 
    import matplotlib.pyplot as plt 
    
    x = np.linspace(0,10,20) 
    y = np.sin(x) 
    z = np.random.rand(100,100) 
    
    fig, (ax, ax2) = plt.subplots(ncols=2) 
    
    ax.imshow(z) 
    ax2.plot(x,y, marker=".") 
    
    asp = np.diff(ax2.get_xlim())[0]/np.diff(ax2.get_ylim())[0] 
    ax2.set_aspect(asp) 
    
    plt.show() 
    

    Wenn das Bild nicht gleich Grenzen hat (nicht quadratisch), einer durch den Aspekt des Bildes zu unterteilen muss noch:

    asp = np.diff(ax2.get_xlim())[0]/np.diff(ax2.get_ylim())[0] 
    asp /= np.abs(np.diff(ax1.get_xlim())[0]/np.diff(ax1.get_ylim())[0]) 
    ax2.set_aspect(asp) 
    
+0

Das gewünschte Ergebnis war einfach, dass die beiden Teilplots genau die gleiche Größe hatten und so blieben, wenn die Größe der Figur geändert wurde. Wie auch immer, 'aspect = 'auto' hat es geschafft, danke. – DavidG

1

Hier einige Code, den ich verwenden:

fig, axis_array = plt.subplots(1, 2, figsize=(chosen_value, 1.05 * chosen_value/2), 
           subplot_kw={'aspect': 1}) 

ich, dass es explizit bin der Auswahl 2 Untergrundstücke in meiner Figur sein wird, und dass die Die Zahl wird "selected_value tall" sein und jeder Teilplot wird ungefähr halb so groß sein, und die Teilplots werden ein Seitenverhältnis von 1 haben (dh sie werden beide quadratisch sein). Die Figurengröße ist ein bestimmtes Verhältnis, das den Abstand zwingt.

+1

Ihre Handlung wird dann wie folgt aussehen: https: //i.stack .imgur.com/fsGB2.png Ich glaube nicht, dass OP dies will. – ImportanceOfBeingErnest

0

I hatte das gleiche Problem und stellte eine sehr ähnliche Frage in SO.Die von @ImportanceOfBeingErnest vorgeschlagene Lösung funktionierte wie ein Zauber für mich, aber der Vollständigkeit halber möchte ich eine ziemlich einfache Problemumgehung erwähnen, die ich vorschlagen sollte (Kredit an @Yilun Zhang), bevor meine Frage als exaktes Duplikat markiert wurde ein:

das Problem ist, dass die Plotregion Höhe zu groß ist und diese leeren Platz im Bild verlässt.

Wenn Sie Ihren Code ändern:

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6)) 

dann erhalten Sie das gewünschte Ergebnis:

Desired outcome

Verwandte Themen