Matplotlib PDF绘图不响应figsize参数

7
我希望如下代码可以调整子图的大小,使得生成的PDF文档宽度为5英寸,高度为8英寸。但是无论我在figsize里输入什么,生成的文件总是8英寸宽,6英寸高。我做错了什么?
import matplotlib.pyplot as plt
import matplotlib.gridspec as gs

fig = plt.Figure(figsize=(5,8))
fig.set_canvas(plt.gcf().canvas)

gs1 = gs.GridSpec(3,2)
gs1.update(wspace=0.4,hspace=0.4)
ax1 = plt.subplot(gs1[0,0])
ax2 = plt.subplot(gs1[0,1])
ax3 = plt.subplot(gs1[1,0])
ax4 = plt.subplot(gs1[1,1])
ax5 = plt.subplot(gs1[2,:])

ax1.plot([1,2,3],[4,5,6], 'k-')

fig.savefig("foo.pdf", format='pdf')

抱歉——编辑添加一句话,我也尝试过fig.set_size_inches((5,8)),但似乎没有任何效果。


2
尝试 fig = plt.figure() - tacaswell
仅仅是对@tcaswell所说的深入解释一下,plt.figureplt.Figure之间有所不同。plt.Figure发生在pyplot命名空间内,但它是“原始”的类。你当然可以单独初始化它(你还需要初始化一个FigureCanvas才能让任何东西工作),但图像不会被添加到pyplot状态机中。plt.figure是一个创建链接FigureFigureCanvas实例并将它们添加到pyplot图形管理器的工厂函数。如果你想使用plt.*方法,你必须使用plt.figure - Joe Kington
1
所发生的情况是 fig = plt.Figure(...) 创建了一个新的图形实例,但它没有添加到 pyplot 状态机中。因此,当您调用 plt.subplot 时,没有“当前”图形,因此在幕后创建了 另一个 图形。(这是使用 figure 方法直接的另一个原因:例如 fig.add_subplot 而不是 plt.subplot) - Joe Kington
1
@JoeKington 啊,那很有道理。我一直在想为什么a)没有设置画布的情况下它还能工作,并且b)给定一个大小它为什么会忽略它。 - tacaswell
@tcaswell - 是的,我应该说“当你在set_canvas内调用plt.gcf()”而不是“当你调用plt.subplot”时。显然,两个图形对象可以共享同一个画布...或者至少在这里是这样。 - Joe Kington
运行得非常好。谢谢大家。 :-) 还要感谢你们对底层发生的事情进行了有用的解释。 - nivek
1个回答

4
你可能会更方便地使用 matplotlib.pyplot.figure
尝试使用以下代码在创建图形后配置图形宽度:
fig = plt.figure()
fig.set_figheight(5)
fig.set_figwidth(8)

我可能把尺寸弄反了,但这对我有用。下面是一个完整的例子,从matplotlib文档中抄袭并修改了图形大小。在figure()调用中使用figsize参数也可以实现这个效果。
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
fig.set_figheight(10)
fig.set_figwidth(12)
ax = fig.gca(projection='3d')
X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm,
        linewidth=0, antialiased=False)
ax.set_zlim(-1.01, 1.01)

ax.zaxis.set_major_locator(LinearLocator(10))
ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))

fig.colorbar(surf, shrink=0.5, aspect=5)
fig.savefig("myfig.png", dpi=600) # useful for hi-res graphics
plt.show()

谢谢!我选择这个作为答案,但是对于未来的谷歌搜索者,请务必查看@tcaswell和@JoeKington上面的讨论和解释---因为我调用了Figure()(类),而我应该使用figure()(工厂函数)... - nivek
谁会想到呢。去算了! - holdenweb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接