Matplotlib和LaTeX:指定与非指定轴刻度的一致默认字体

时间:2016-04-01 15:15:12

标签: python matplotlib latex

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

此外,由于我认为这可能是同一情况下某人更常见的查询,因此最好知道如何设置两组刻度标签以匹配Plot 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}')

enter image description here

1 个答案:

答案 0 :(得分:0)

首先,使用这样的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}')

example output

比较

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隐式执行),则不会添加额外的标记,并且标签列表的内容只会传递给{{ 1}}用于绘制刻度标签的实例。

TL; DR

  • 除非您要排版文字,否则请使用Text,使用set_xticklabels并让默认set_xticks'做正确的事情&#39 ;
  • 做自己的LaTeX标记