【问题标题】:Giving graphs a subtitle in matplotlib在 matplotlib 中为图形添加字幕
【发布时间】:2010-11-26 04:25:03
【问题描述】:

我想给我的图表一个 18pt 大字体的标题,然后在它下面一个小 10pt 字体的副标题。如何在 matplotlib 中执行此操作?看来title() 函数只接受一个带有单个fontsize 属性的字符串。必须有办法做到这一点,但怎么做呢?

【问题讨论】:

  • subtitle 问题的最短答案是:有一个内置的suptitle() 函数。因此,组合suptitle()/title() 类似于更直观地命名为title()/subtitle()。请参阅下面 Floris van Vugt 的回答和 Tim Misner 的后续跟进。

标签: matplotlib


【解决方案1】:

我所做的是对副标题使用 title() 函数,对主标题使用 suptitle() (它们可以采用不同的字体大小参数)。希望对您有所帮助!

【讨论】:

  • 至少在标准极坐标图上,标题、副标题和 90 度标记都重叠,尤其是在您使用较大字体时。
  • 其中一个问题是 titlesuptitle 的中心不同,因此它们可能无法与您的绘图对齐。
  • 这是一个不错的技巧,但如果您的图形有多个轴,则无法使用。
  • 有关这方面的实际示例,请参阅this other answer here
【解决方案2】:

虽然这不会为您提供与多种字体大小相关的灵活性,但在 pyplot.title() 字符串中添加换行符可能是一个简单的解决方案;

plt.title('Really Important Plot\nThis is why it is important')

【讨论】:

  • 大多数时候,您希望标题和副标题之间有一些风格上的差异。否则,它看起来就像一个草率的标题,分成两行。
  • 我可以加个“字幕”吗?
【解决方案3】:

这是一个实现 Floris van Vugt 的回答(2010 年 12 月 20 日)的 pandas 代码示例。他说:

>我所做的是对副标题使用 title() 函数,对 >main 标题使用 suptitle() 函数(它们可以采用不同的字体大小参数)。希望对您有所帮助!

import pandas as pd
import matplotlib.pyplot as plt

d = {'series a' : pd.Series([1., 2., 3.], index=['a', 'b', 'c']),
      'series b' : pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)

title_string = "This is the title"
subtitle_string = "This is the subtitle"

plt.figure()
df.plot(kind='bar')
plt.suptitle(title_string, y=1.05, fontsize=18)
plt.title(subtitle_string, fontsize=10)

注意:我无法评论该答案,因为我是 stackoverflow 的新手。

【讨论】:

  • 如果你有两个子图怎么办?如果我在带有两个子图的图表中调用subtitle_string=('Upper panel: Max, Avg, Min, Footprint % | Lower panel: Footprint % and Critical Cells %') 然后plt.suptitle(title_string, y=0.99, fontsize=17),则字幕会打印在第二个子图而不是第一个子图上方,并且我看不到打印的图例。
【解决方案4】:

我认为没有任何内置功能,但您可以通过在轴上方留出更多空间并使用figtext

axes([.1,.1,.8,.7])
figtext(.5,.9,'Foo Bar', fontsize=18, ha='center')
figtext(.5,.85,'Lorem ipsum dolor sit amet, consectetur adipiscing elit',fontsize=10,ha='center')

hahorizontalalignment 的缩写。

【讨论】:

  • 从答案中不清楚,axes 正在被调用。 figtext的出处也只能通过链接找到。此外,答案可能已经过时。是否可以将答案更新到最新版本的 Matplotlib?
【解决方案5】:

对我有用的解决方案是:

  • 使用suptitle() 作为实际标题
  • 使用title()作为字幕并使用可选参数y进行调整:
    import matplotlib.pyplot as plt
    """
            some code here
    """
    plt.title('My subtitle',fontsize=16)
    plt.suptitle('My title',fontsize=24, y=1)
    plt.show()

两段文字之间可能会有一些令人讨厌的重叠。您可以通过摆弄y 的值来解决此问题,直到您正确为止。

【讨论】:

  • 该示例当前使用y 参数显示字幕,而不是解释文本中的标题...
【解决方案6】:

只需使用 TeX !这有效:

title(r"""\Huge{Big title !} \newline \tiny{Small subtitle !}""")

编辑:要启用 TeX 处理,您需要在 matplotlib 参数中添加“usetex = True”行:

fig_size = [12.,7.5]
params = {'axes.labelsize': 8,
      'text.fontsize':   6,
      'legend.fontsize': 7,
      'xtick.labelsize': 6,
      'ytick.labelsize': 6,
      'text.usetex': True,       # <-- There 
      'figure.figsize': fig_size,
      }
rcParams.update(params)

我猜你还需要在你的计算机上运行 TeX 发行版。所有详细信息都在此页面上提供:

http://matplotlib.org/users/usetex.html

【讨论】:

  • 听起来很有趣,但是您是否为 matplotlib 设置了任何其他标志以启用 tex 模式?使用默认设置的 1.4.1 不适用于您的示例。顺便说一句,在标题中使用 r"$ expr $" 绘制数学。
【解决方案7】:

here 所述,你可以使用matplotlib.pyplot.text 对象来达到相同的结果:

plt.text(x=0.5, y=0.94, s="My title 1", fontsize=18, ha="center", transform=fig.transFigure)
plt.text(x=0.5, y=0.88, s= "My title 2 in different size", fontsize=12, ha="center", transform=fig.transFigure)
plt.subplots_adjust(top=0.8, wspace=0.3)

【讨论】:

  • 你能展示一下这是什么样子的截图吗?
  • @GabrielStaples 你只需要点击链接 ;-)
猜你喜欢
  • 2019-04-07
  • 1970-01-01
  • 1970-01-01
  • 2012-01-05
  • 2013-10-11
相关资源
最近更新 更多