【问题标题】:Underlining Text in Python/MatplotlibPython/Matplotlib 中的文本下划线
【发布时间】:2012-05-30 10:33:05
【问题描述】:

我找不到关于这个主题的另一个线程或文档 - 有没有人成功地在 pythons matplotlib 包中下划线?对于所有其他属性,我使用的语法是这样的:

plt.text(0.05, 0.90, 'Parameters: ', fontsize=12)

但是,除了在文件中实际编写一行代码之外,我不知道如何为该文本添加下划线。

想法?

【问题讨论】:

    标签: python matplotlib underline


    【解决方案1】:

    Matplotlib 可以使用 LaTeX 处理所有文本,请参阅文档的this page 了解更多信息。在 LaTeX 中加下划线的命令就是 \underline。来自示例脚本之一的文档字符串:

    如果设置了rc 参数 text.usetex,您可以使用 TeX 渲染所有 matplotlib 文本。这目前适用于 aggps 后端,并要求您在系统上正确安装 tex 和 http://matplotlib.sf.net/matplotlib.texmanager.html 中描述的其他依赖项。第一次运行脚本时,您会看到 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)
    

    获取带下划线的文本。

    【讨论】:

    • 嗨,克里斯,优雅的解决方案。我能够以这种方式获得下划线,但将 usetex 更改为 True 也会影响图中的其余文本(例如,图轴上的编号变为衬线,其他粗体文本变为非粗体。)我想我会也必须将所有这些都更改为 tex 格式,对吗?
    • 通常我可以在没有rc 业务的情况下使用 LaTeX 命令(我认为这会导致所有其他文本的呈现方式不同)。但是,我似乎在我的 Windows 机器上需要它(通常我在 Linux 机器上工作,不确定这是否是一个问题)。不用那条线试一试,看看plt.text 调用是否仍然有效。
    • 我发现只要不使用plt.text,即plt.xlabelplt.title等,我可以使用LaTeX命令无需调用rc . 工作正常。似乎只是plt.text 需要我配置rc。如果您发现需要使用rc,您还可以配置您要使用的字体等。
    • 是的,我也观察到了。感谢您的帮助!
    【解决方案2】:

    这是一个老问题,但我实际上需要为不使用 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.
    

    这会产生一个underlined annotated sin example

    需要注意的一点是,如果您想填充下划线或控制线条粗细(请注意,两种注释的线条粗细相同)您必须在“underline_annotation”命令中手动完成,但这很容易通过arrowprops dict传递更多参数或增加绘制线条的位置来实现。

    【讨论】:

      猜你喜欢
      • 2018-02-11
      • 2014-04-12
      • 2013-08-22
      • 1970-01-01
      • 2014-04-29
      • 1970-01-01
      • 2011-02-07
      • 2012-10-18
      • 2010-10-28
      相关资源
      最近更新 更多