2017-11-26 6 views
1

Ich versuche, eine Signaturleiste am unteren Rand einer Figur hinzuzufügen. Ich würde gerne in der Lage sein, es ohne die ganze Handarbeit zu machen, mit den x- und y-Werten des Textes zu spielen und leere Strings hinzuzufügen. Ich dachte über annotate verwenden, aber ich habe ein paar Probleme:Matplotlib fügen Signaturleiste am unteren Rand der Abbildung

import matplotlib.pyplot as plt 
import numpy as np 

fig = plt.figure() 

ax = fig.add_subplot(111) 
t = np.arange(0.0, 5.0, 0.01) 
s = np.cos(2*np.pi*t) 
line, = ax.plot(t, s, lw=2) 

ax.set_ylim(-2,2) 
ax.set_xlabel('Angle') 

ax.annotate('What what?', xy=(0, 0), xycoords='figure fraction',backgroundcolor = 'blue') 

Meine wichtigsten Fragen: 1. Ich die Bar will über die gesamte Breite der Figur zu gehen. Ich kann leeren Text hinzufügen, um die Leiste zu erweitern, aber ich habe auf etwas Automatisiertes gehofft, also muss ich es nicht manuell für verschiedene Szenarien machen. 2. Ich möchte den Balken etwas tiefer bewegen, ohne dass der Balken verschwindet oder beschneidet wird.

Jeder Rat wäre großartig!

+0

Was genau ist eine "Signatur Bar"? Kann genauer sein, was die gewünschte Ausgabe ist? – ImportanceOfBeingErnest

+0

Unter Signaturleiste verstehe ich eine Box, die die ganze Breite der Figur entweder unten oder oben erweitert, wo ich meinen Namen und die Datenquelle schreiben kann. Fünfteilige Zahlen sind ein Beispiel für solche "Signaturbalken". Zum Beispiel: https://www.google.com/search?q=fivethirtyeight+figures&newwindow=1&source=nnms&tbm=isch&sa=X&ved=0ahUKEwiR0Z_1kd_XAhVh1oMKHeZFDKAQ_AUIDCgD&biw=1536&bih=686#imgrc=PE5bdnXx75n8UM: –

Antwort

1

Es ist ein bisschen schwierig, die Bounding Box eines Textes anzupassen. Eine Option, dies zu tun, ist in dieser Frage gezeigt: How do I make the width of the title box span the entire plot?

dies zu vermeiden Versuch, eine einfachere, aber weniger automatische Lösung wäre, ein Rechteck im unteren Teil der Figur zu erstellen und einen Text hinzufügen, so dass es aussieht Wie der Text im Rechteck sitzt.

import matplotlib.pyplot as plt 
import numpy as np 

fig = plt.figure() 

ax = fig.add_subplot(111) 
t = np.arange(0.0, 5.0, 0.01) 
s = np.cos(2*np.pi*t) 
line, = ax.plot(t, s, lw=2) 

ax.set_ylim(-2,2) 
ax.set_xlabel('Angle') 


def signaturebar(fig,text,fontsize=10,pad=5,xpos=20,ypos=7.5, 
       rect_kw = {"facecolor":"grey", "edgecolor":None}, 
       text_kw = {"color":"w"}): 
    w,h = fig.get_size_inches() 
    height = ((fontsize+2*pad)/72.)/h 
    rect = plt.Rectangle((0,0),1,height, transform=fig.transFigure, clip_on=False,**rect_kw) 
    fig.axes[0].add_patch(rect) 
    fig.text(xpos/72./h, ypos/72./h, text,fontsize=fontsize,**text_kw) 
    fig.subplots_adjust(bottom=fig.subplotpars.bottom+height) 

signaturebar(fig,"This is my signature text") 

plt.show() 

enter image description here

+0

Große Antwort. Können Sie bitte die 72 erklären. Was sind die Einheiten der Schriftgröße? Vielen Dank! –

+0

Einheiten sind Punkte. Matplotlib verwendet 72 Punkte pro Zoll (ppi). Z.B. Um Pixel von Punkten zu berechnen, benötigen Sie die Zahl dpi 'pixels = fig.dpi/72 '. Da die Antwort Punkte als Einheiten und Positionen in Bildkoordinaten verwendet, wäre sie unabhängig von der Zahl dpi. – ImportanceOfBeingErnest

Verwandte Themen