matplotlib 文本 bbox 的侧边特定填充
问题描述
在 matplotlib 中添加文本时,是否可以在 bbox 的特定一侧指定填充?我正在添加一个 LaTex 表格作为文本,由于某种原因,表格自然未对齐,没有填充规范.我想说明这一点,以便在 bbox 顶部添加填充.
Is it possible to specify the padding on a specific side of the bbox when adding text in matplotlib? I'm adding a LaTex table as text and for some reason the table is misaligned naturally with no padding specifications. I'd like to account for this for adding padding on the top of the bbox.
不幸的是,似乎没有向 bbox 的特定侧添加填充的选项.这可能吗?
Unfortunately, there doesn't seem to be an option for adding padding to a specific side of a bbox. Is this possible?
这里有一个例子来说明:
Here's an example to illustrate:
import matplotlib
matplotlib.rc('text',usetex=True)
import matplotlib.pyplot as plt
import numpy as np
text = '\begin{tabular}{|c|c|}\hline 1 & 2 \\ \hline 3 & 4 \\ \hline \end{tabular}'
plt.imshow(np.zeros((10,10)), cmap=plt.cm.gray)
plt.text( 4.5,
4.5,
text,
fontsize=24,
bbox=dict(fc='w',boxstyle='square,pad=0.5'), va='center', ha='center')
plt.axis('off')
plt.show()
解决方案
我找到了一个基于建议的答案的解决方法在这篇文章中.一个更简单的解决方案也将不胜感激.我还应该说,垂直错位似乎只有在我设置 usetex: True
时才会发生.
I've found a workaround which is based on the answer suggested in this post. An easier solution would also be appreciated. I should also say that the vertical misalignment seems to happen only when I set usetex: True
.
这是上面的修改版本:
import matplotlib
matplotlib.rc('text',usetex=True)
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
import numpy as np
text = '\begin{tabular}{|c|c|}\hline1&2\\\hline3&4\\\hline\end{tabular}'
fig, ax = plt.subplots(1)
img = ax.imshow(np.zeros((10,10)), cmap=plt.cm.gray)
txt = ax.text( 4.5,
4.5,
text,
fontsize=24,
ha='center',
va='center',
bbox=dict(alpha=0))
fig.canvas.draw()
bbox = txt.get_bbox_patch()
xmin = bbox.get_window_extent().xmin
xmax = bbox.get_window_extent().xmax
ymin = bbox.get_window_extent().ymin
ymax = bbox.get_window_extent().ymax
xmin, ymin = fig.transFigure.inverted().transform((xmin, ymin))
xmax, ymax = fig.transFigure.inverted().transform((xmax, ymax))
dx = xmax-xmin
dy = ymax-ymin
# The bounding box vals can be tweaked manually here.
rect = Rectangle((xmin-0.02,ymin-0.01), dx+0.04, dy+0.05, fc='w', transform=fig.transFigure)
ax.add_patch(rect)
fig.canvas.draw()
ax.axis('off')
plt.savefig('ok.png',bbox_inches='tight')
这会产生:
相关文章