保存图形后无法打开 eps 文件

Cannot open eps file after saving figure

通常情况下,打开 eps 文件没有问题,但使用我正在处理的 Python 中的当前代码,导出的 eps 文件在打开时加载但从未出现。我试过将相同的图形导出为 png 并且效果很好。我也尝试过将一个非常简单的图形导出为 eps 并且打开时没有任何缺陷。我已经包含了一些关于 plot/figure 的相关代码。任何帮助将不胜感激。

    #%% plot section

    plt.close('all')

    plt.figure()

    plt.errorbar(r,omega,yerr=omega_err,fmt='mo')
    plt.xlabel('xlabel')
    plt.ylabel('ylabel')
    plt.title('profile averaged from {} ms to {} ms \n shot {}'.format(tidsinterval[0],tidsinterval[1],skud_numre[0]),y=1.05)
    plt.grid()
    plt.axhline(y=2.45,color='Red')
    plt.text(39,2.43,'txt block for horizontal line',backgroundcolor='white')
    plt.axvline(x=37.5,color='Purple')
    plt.text(37.5,1.2,'txt block for vertical line',ha='center',va="center",rotation='vertical',backgroundcolor='white')
    plt.savefig('directory/plot.eps', format='eps')
    plt.show()

变量 r、omega、omega_err 是小尺寸浮点向量(可能为 6)。

更新:我用来打开eps文件的程序是Evince,另外,可以在这里下载eps文件https://filedropper.com/d/s/z7lxUCtANeox7tDMQ6dI6HZUpcTfHn。据我所知,通过社区指南通过 filedropper 共享文件很好,但如果我错了请指出。 发现只要绘图中不包含文本(例如x-label,y-label,title等)就可以打开文件,所以问题必须与文本有关。

简短的回答是,这是您的字体。 /e 字形在 setcachedevice 上引发错误(您的 PostScript 解释器应该已经告诉您了)。

实际问题是字体程序(至少)粗心地使用了函数名称。该程序包含以下内容:

/mpldict 11 dict def
mpldict begin
/d { bind def } bind def

这将创建一个名为 mpldict 的新字典,开始该字典(使其成为字典堆栈中最顶层的条目)并在该字典中定义一个名为 'd' 的函数

然后我们继续字体定义,这里有很多样板,但每个字符形状都是由字体的 CharStrings 字典中的一个条目定义的,我们将通过函数的定义来选择它在字体的 CharStrings 字典中称为 'd'。

/d{1300 0 113 -29 1114 1556 sc
930 950 m
930 1556 l
ce} d
(2.60) == flush
/e{1260 0 113 -29 1151 1147 sc
1151 606 m
1151 516 l
305 516 l
313 389 351 293 419 226 c
488 160 583 127 705 127 c
776 127 844 136 910 153 c
977 170 1043 196 1108 231 c
1108 57 l
1042 29 974 8 905 -7 c
836 -22 765 -29 694 -29 c
515 -29 374 23 269 127 c
165 231 113 372 113 549 c
113 732 162 878 261 985 c
360 1093 494 1147 662 1147 c
813 1147 932 1098 1019 1001 c
1107 904 1151 773 1151 606 c

967 660 m
966 761 937 841 882 901 c
827 961 755 991 664 991 c
561 991 479 962 417 904 c
356 846 320 764 311 659 c
967 660 l

ce} d

请注意,这样做是在当前字典中创建一个名为 'd' 的函数的新定义。这本身不是问题。我们现在有两个名为 'd' 的函数;一个在当前字典(字体的 CharStrings 字典)中,一个在 'mpldict'.

然后我们定义下一个字符:

/e{1260 0 113 -29 1151 1147 sc
1151 606 m
1151 516 l
305 516 l
313 389 351 293 419 226 c
488 160 583 127 705 127 c
776 127 844 136 910 153 c
977 170 1043 196 1108 231 c
1108 57 l
1042 29 974 8 905 -7 c
836 -22 765 -29 694 -29 c
515 -29 374 23 269 127 c
165 231 113 372 113 549 c
113 732 162 878 261 985 c
360 1093 494 1147 662 1147 c
813 1147 932 1098 1019 1001 c
1107 904 1151 773 1151 606 c

967 660 m
966 761 937 841 882 901 c
827 961 755 991 664 991 c
561 991 479 962 417 904 c
356 846 320 764 311 659 c
967 660 l

ce} d

现在,我们在定义字符形状(对于名为 'e' 的字符)结束时所做的最后一件事是调用一个名为 'd' 的函数。但是有两个,我们称之为哪个?答案是我们在字典堆栈中向后工作,查找每个字典,看看它是否有一个名为 'd' 的函数,然后我们使用我们找到的第一个。当前字典是字体的 CharStrings 字典,它有一个名为 'd' 的函数(它定义了 'd' 字符)所以我们称之为

然后该函数尝试使用 setcachedevice。该运算符是不合法的,除非在执行我们没有执行的字符描述时,因此它会抛出未定义的错误。

现在您的 PostScript 解释器应该会告诉您有错误(例如,Ghostscript 会告诉您)。因为有一个错误,解释器停止并且不再绘制任何东西,这就是为什么你得到一个空白页。

对此你能做什么?好吧,您可以通过创建应用程序提出错误报告(显然 Matplotlib 也创建了字体)。这不是定义字体的好方法!

除此之外,坦率地说,您唯一可以做的就是搜索和替换文件。如果您查找出现的 ce} d 并将它们替换为 ce}bind def 它可能会起作用。这次