2016-10-20 6 views
2

Ich habe Probleme mit Matplotlib in Python versucht, zwei Diagramme nebeneinander zu erstellen. Ich habe es geschafft, dass sie nebeneinander bleiben, aber ich brauche sie, um genau die gleiche Größe zu haben: Jeder Punkt in der rechten sollte leicht mit dem bloßen Auge auf einen Ort auf der linken Seite abgebildet werden. Stattdessen hat meine rechte Seite (die ein Streudiagramm ist) einige Ränder, die es etwas kleiner erscheinen lassen als die linke (eine Heatmap).matplotlib: Subplots der gleichen Größe?

enter image description here

Die Art, wie ich die Heatmap erzeugen ist:

def plot_map(matrix): 
    # Plot it out 
    #fig, ax = plt.subplots() 
    fig = plt.figure() 
    ax = plt.subplot(1,2,1) 
    c = m.colors.ColorConverter().to_rgb 
    cm = make_colormap([(0,1,0), (1,1,0), 0.1, (1,1,0), (1,0.5,0), 0.66, (1,0.5,0),(1,0,0)]) 
    heatmap = ax.pcolor(matrix, cmap=cm) 

    # Format 
    fig = plt.gcf() 
    fig.set_size_inches(20, 20) 
    plt.gca().set_aspect('equal') 
    # turn off the frame 
    ax.set_frame_on(False) 

    # put the major ticks at the middle of each cell 
    ax.set_yticks(np.arange(matrix.shape[0]) + 0.5, minor=False) 
    ax.set_xticks(np.arange(matrix.shape[1]) + 0.5, minor=False) 

    # want a more natural, table-like display 
    ax.invert_yaxis() 
    ax.xaxis.tick_top() 

    # note I could have used matrix.columns but made "labels" instead 
    ax.set_xticklabels(range(0,matrix.shape[0]), minor=False) 
    ax.set_yticklabels(range(0,matrix.shape[1]), minor=False) 
    ax.grid(False) 

    # Turn off all the ticks 
    ax = plt.gca() 

    for t in ax.xaxis.get_major_ticks(): 
     t.tick1On = False 
     t.tick2On = False 
    for t in ax.yaxis.get_major_ticks(): 
     t.tick1On = False 
     t.tick2On = False 

    divider = make_axes_locatable(ax)  
    cax = divider.append_axes("right", size="5%", pad=0.05) 
    plt.colorbar(heatmap,cax=cax) 

    return (fig,ax) 

Dann wird die Axt an eine andere Funktion übergeben über die kleinen blauen Linien auf der Karte zu zeichnen:

def plot_chosen(edges,endnodes,side,ax): 
    for e in edges: 
     u = endnodes[e - 1][0] 
     v = endnodes[e - 1][1] 
     xu, yu = get_center(u,side) 
     xv, yv = get_center(v,side) 
     ax.plot([xu+0.5, xv+0.5], [yu+0.5, yv+0.5], 'k-', lw=4, color='blue',alpha=0.5) 

Schließlich zeichne ich die Streuung wie folgt

def plot_satter(edges,endnodes,side,xs,ys,data): 
    plt.margins(0) 
    ax = plt.subplot(1, 2, 2) 
     # Format 
    fig = plt.gcf() 
    fig.set_size_inches(20, 20) 
    plt.gca().set_aspect('equal') 
    # turn off the frame 
    ax.set_frame_on(False) 

    # put the major ticks at the middle of each cell 
    ax.set_yticks(np.arange(side) + 0.5, minor=False) 
    ax.set_xticks(np.arange(side) + 0.5, minor=False) 

    # want a more natural, table-like display 
    ax.invert_yaxis() 
    ax.xaxis.tick_top() 

    ax.set_xmargin(0) 
    ax.set_ymargin(0) 

    # note I could have used matrix.columns but made "labels" instead 
    ax.set_xticklabels(range(0,side), minor=False) 
    ax.set_yticklabels(range(0,side), minor=False) 
    ax.grid(False) 

    # Turn off all the ticks 
    ax = plt.gca() 

    for t in ax.xaxis.get_major_ticks(): 
     t.tick1On = False 
     t.tick2On = False 
    for t in ax.yaxis.get_major_ticks(): 
     t.tick1On = False 
     t.tick2On = False 
    cm = make_colormap([(0,0,1), (0,1,1), 0.1, (0,1,1), (1,1,0), 0.66, (1,1,0),(1,0,0)]) 
    resmap = plt.scatter(xs,ys, c=data,cmap=cm,edgecolors='none',alpha=0.5,s=data) 
    divider = make_axes_locatable(ax)  
    cax = divider.append_axes("right", size="5%", pad=0.05) 
    plt.colorbar(resmap,cax=cax) 

