it-swarm.com.de

Feld um Text in Matplotlib

wie ist es möglich, in matplotlib einen Rahmen um Text zu erstellen? Ich habe Text in drei verschiedenen Zeilen und in drei verschiedenen Farben:

 ax.text(2,1, 'alpha', color='red')
 ax.text(2,2, 'beta', color='cyan')
 ax.text(2,3, 'epsilon', color='black')

Ich habe das Tutorial gesehen http://matplotlib.org/users/recipes.html (letztes Beispiel), aber ich kann das Problem nicht lösen. Danke im Voraus.

37
Marika Blum

In dem Beispiel, das Sie mit Erwähnungen verknüpft haben, können Sie das bbox kwarg verwenden, um eine Box hinzuzufügen.

Ich nehme an, Sie sind verwirrt, wie Sie die Farbe usw. der Box einstellen sollen. Ein kurzes Beispiel:

import matplotlib.pyplot as plt
fig, ax = plt.subplots()

ax.text(0.5, 0.8, 'Test', color='red', 
        bbox=dict(facecolor='none', edgecolor='red'))

ax.text(0.5, 0.6, 'Test', color='blue', 
        bbox=dict(facecolor='none', edgecolor='blue', pad=10.0))

ax.text(0.5, 0.4, 'Test', color='green', 
        bbox=dict(facecolor='none', edgecolor='green', boxstyle='round'))

ax.text(0.5, 0.2, 'Test', color='black', 
        bbox=dict(facecolor='none', edgecolor='black', boxstyle='round,pad=1'))

plt.show()

enter image description here

Die letzten beiden sind "Fancy" -Box-Patches, daher wird die Polsterung usw. anders eingestellt. (Was für einfache Dinge wie das Auffüllen ziemlich ärgerlich ist, obwohl es die Implementierung hinter den Kulissen einfacher macht.)

Wenn Sie Dinge in Ihrem Plot kennzeichnen, werden Sie wahrscheinlich feststellen, dass annotate eine bessere Wahl ist. Unter anderem können Sie Ihren Text an einer Stelle in Punkten von einer bestimmten Datenposition aus platzieren.

70
Joe Kington

enter image description here Irgendwo online gibt es eine Dokumentation (die beste, die ich schnell finden kann, ist http://matplotlib.org/users/annotations_guide.html ) für die Verwendung von VPacker und einem AnnotationBbox um mehrere Texte mit unterschiedlichen Schrifteigenschaften zusammenzustellen.

from matplotlib.offsetbox import TextArea, VPacker, AnnotationBbox
from pylab import *
fig = figure(1)
ax = gca()
texts = ['alpha','beta','epsilon']
colors = ['red','cyan','black']
Texts = []
for t,c in Zip(texts,colors):
    Texts.append(TextArea(t,textprops=dict(color=c)))
texts_vbox = VPacker(children=Texts,pad=0,sep=0)
ann = AnnotationBbox(texts_vbox,(.02,.5),xycoords=ax.transAxes,
                            box_alignment=(0,.5),bboxprops = 
                            dict(facecolor='wheat',boxstyle='round',color='black'))
ann.set_figure(fig)
fig.artists.append(ann)

Ich bin nicht sicher, warum die beiden letzten Zeilen benötigt werden. Ich würde denken, der vorletzte würde ausreichen.

12
esmit

Eine Lösung könnte darin bestehen, die Begrenzungsbox aus den Textobjekten zu erkunden und selbst eine Box zu generieren. Es ist nicht sehr praktisch. Vielleicht kann mein Beispiel verbessert werden, Transformationen verwirren mich immer ein bisschen.

import matplotlib.patches as patches
import matplotlib.pyplot as plt

fig, axs = plt.subplots(1,1)

t1 = axs.text(0.4,0.6, 'Hello world line 1', ha='center', color='red', weight='bold', transform=axs.transAxes)
t2 = axs.text(0.5,0.5, 'Hello world line 2', ha='center', color='green', weight='bold', transform=axs.transAxes)
t3 = axs.text(0.6,0.4, 'Hello world line 3', ha='center', color='blue', weight='bold', transform=axs.transAxes)

fig.canvas.draw()

textobjs = [t1,t2,t3]

xmin = min([t.get_window_extent().xmin for t in textobjs])
xmax = max([t.get_window_extent().xmax for t in textobjs])
ymin = min([t.get_window_extent().ymin for t in textobjs])
ymax = max([t.get_window_extent().ymax for t in textobjs])

xmin, ymin = fig.transFigure.inverted().transform((xmin, ymin))
xmax, ymax = fig.transFigure.inverted().transform((xmax, ymax))

rect = patches.Rectangle((xmin,ymin),xmax-xmin,ymax-ymin, facecolor='grey', alpha=0.2, transform=fig.transFigure)

axs.add_patch(rect)

Möglicherweise möchten Sie einen kleinen Puffer usw. hinzufügen, aber die Idee bleibt gleich.

enter image description here

9
Rutger Kassies