【问题标题】:Matplotlib and LaTeX: Consistent default font in specified vs. non-specified axis ticksMatplotlib 和 LaTeX:指定与非指定轴刻度中的默认字体一致
【发布时间】:2016-04-01 15:15:12
【问题描述】:

我正在使用 Python 2.7、Matplotlib 1.5.1,并尝试使用 LaTeX 进行所有文本渲染。我正在尝试使绘图 1 的轴刻度标签的字体与绘图 2 中的字体相匹配。出于某种原因,由于我没有在绘图 1 中明确设置刻度标签,因此它们保持默认的 LaTeX 字体。我希望所有刻度标签,无论它们是否被明确设置,都与情节 2 中的字体相匹配。虽然知道如何将两组刻度标签字体更改为第 3 种一致的字体会很有用,但我更感兴趣知道如何将 Plot 1 的刻度字体设置为下面 Plot 2 中显示的确切字体。

此外,由于我认为这可能是来自处于相同情况的某人的更常见查询,因此最好知道如何设置两组刻度标签以匹配情节 1 中的那些。

from matplotlib import pyplot as plt
plt.rc('text', usetex=True)

my_fig = plt.figure(figsize=(8,4))

x = range(10)
y = range(10)

ax1 = my_fig.add_subplot(1, 2, 1)
ax1.plot(x, y)
ax1.set_title('Plot 1')

ax2 = my_fig.add_subplot(1, 2, 2)
ax2.plot(x, y)
ax2.set_xticklabels(range(10))
ax2.set_yticklabels(range(10))
ax2.set_title(r'\textit{Plot 2}')

【问题讨论】:

  • 忽略我的(现已删除的)cmets,进行排序。

标签: python matplotlib latex


【解决方案1】:

首先,像这样使用set_yticklabels 是危险的,因为定位器仍然是自动定位器(根据数据范围自动放置刻度)但标签来自FixedFormatter,这意味着第一个刻度总是用第一个标记序列中的位置,将您的刻度标签与数据解耦

from matplotlib import pyplot as plt
import matplotlib.ticker as mticker
plt.rc('text', usetex=True)

my_fig = plt.figure(figsize=(8,4))

x = range(10)
y = range(10)

ax1 = my_fig.add_subplot(1, 2, 1)
ax1.plot(x, y)
ax1.set_title('Plot 1')

ax2 = my_fig.add_subplot(1, 2, 2)
ax2.plot(x, y)
# just being very explicit about what `set_xticks` and `set_xticklabels`
# is doing
ax2.xaxis.set_major_locator(mticker.FixedLocator(range(10)))
ax2.yaxis.set_major_locator(mticker.FixedLocator(range(10)))
ax2.yaxis.set_major_formatter(mticker.FixedFormatter(range(10)))
ax2.xaxis.set_major_formatter(mticker.FixedFormatter(
    ['${}$'.format(_) for _ in range(10)]))

ax2.set_title(r'\textit{Plot 2}')

比较:

In [157]: ax2.xaxis.get_ticklabels()[1]
Out[157]: Text(1,0,'$1$')

In [158]: ax2.yaxis.get_ticklabels()[1]
Out[158]: Text(0,1,'1')

In [159]: ax1.yaxis.get_ticklabels()[1]
Out[159]: Text(0,0,'$0$')

在右侧 x 轴和左侧两个轴的情况下,数字在数学模式下排版。在左边的例子中,LaTeX 标记由ScalarFormatter(默认格式化程序)添加。如果你使用了FixedFormatter(我在这里明确做了,OP 代码是通过sex_xticklabels 隐式执行的),则不会添加额外的标记,标签列表的内容只是传递给Text 实例,即用于绘制刻度标签。

TL;DR

  • 除非你想排版文本不要使用set_xticklabels,使用set_xticks并让默认的Formatter'做正确的事'
  • 自己做 LaTeX 标记

【讨论】:

  • 如何在不指定实际刻度和标签的情况下将绘图 1 中 y 轴刻度标签的字体设置为与绘图 2 中 y 轴刻度标签的字体相同?我希望 matplotlib 自动生成绘图 1 中的刻度和刻度标签,但要以当前用于绘图 2 中 y 轴标签的字体呈现它们。这样,当我混合子图时,我指定了刻度带有自动生成的标签,字体将匹配(我更喜欢图 2 中当前 y 轴的字体)。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-29
  • 1970-01-01
  • 2020-04-14
  • 2016-10-09
  • 1970-01-01
  • 2017-07-09
  • 1970-01-01
相关资源
最近更新 更多