Matplotlib - globale Legende und Titel neben Nebenhandlungen

125

Ich habe mit Matplot angefangen und einige grundlegende Plots verwaltet, aber jetzt fällt es mir schwer herauszufinden, wie ich einige Dinge tun kann, die ich jetzt brauche :(

Meine eigentliche Frage ist, wie man einen globalen Titel und eine globale Legende auf eine Figur mit Nebenhandlungen setzt.

Ich mache 2x3-Unterzeichnungen, in denen ich viele verschiedene Grafiken in verschiedenen Farben habe (ungefähr 200). Um (die meisten) von ihnen zu unterscheiden, habe ich so etwas geschrieben

def style(i, total):
    return dict(color=jet(i/total),
                linestyle=["-", "--", "-.", ":"][i%4],
                marker=["+", "*", "1", "2", "3", "4", "s"][i%7])

fig=plt.figure()
p0=fig.add_subplot(321)
for i, y in enumerate(data):
    p0.plot(x, trans0(y), "-", label=i, **style(i, total))
# and more subplots with other transN functions

(irgendwelche Gedanken dazu? :)) Jede Nebenhandlung hat die gleiche Stilfunktion.

Jetzt versuche ich, einen globalen Titel für alle Nebenhandlungen und eine globale Legende zu erhalten, die alle Stile erklärt. Außerdem muss ich die Schrift klein machen, damit sie auf alle 200 Stile passt (ich brauche keine völlig eindeutigen Stile, aber zumindest einen Versuch).

Kann mir jemand bei der Lösung dieser Aufgabe helfen?

Gerenuk
quelle

Antworten:

192

Globaler Titel : In neueren Versionen von matplotlib kann die Figure.suptitle () -Methode verwendet werden von Figure:

import matplotlib.pyplot as plt
fig = plt.gcf()
fig.suptitle("Title centered above all subplots", fontsize=14)

Alternativ (basierend auf dem Kommentar von @Steven C. Howell unten (danke!)) Verwenden Sie die Funktion matplotlib.pyplot.suptitle () :

 import matplotlib.pyplot as plt
 # plot stuff
 # ...
 plt.suptitle("Title centered above all subplots", fontsize=14)
orbeckst
quelle
64
Für diejenigen, die wie folgt importieren : import matplotlib.pyplot as plt, könnte der Befehl einfach wie plt.figure(); plt.suptitle('Title centered above all subplots'); plt.subplot(231); plt.plot(data[:,0], data[:,1]);folgt eingegeben werden ...
Steven C. Howell
1
Vielen Dank. Dies sollte die tatsächlich ausgewählte Antwort sein.
Gustafbstrom
61

Zusätzlich zur orbeckst-Antwort möchte man möglicherweise auch die Nebenhandlungen nach unten verschieben. Hier ist ein MWE im OOP-Stil:

import matplotlib.pyplot as plt

fig = plt.figure()
st = fig.suptitle("suptitle", fontsize="x-large")

ax1 = fig.add_subplot(311)
ax1.plot([1,2,3])
ax1.set_title("ax1")

ax2 = fig.add_subplot(312)
ax2.plot([1,2,3])
ax2.set_title("ax2")

ax3 = fig.add_subplot(313)
ax3.plot([1,2,3])
ax3.set_title("ax3")

fig.tight_layout()

# shift subplots down:
st.set_y(0.95)
fig.subplots_adjust(top=0.85)

fig.savefig("test.png")

gibt:

Geben Sie hier die Bildbeschreibung ein

Adobe
quelle
2
Dies sollte die beste Antwort sein
Statham
Einverstanden ! Die akzeptierte Antwort führt eine weitere Abhängigkeit ein und beantwortet daher die OP-Frage nicht richtig.
Yohan Obadia
7

Für Legenden können Etiketten wie folgt verwendet werden. Legendlabels sind die gespeicherten Plotlinien. modFreq sind die Namen der tatsächlichen Beschriftungen, die den Plotlinien entsprechen. Dann ist der dritte Parameter der Ort der Legende. Zuletzt können Sie alle Argumente eingeben, die ich hier unten habe, aber hauptsächlich die ersten drei benötigen. Außerdem sollten Sie dies tun, wenn Sie die Beschriftungen im Plot-Befehl richtig eingestellt haben. Rufen Sie einfach die Legende mit dem Standortparameter auf und finden Sie die Beschriftungen in jeder der Zeilen. Ich hatte besseres Glück, meine eigene Legende wie unten zu machen. Scheint in allen Fällen zu funktionieren, in denen der andere Weg nie richtig in Gang gekommen zu sein schien. Wenn Sie nicht verstehen, lassen Sie es mich wissen:

legendLabels = []
for i in range(modSize):
    legendLabels.append(ax.plot(x,hstack((array([0]),actSum[j,semi,i,semi])), color=plotColor[i%8], dashes=dashes[i%4])[0]) #linestyle=dashs[i%4]       
legArgs = dict(title='AM Templates (Hz)',bbox_to_anchor=[.4,1.05],borderpad=0.1,labelspacing=0,handlelength=1.8,handletextpad=0.05,frameon=False,ncol=4, columnspacing=0.02) #ncol,numpoints,columnspacing,title,bbox_transform,prop
leg = ax.legend(tuple(legendLabels),tuple(modFreq),'upper center',**legArgs)
leg.get_title().set_fontsize(tick_size)

Sie können das Bein auch verwenden, um Schriftgrößen oder fast alle Parameter der Legende zu ändern.

Der im obigen Kommentar angegebene globale Titel kann durch Hinzufügen von Text über den angegebenen Link erfolgen: http://matplotlib.sourceforge.net/examples/pylab_examples/newscalarformatter_demo.html

f.text(0.5,0.975,'The new formatter, default settings',horizontalalignment='center',
       verticalalignment='top')
J Spen
quelle
4

suptitlescheint der richtige Weg zu sein, aber für das, was es wert ist, figurehat das eine transFigureEigenschaft, die Sie verwenden können:

fig=figure(1)
text(0.5, 0.95, 'test', transform=fig.transFigure, horizontalalignment='center')
Mathtick
quelle