我找不到关于这个主题的另一个线程或文档 - 有没有人成功地在 pythons matplotlib 包中下划线?对于所有其他属性,我使用的语法是这样的:
plt.text(0.05, 0.90, 'Parameters: ', fontsize=12)
但是,除了实际将一行编码到文件中之外,我无法弄清楚如何在该文本下划线。
想法?
我找不到关于这个主题的另一个线程或文档 - 有没有人成功地在 pythons matplotlib 包中下划线?对于所有其他属性,我使用的语法是这样的:
plt.text(0.05, 0.90, 'Parameters: ', fontsize=12)
但是,除了实际将一行编码到文件中之外,我无法弄清楚如何在该文本下划线。
想法?
Matplotlib 可以使用 LaTeX 处理所有文本,有关更多信息,请参阅文档的此页面。在 LaTeX 中为文本加下划线的命令很简单\underline
。从示例脚本之一的文档字符串中:
rc
如果设置了参数 text.usetex ,您可以使用 TeX 渲染所有 matplotlib 文本。这目前适用于后端agg
和ps
后端,并且要求您在系统上正确安装http://matplotlib.sf.net/matplotlib.texmanager.html中描述的 tex 和其他依赖项。第一次运行脚本时,您会看到 tex 和相关工具的大量输出。下一次,运行可能会静默,因为很多信息都缓存在 ~/.tex.cache 中
所以作为一个简单的例子,我们可以做
import matplotlib.pyplot as plt
from matplotlib import rc
rc('text', usetex=True)
plt.sunplot(111)
plt.text(0.05, 0.90, r'\underline{Parameters}: ', fontsize=12)
获取带下划线的文本。
这是一个老问题,但我实际上需要为不使用 LaTeX 的文本添加下划线,所以我想我会跟进我提出的解决方案,以供可能遇到相同问题的其他人使用。
最终,我的解决方案为有问题的文本对象找到了一个边界框,然后在注释命令中使用 arrowprop 参数,以便在文本下方绘制一条直线。这种方法有一些注意事项,但总的来说我觉得它非常灵活,因为你可以根据需要自定义下划线。
我的解决方案示例如下:
import matplotlib.pyplot as plt
import numpy as np
def test_plot():
f = plt.figure()
ax = plt.gca()
ax.plot(np.sin(np.linspace(0,2*np.pi,100)))
text1 = ax.annotate("sin(x)", xy=(.7,.7), xycoords="axes fraction")
underline_annotation(text1)
text2 = ax.annotate("sin(x)", xy=(.7,.6), xycoords="axes fraction",
fontsize=15, ha="center")
underline_annotation(text2)
plt.show()
def underline_annotation(text):
f = plt.gcf()
ax = plt.gca()
tb = text.get_tightbbox(f.canvas.get_renderer()).transformed(f.transFigure.inverted())
# text isn't drawn immediately and must be
# given a renderer if one isn't cached.
# tightbbox return units are in
# 'figure pixels', transformed
# to 'figure fraction'.
ax.annotate('', xy=(tb.xmin,tb.y0), xytext=(tb.xmax,tb.y0),
xycoords="figure fraction",
arrowprops=dict(arrowstyle="-", color='k'))
#uses an arrowprops to draw a straightline anywhere on the axis.
这会产生一个带下划线的带注释的 sin 示例。
需要注意的一件事是,如果您想填充下划线或控制线条粗细(请注意,两个注释的线条粗细相同)您必须在“underline_annotation”命令中手动完成,但这是通过arrowprops dict传递更多参数或增加绘制线条的位置很容易做到。