Matplotlib保存为eps时忽略visibility=False

3 投票
1 回答
1477 浏览
提问于 2025-04-18 04:28

我想把一个流线图保存为EPS格式,然后用epstopdf转换成PDF格式,因为这样文件大小会小很多。

我使用了多个子图,它们共享同一个x轴和y轴。我还添加了一个总的子图,这样我可以方便地加上x轴和y轴的标签。我把框架设置为不显示,这样就不会出现框架。之后,我把这个轴的边框和刻度线都隐藏了。当图形显示出来时,我看不到大轴的任何东西。到目前为止,一切都很好。

问题出现在我保存图形的时候。保存为EPS格式后再转换成PDF时,刻度标签会出现,并且干扰到我的文字。直接去掉刻度标签也不行,因为这样会导致标签和我想要看到的图的刻度标签之间的间距不对。奇怪的是,直接保存为PDF格式就没有这个问题,但文件大小却大了11倍。

有没有人知道我哪里做错了,或者发生了什么事?

工作示例:

import matplotlib.pyplot as plt
import numpy as np
import subprocess

fig, ax = plt.subplots(2, 2, sharex=True, sharey=True)
ax = ax.flatten()
ax = np.append(ax, fig.add_subplot(1, 1, 1, frameon=False))
ax[-1].spines['top'].set_color('none')
ax[-1].spines['bottom'].set_color('none')
ax[-1].spines['left'].set_color('none')
ax[-1].spines['right'].set_color('none')
ax[-1].tick_params(
    labelcolor='none', top='off', bottom='off', left='off', right='off')
ax[-1].set_xlabel('$u$', fontsize=14)
ax[-1].set_ylabel('$v$', fontsize=14)
plt.setp(ax[-1].get_xticklabels(), visible=False)

fig.savefig('TestPdf.pdf')
fig.savefig('TestEps.eps')
subprocess.check_call(['epstopdf', 'TestEps.eps'])
plt.show()

1 个回答

1

你可以试试其他的后端。比如说,pgf 后端(在 matplotlib 1.3 及以上版本中可用)也可以生成 pdf 文件:

import matplotlib
matplotlib.use("pgf")

你可以通过以下方式获取可用的后端列表:

matplotlib.rcsetup.all_backends

你还可以检查某个后端是否支持 eps 或 pdf 格式:

import matplotlib
matplotlib.use("BACKEND")
import matplotlib.pyplot as plt
fig = plt.figure()
print fig.canvas.get_supported_filetypes()

撰写回答