我正在使用matplotlib
,我希望能够创建一些动态脚注,能够包装和突出显示左对齐文本。
最简单的解决方案是确定一种可靠的方法,将字体大小比例转换为图形轴比例(例如,如果字体大小为8比30,则y轴上的空间占用多少文本占用空间)但我会更开心解决问题的方法。
我修改了this question中的一些代码,但它仍然需要在新行上突出显示文本,因此自动换行并不完全理想。
基本上它假设段落分为三类,并相应地格式化:
这段代码感觉非常弱,所以除了找到可以包装和突出显示文本的内容之外,我还会接受更清晰的解决方案。 **请注意,这仅适用于交互模式(例如ipython笔记本或类似),因为text.draw(fig.canvas.get_renderer())
不能从非交互式工作。
from matplotlib import transforms
from matplotlib import pyplot as plt
def parse_text_type(story, highlight_text, bold, num_tag, highlight_tag):
str_list = []
for x in story.split("___"):
if x == 'highlight':
str_list.append([highlight_text,highlight_tag])
elif x == 'bold':
str_list.append([bold,num_tag])
elif x != '':
str_list.append([x,"___background___"])
return str_list
def make_plot(parsed_story):
ax = plt.subplot(111)
plt.plot([0,0.5],[0,1],lw=0)
t = plt.gca().transData
fig = plt.gcf()
for i,x in enumerate(parsed_story):
if x[1] == '___background___':
text = plt.text(
-1, 1, x[0], ha='left', transform=t,
va='top', fontsize=18, color='#999999')
elif x[1] == '___highlight___':
text = plt.text(
-1, 1, x[0], ha='left', transform=t, weight='bold',
va='top', fontsize=18, color='#32618b'
)
elif x[1] == '___bold___':
text = plt.text(
-1, 1, x[0], ha='left', transform=t,
va='top', fontsize=100, color='#32618b', rasterized=None
)
text.draw(fig.canvas.get_renderer())
ex = text.get_window_extent()
t = transforms.offset_copy(text._transform, y=-ex.height - 5, units='dots')
plt.axis('off');
return fig, ax
def generate_wordplot(number, highlight_text, story):
num_tag = '___number___'
highlight_tag = '___highlight___'
story = story.format(number=num_tag, highlight=highlight_tag)
parsed_story = parse_text_type(story,highlight_text, number, num_tag, highlight_tag)
return make_plot(parsed_story)
if __name__ == '__main__':
bold = "99.9%"
highlight_text = "humans drink water"
story = "One survey found that {bold}of {highlight}"
fig, ax = generate_wordplot(bold, highlight_text, story)