在 matplotlib 中的文本周围加上框

如何在 matplotlib 中创建一个文本框? 我有三行不同颜色的文字:

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

我看了教程 http://matplotlib.org/users/recipes.html(最后一个例子) ,但我不能解决这个问题。 先谢谢你。

104905 次浏览

作为您链接到提到的示例,您可以使用 bbox kwarg来添加一个框。

我猜你对如何设置盒子的颜色等感到困惑,举个简单的例子:

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

最后两个是“ Fancy”bbox 补丁,所以填充等是以不同的方式设置的。(对于填充这样的简单事情来说,这是相当烦人的,尽管它使得幕后实现更加简单。)

同样,如果你在你的情节中标注事物,你可能会发现 annotate是一个更好的选择。在其他方面,它允许您将您的文本从一个特定的数据位置放置在一个偏离 分数

一个解决方案可以是从文本对象探索边界框并自己生成一个框。不太方便。也许我的例子可以改进,转换总是让我有点困惑。

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)

你可能想添加一个小缓冲区等,但想法将保持不变。

enter image description here

enter image description here 在网上的某个地方有一些文档(我能快速找到的最好的是 http://matplotlib.org/users/annotations_guide.html) ,可以使用 VPackerAnnotationBbox将不同字体属性的文本放在一起。

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)

我不确定为什么需要最后两行。我觉得倒数第二个就够了。