wie machen quadratischen subplots in matplotlib mit heatmaps?
Ich versuche eine einfache Nebenhandlung mit ein das dendrogramm in einer Nebenhandlung und eine heat map, die in einem anderen, unter Beibehaltung Platz Achsen. Ich versuche Folgendes:
from scipy.cluster.hierarchy import linkage
from scipy.cluster.hierarchy import dendrogram
from scipy.spatial.distance import pdist
fig = plt.figure(figsize=(7,7))
plt.subplot(2, 1, 1)
cm = matplotlib.cm.Blues
X = np.random.random([5,5])
pmat = pdist(X, "euclidean")
linkmat = linkage(pmat)
dendrogram(linkmat)
plt.subplot(2, 1, 2)
labels = ["a", "b", "c", "d", "e", "f"]
Y = np.random.random([6,6])
plt.xticks(arange(0.5, 7.5, 1))
plt.gca().set_xticklabels(labels)
plt.pcolor(Y)
plt.colorbar()
daraus ergibt sich die folgende:
aber die Probleme sind, dass die Achsen sind nicht quadratisch, und die Farbskala ist als Teil des zweiten Nebenhandlung. Ich möchte ihn stattdessen zu hängen außerhalb des plot, und machen es so den das dendrogramm box und die heatmap-box sind die beiden quadratischen und zueinander ausgerichtet (D. H. gleiche Größe.)
Versuchte ich mit aspect='equal'
um Platz Achsen beim Aufruf subplot
als die Dokumentation vermuten lässt, aber das ruiniert den plot, so dass diese...
wenn ich versuche, mit plt.axis('equal')
nach jeder Nebenhandlung statt aspect='equal'
es seltsam Quadrate der heatmap aber nicht seine bounding-box (siehe unten), während die Zerstörung der das dendrogramm insgesamt und auch vermasselt die Ausrichtung des xtick Etiketten.... - der Anlass zu diesem Durcheinander:
wie kann dies behoben werden? um es zusammenzufassen, ich versuche, die Handlung etwas sehr einfaches: ein Quadrat, das dendrogramm in der oberen Teilfläche, und ein Quadrat heatmap im unteren Nebenhandlung, mit der Farb-Balken auf der rechten Seite. nichts besonderes.
schließlich, mehr Allgemeine Frage: gibt es eine Regel /Prinzip zu Folgen, um Kraft matplotlib zu immer machen-Achsen-Platz? Ich kann mir nicht vorstellen, einen einzigen Fall, wo ich nicht wollen, quadratische Achsen, aber es ist in der Regel nicht das Standard-Verhalten. Ich möchte erzwingen, dass alle Grundstücke rechteckig sein, wenn möglich.
InformationsquelleAutor user248237dfsf | 2012-08-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
@HYRY, die Antwort ist sehr gut und verdient alle Anerkennung. Aber zum Schluss die Antwort über das Futter die quadratische Parzellen bis schön, Sie betrügen könnte matplotlib zu denken, dass beide Grundstücke haben colorbars, nur macht das erste unsichtbare:
InformationsquelleAutor pelson
aspect="gleich" bedeutet die gleiche Länge im Daten-Raum die gleiche Länge in Platz auf dem Bildschirm, aber in Ihrem top-Axt, der Daten reicht von xaxis und yaxis sind nicht die gleichen, also wird es auch keinen Platz. Um dieses problem zu beheben, können Sie das Aspekt-Verhältnis der x-Reihe und yaxis-Bereich:
Hier ist die Ausgabe:
Zur Lage der Farbskala, die wir benötigen, schreiben Sie eine ColorBarLocator Klasse, das pad und die Breite des Arguments sind in pixel-Einheit,
ersetzen
plt.colorbar()
mit dem folgenden code:Ich bearbeitete die Antwort, überprüfen Sie bitte es.
vielen Dank für deine Antwort - es ist genau die richtige Ausgabe, aber der code scheint äußerst Komplex! gibt es einen einfacheren Weg? wie es scheint, Sie haben eine der matplotlib-Entwickler wissen, wie man etwas schreiben wie dieses, nur um eine color-bar, um line-up...
Hier sind einige Beispiele, aber ich denke Sie sind schwer zu verstehen auch: matplotlib.sourceforge.net/examples/axes_grid/... matplotlib.sourceforge.net/examples/axes_grid/...
Ich kenne solche Beispiele auch, aber Sie nicht anwenden, ich glaube, wenn es das dendrogramm in die andere Nebenhandlung, da bricht die Dinge aus irgendeinem Grund.
InformationsquelleAutor HYRY
Hinzufügen, um die anderen Antworten, die Sie brauchen, um den absoluten Wert des arguments zu
.set_aspect
:InformationsquelleAutor mobeets