2014-03-26 12 views
5

Gibt es eine Möglichkeit, das Ergebnis in den dritten Achsen mit nur einem einzigen ax.text()-Befehl anzuzeigen? Mit expandtabs bekomme ich es fast fertig, aber der Text wird nie richtig ausgerichtet.Matplotlib-Textausrichtung

Die Verwendung von zwei Zeichenbefehlen erscheint mir nicht als eine gute Übung, und Sie müssen immer den Abstand zwischen beiden erraten, was einige Iterationen erfordern kann.

fig, axs = plt.subplots(1,3, figsize=(12,4), 
         subplot_kw={'aspect': 1, 'xticks': [], 'yticks':[]}) 
fig.subplots_adjust(wspace=0.05) 

values = {'a': 1.35, 'b': 25.1, 'c': 5} 

tmpl = """Param1: {a:1.1f} 
Long param2: {b:1.1f} 
Prm3: {c:1.1f}""" 

mystr = tmpl.format(**values) 
axs[0].text(0.1, 0.9, mystr, va='top', transform=axs[0].transAxes) 
axs[0].set_title('Default') 


tmpl = """Param1:\t\t\t{a:1.1f} 
Long param2:\t{b:1.1f} 
Prm3:\t\t\t{c:1.1f}""".expandtabs() 

mystr = tmpl.format(**values) 
axs[1].text(0.1, 0.9, mystr, va='top', transform=axs[1].transAxes) 
axs[1].set_title('Almost there') 


labels = """Param1: 
Long param2: 
Prm3:""" 

tmpl = """{a:1.1f} 
{b:1.1f} 
{c:1.1f}""" 

mystr = tmpl.format(**values) 
axs[2].text(0.1, 0.9, labels, va='top', transform=axs[2].transAxes) 
axs[2].text(0.65, 0.9, mystr, va='top', ha='right', transform=axs[2].transAxes) 
axs[2].set_title('Target') 

enter image description here

+3

Schauen Sie sich die Zeichenfolge Formatierung in [diese Antwort] (http://stackoverflow.com/a/9549204/1634191) – wflynny

Antwort

6

eine dicktengleiche Schriftart verwenden, so dass jedes Zeichen die gleiche Menge an Platz in Anspruch nimmt.

import matplotlib.pyplot as plt 

fig, axs = plt.subplots(1,3, figsize=(12,4), 
         subplot_kw={'aspect': 1, 'xticks': [], 'yticks':[]}) 
fig.subplots_adjust(wspace=0.05) 

values = {'a': 1.35, 'b': 25.1, 'c': 5} 

tmpl = """Param1: {a:1.1f} 
Long param2: {b:1.1f} 
Prm3: {c:1.1f}""" 



mystr = tmpl.format(**values) 
axs[0].text(0.1, 0.9, mystr, va='top', transform=axs[0].transAxes) 
axs[0].set_title('Default') 


mono = {'family' : 'monospace'} 

textblock = "1234567890\nabcdefghij\nABCDEFGHIJ\n   0" 

axs[1].text(0.1, 0.9, textblock, va='top', transform=axs[1].transAxes, fontdict=mono) 
axs[1].set_title('Monospaced text block') 


axs[2].text(0.1, 0.9, textblock, va='top', transform=axs[2].transAxes) 
axs[2].set_title('Not monospaced') 

plt.show() 

enter image description here