Matplotlib:如何在文本中“途中”更改字体大小

3
我知道这个问题,它讨论了如何在matplotlib中“全局”更改字体大小。我的使用情况略有不同:我希望输出结果类似于:

数组1 (元素数量:100)

数组2 (元素数量:250)

所以一个最小工作示例(MWE)如下:

import numpy as np
from matplotlib import pyplot as plt

a = np.random.rand(100)
b = np.random.rand(250)
plt.hist(a, bins=100, label='Array 1 (number of elements: {})'.format(a.shape[0]))
plt.hist(b, bins=100, label='Array 2 (number of elements: {})'.format(b.shape[0]))
plt.legend()
plt.show()
plt.close()

如何在 matplotlib 中仅“局部”更改字体大小?
编辑:如果输出看起来令人困惑,那是因为小字体部分不应该大写或小写,而应该变小。

2
使用LaTeX语法和上标,text $^\mathrm{small text}$ - Andras Deak -- Слава Україні
@AndrasDeak 这对我不起作用,因为我使用字符串格式化,而且我收到了错误消息“字段名称中有意外的 '{'”。 - Hermi
2
通常情况下,您必须转义大括号。rf'text $^\mathrm{{{a.shape[0]}}}$'。一对大括号是一个字面上的大括号,第三个用于格式。 - Andras Deak -- Слава Україні
1个回答

2
我怀疑你不能直接使用matplotlib来在标签中间更改字体大小,但是你可以使用LaTeX语法来添加上标,就像这样:

import numpy as np
from matplotlib import pyplot as plt

a = np.random.rand(100)
b = np.random.rand(250)
plt.hist(a, bins=100, label=r'Array 1 $^\mathrm{{(number of elements:\ {})}}$'.format(a.shape[0]))
plt.hist(b, bins=100, label=r'Array 1 $^\mathrm{{(number of elements:\ {})}}$'.format(b.shape[0]))
plt.legend()
plt.show()

请注意,在格式化字符串中需要使用双花括号来获取一个文字花括号,以及在数学模式下需要添加的'\ '。(如果您使用LaTeX渲染,则字体可能会因此而有所不同:\mathrm{}会给您一个衬线字体。您可以尝试使用\mathsf{}来代替无衬线字体,或者将整个标签文本放入数学模式中,并使用\mathrm{}来获得一致的外观。这似乎并不重要默认渲染引擎。)

如果您不想偏移小文本的基线,可以使用LaTeX大小规范符,例如\scriptsize\footnotesize\tiny等(在数学模式下,您需要使用\scriptstyle\scriptscriptstyle,根据tex.SE上的这个答案)。您需要启用LaTeX渲染才能使其生效,这将影响您随后的所有图像:

# enable TeX rendering for all subsequent figures
plt.rc('text', usetex=True)

plt.hist(a, bins=100, label=r'Array 1 \footnotesize (number of elements: {})'.format(a.shape[0]))
plt.hist(b, bins=100, label=r'Array 2 \scriptsize (number of elements: {})'.format(b.shape[0]))
plt.legend()
plt.show()

以上两个选项中,\scriptsize 可能是您要寻找的。

two demo histograms with footnotesized and scriptsized labels

一些与您问题无关的附注:
  1. 对于一维数组,请使用 a.size 而不是 a.shape[0]
  2. 考虑使用 f-strings(在 Python 3.6 中添加),它们通常可以使代码更易读:rf"数组 2 \scriptsize(元素个数:{b.size})"

有趣的是,根据您提出问题的方式,预期结果看起来可能会有所不同:this is from desktopthis is mobile。后者似乎需要上标。

抱歉,我的回答的第二部分实际上并不起作用。我已经将其删除了。 - Andras Deak -- Слава Україні
啊,真遗憾。我刚试了一下你的评论,如果我可以这么说的话,它和 ^ 不太搭配。但是如果你发现没有 ^ 的其他方法(例如你成功运行了 \fontsize 等命令),我很想知道。 - Hermi
@Hermi 这是你的问题在移动设备上的样子(这也是我第一次看到它的地方,所以我只留了一个评论):https://i.stack.imgur.com/YGPga.jpg 。它看起来就像上标版本 :) 我找到了一种设置字体大小的方法,但实话说它看起来并没有好多少。我会很快更新我的回答。 - Andras Deak -- Слава Україні
@Hermi 删掉那个,我们不需要数学模式也能正常工作,结果看起来不错。答案已更新。 - Andras Deak -- Слава Україні

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接