Matplotlib:从Type 3 Font更改为Type 1 Font后,.pdf中的非均匀字体

时间:2017-06-01 18:11:53

标签: python matplotlib

我被要求将我的论文中的一些数字从使用Type 3 Font更改为使用Type 1 Font,我找到了instruction 做好工作。

通过添加以下3行,我能够生成Type 1 Font .pdf文件:

matplotlib.rcParams['ps.useafm'] = True
matplotlib.rcParams['pdf.use14corefonts'] = True
matplotlib.rcParams['text.usetex'] = True

然而,虽然我的旧情节上的x-tick和y-tick的字体是统一的,但是在我添加了3行代码后,它们的字体在某种程度上变得不同了。这对我来说似乎很奇怪,因为更改仅应用于其中一个刻度。

enter image description here

这是python中的脚本:

import matplotlib
matplotlib.use('PDF')
import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages


# Switch to Type 1 Fonts. 
matplotlib.rcParams['ps.useafm'] = True
matplotlib.rcParams['pdf.use14corefonts'] = True
matplotlib.rcParams['text.usetex'] = True


def plot_pdf_figure(path, title, xl, yl, xt_list, yl_list, style_list):
    fig = plt.figure(path) 

    ax = fig.add_subplot(111)
    ax.set_title(title)
    ax.set_xlabel(xl, style='italic')
    ax.set_ylabel(yl)

    x_list = range(0, len(xt_list))
    plt.xticks(x_list, xt_list)
    for y_list, style in zip(yl_list, style_list):
        ax.plot(x_list, y_list, style)

    pp = PdfPages(path)
    pp.savefig(fig)
    pp.close()



plot_pdf_figure("test_plot.pdf", "test", "x-axis", "y-axis", [1,2,3,4,5,6], [[1,2,4,8,16,32],[32,16,8,4,2,1]], ["-ro","-gs"])

感谢您提供任何指导或帮助!

1 个答案:

答案 0 :(得分:3)

这是plt.xticks来电的结果。

rcParams['text.usetex']True时,MPL会在$中包含标记。例如,ax.get_xticklabels()[0].get_text()u'0'usetex时为False,在u'$0$'usetex时为True

但是,当你覆盖默认的tick标签时,你必须自己包装它们,否则你会得到sans-serif字体。所以,要解决此问题,我会将您的plt.xticks行更改为:

 plt.xticks(x_list, ['$' + str(xt) + '$' for xt in xt_list])

这里我使用列表推导来循环遍历ticklabels。我想也可以将默认的sans-serif字体系列更改为与serif系列相同的(serif)字体,但我认为这可能无法完全解决x和y标签之间的差异,因为字符串是实际上是不同的。