2014-02-27 70 views
2

我想要下面的代碼來確定子圖的大小,使得生成的PDF寬5英寸,高8英寸。但不管我放在figsize位的文件是8英寸寬還是6英寸高。我究竟做錯了什麼?Matplotlib PDF圖不響應figsize

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)),這似乎並沒有產生任何影響無論是。

+1

嘗試'圖= plt.figure()' – tacaswell

+0

只是爲了什麼@tcaswell說細說了,有plt.figure'和'plt.Figure''之間的差異。 'plt.Figure'恰好在pyplot命名空間中,但它是「raw」類。你當然可以自行初始化它(你還需要初始化一個'FigureCanvas'來讓任何東西起作用),但是這個圖不會被添加到pyplot狀態機中。 'plt.figure'是一個工廠函數,它創建一個鏈接的'Figure'和'FigureCanvas'實例並將它們添加到pyplot圖形管理器中。如果你想使用'plt。*'方法,你必須使用'plt.figure'。 –

+1

所以發生的事情就是'fig = plt.Figure(...)'創建一個新的圖形實例,但它不會被添加到pyplot狀態機中。因此,當你調用'plt.subplot'時,沒有「當前」的數字,所以_another_ figure是在幕後創建的。 (這是直接使用圖形方法的另一個原因:例如'fig.add_subplot'而不是'plt.subplot') –

回答

2

您可能會發現更方便地使用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() 
+0

謝謝!我選擇這個作爲答案,但是對於未來的Google員工,請務必查看@ tcaswell和@JoeKington上面的討論和解釋---這是因爲我應該在調用圖()(class)時一直在使用'圖()'(工廠功能)... – Kevin

+0

誰會想到。去搞清楚! – holdenweb