Aber ich finde keine Möglichkeit, das Streudiagramm so groß wie die Heatmap zu machen. Eigentlich sollte es so groß wie seine Farbleiste sein, aber das funktioniert auch nicht ... Si lässt mich denken, dass es einen gewissen Spielraum um die Streuung gibt ...

Auch, gibt es einen Weg, den ich könnte Machen Sie die ganze PNG-Datei nicht so quadratisch? Könnte es ein Rechteck sein?

Danke!

+1

Es gibt eine Menge Code ... können Sie so viel wie möglich abstreifen und es zu einem ausführbaren [MCVE] (http://stackoverflow.com/help/mcve) -Beispiel machen? – pathoren

Antwort

2

Um Hilfe zu erhalten, müssen Sie eine minimal working example bereitstellen. Sie werden feststellen, dass die Herstellung eines solchen minimal working example, fast immer Sie das Problem und eine entsprechende Lösung selbst finden.
Strukturieren Sie auch Ihren Code !!

Da wir nicht das notwendige Wissen über Ihre Daten und die von Ihnen verwendeten Variablen haben, ist es fast unmöglich, eine Lösung zu finden.

Was Sie tun müssen, ist das Problem zu lösen. Sie suchen nach dem Unterschied zwischen zwei Dingen - machen Sie sie so gleich wie möglich. Wenn Sie alles gleichzeitig auf beide Parzellen anwenden, wie können sie dann anders sein?

Der folgende Code zeigt, wie Sie das tun würden, und es zeigt tatsächlich keinen Unterschied in der Größe der beiden Diagramme. Fang also von dort an und füge die Sachen hinzu, die du entsprechend brauchen wirst. Schritt für Schritt, bis Sie den Code gefunden haben, der Probleme verursacht.

import matplotlib.pyplot as plt 
import numpy as np 
from mpl_toolkits.axes_grid1 import make_axes_locatable 

x = np.linspace(0,100,101) 
X, Y = np.meshgrid(x,x) 
data = np.sin(X/2.3)*np.cos(Y/2.7)*np.cos(X*Y/20.) 

fig = plt.figure(figsize=(10,5)) 
ax1=fig.add_subplot(121) 
ax2=fig.add_subplot(122) 
plt.subplots_adjust(wspace = 0.33) 

heatmap = ax1.pcolor(data, cmap="RdPu") 
resmap = ax2.scatter(X,Y, c=data, cmap="YlGnBu",edgecolors='none',alpha=0.5) 


for ax in [ax1,ax2]: 
    ax.set_frame_on(False) 

    ax.set_aspect('equal') 

    ax.invert_yaxis() 
    ax.xaxis.tick_top() 

    ax.set_xmargin(0) 
    ax.set_ymargin(0) 

    ax.grid(False) 

    for t in ax.xaxis.get_major_ticks(): 
     t.tick1On = False 
     t.tick2On = False 
    for t in ax.yaxis.get_major_ticks(): 
     t.tick1On = False 
     t.tick2On = False 

    ax.set_xlim([x[0],x[-1]]) 
    ax.set_ylim([x[0],x[-1]]) 


divider1 = make_axes_locatable(ax1)  
cax1 = divider1.append_axes("right", size="5%", pad=0.05) 
plt.colorbar(heatmap,cax=cax1) 

divider2 = make_axes_locatable(ax2)  
cax2 = divider2.append_axes("right", size="5%", pad=0.05) 
plt.colorbar(resmap,cax=cax2) 

plt.show() 

Und btw, fig = plt.figure(figsize=(10,5)) erzeugt ein Rechteck, während fig = plt.figure(figsize=(20,20)) ein Quadrat erzeugt.

+0

Hallo, danke für die Hilfe! Ich dachte nicht daran, eine kleinere Instanz zu machen, weil ich dachte, dass es für Leute, die Matplotlib verwenden, etwas offensichtlich wäre. In allen Fällen war mein Problem, dass ich vermisste: 'ax.set_xlim ([x [0], x [-1]]) ax.set_ylim ([x [0], x [-1]])' auf der Streudiagramm. Dank dafür! – ddeunagomez

Verwandte Themen