2017-08-09 4 views
2

Wie kann ich die gleiche Legende über 2 Unterplots erscheinen lassen und sie über die 2 erweitern lassen. Weiß jemand, wenn ich das y-Label für jedes Teilplot separat präzisieren muss, wenn es dasselbe ist (Die Handlung ist für eine wissenschaftliche Arbeit)? Ich weiß, dass die letzte Frage nichts mit Rechnen zu tun hat, aber wenn jemand die Antwort kennt, würde ich es begrüßen.Erweiterte Legende über 2 Teilplots

Für die Platzierung der Legende ich benutze:

 ax[0].legend(bbox_to_anchor=(0., 1.02, 1., .102), loc=3, 
       ncol= 4, mode="expand", borderaxespad=0) 

plots

+0

Ist das eine Matplolib-Frage? –

+0

ja ist es. Passt das nicht zu diesem Forum? – Tassou

+0

Es ist geeignet. Es könnte mehr Antworten mit einem Matplotlib-Tag erhalten. Ich werde es hinzufügen. –

Antwort

1

Um die Legende Strecke über beide Handlungsstränge zu machen, müssen Sie die Koordinaten bbox_to_anchor gegeben einzustellen. Die Verwendung von 2.2 für die Breite (das dritte Argument) umfasst die doppelte Breite der Darstellung plus den Abstand zwischen den Teilzeichnungen. (Wenn Sie einen anderen Abstand als der Standard haben, wie f.tightlayout(), wird dieser Wert eingestellt muß.)

Hier ist ein einfaches Arbeitsbeispiel:

import numpy as np 
import matplotlib.pyplot as plt 

x1 = np.linspace(0.0, 2.0) 
x2 = np.linspace(0.0, 2.0) 

y1 = np.cos(2 * np.pi * x1) * np.exp(-x1) 
y2 = np.cos(2 * np.pi * x2) 

f,ax = plt.subplots(1, 2) 

ax[0].plot(x1, y1, 'ko-', label='Damped') 
ax[0].plot(x2, y2, 'r.-', label='Undamped') 
ax[1].plot(x1, y1, 'ko-', label='Damped') 
ax[1].plot(x2, y2, 'r.-', label='Undamped') 

ax[0].legend(bbox_to_anchor=(0., 1.02, 2.2, .102), loc=3, 
       ncol=4, mode="expand", borderaxespad=0) 

plt.show() 

Das Ergebnis dieses Grundstück ist:

enter image description here

+0

Danke, das ist genau das, was ich brauchte – Tassou

1

Um die Legende über alle Unterplots in einer Figur zu strecken, können Sie die Legendenplazierung halbieren. Die Verwendung der subplotpars aus der Abbildung ermöglicht es, die verwendeten Abstände zu finden, so dass diese Abstände direkt in dem Argument bbox_to_anchor verwendet werden können. Dazu muss die Legendentransformation über das Argument bbox_transform auf die Figurtransformation festgelegt werden. Die einzigen Parameter, die Sie manuell angeben müssen, sind der Abstand zwischen den Achsen und der Legende (0,02 im unteren Beispiel) und die Höhe der Legende (0,05 im unteren Beispiel), beide in Einheiten der Figurenhöhe.

s = fig.subplotpars 
bb=[s.left, s.top+0.02, s.right-s.left, 0.05 ] 
leg = axes[0].legend(..., bbox_to_anchor=bb, mode="expand", borderaxespad=0, 
        bbox_transform=fig.transFigure) 

Ein vollständiges Beispiel:

import matplotlib.pyplot as plt 
import numpy as np 

a = np.cumsum(np.random.rand(10,8), axis=0) 

fig, axes = plt.subplots(ncols=2) 

for i in range(a.shape[1]): 
    axes[i//4].plot(a[:,i], marker="s", label="Label {}".format(i)) 

s = fig.subplotpars 
bb=[s.left, s.top+0.02, s.right-s.left, 0.05 ] 
leg = axes[0].legend(loc=8, bbox_to_anchor=bb, ncol= 4, mode="expand", borderaxespad=0, 
       bbox_transform=fig.transFigure, fancybox=False, edgecolor="k") 
leg.get_frame().set_linewidth(72./fig.dpi) 
plt.show() 

enter image description here

Zur Frage, ob Sie benötigen eine oder zwei Legenden in einer wissenschaftlichen Arbeit, ist dies völlig abhängig von der Art des Papiers. Ich würde vermuten, dass die Verwendung einer einzigen Legende wie hier in Ordnung ist. Zeitschriften erfordern jedoch meistens, dass Sie jedes Unterplot mit einem kleinen Buchstaben markieren, wie a und b oder (a) und .

Verwandte Themen