2015-09-27 43 views
1

我已經編寫了一些代碼來在matplotlib中生成多面板圖形。爲了使圖形在文檔中看起來更清晰,我嘗試增加dpi。我發現,雖然,這也改變了圖中,字體,線條等的尺寸,如圖所示在下面的簡單的例子:調整matplotlib中的圖形質量

#First normal figure 
fig, axarr = plt.subplots(2,2, figsize=(6,6)) 
for i,ax in enumerate(axarr.flatten()): 
    ax.plot(range(10)) 
    ax.set_title('title'+str(i), fontsize=10) 
    ax.set_xlabel('x'+str(i), fontsize=10) 
    ax.set_ylabel('y'+str(i), fontsize=10) 
plt.tight_layout() 

#Again, with higher dpi 
fig, axarr = plt.subplots(2,2, figsize=(6,6), dpi=200) 
for i,ax in enumerate(axarr.flatten()): 
    ax.plot(range(10)) 
    ax.set_title('title'+str(i), fontsize=10) 
    ax.set_xlabel('x'+str(i), fontsize=10) 
    ax.set_ylabel('y'+str(i), fontsize=10) 

plt.tight_layout() 
plt.show() 

在我的計算機(使用matplotlib 1.4.3),第二個數字尺寸較大且文字較大,因此y軸標籤重疊。如果不使用plt.tight_layout(),子圖軸的重疊也會變得更糟。顯然,這只是爲了創造更高質量的數字而沒有幫助。這裏發生了什麼,如何改變圖形質量並保持圖形的外觀不變?有沒有一種解決方案在我調整了子圖參數,添加了顏色條和圖例等,也就是一般情況下也能起作用?預先感謝您提供的任何幫助。

回答

2

你的問題是,你顯示它,然後將它保存在GUI窗口。您必須從指定savefig的命令保存圖像,並在其中定義dpi。

事情是這樣的:

import matplotlib.pyplot as plt 

#First normal figure 
fig, axarr = plt.subplots(2,2, figsize=(6,6)) 
for i,ax in enumerate(axarr.flatten()): 
    ax.plot(range(10)) 
    ax.set_title('title'+str(i), fontsize=10) 
    ax.set_xlabel('x'+str(i), fontsize=10) 
    ax.set_ylabel('y'+str(i), fontsize=10) 
plt.tight_layout() 
plt.savefig('myfigure_100.png', dpi=100) 
plt.savefig('myfigure_200.png', dpi=200) 

如果你想顯示它,你可以在scrpit的末尾添加plt.show()

編輯

圖的DPI的關係大小和字體大小可以在以下示例中顯示:

import matplotlib.pyplot as plt 

#First normal figure 
fig1, axarr1 = plt.subplots(2,2, figsize=(6,6), dpi=100) 
for i,ax in enumerate(axarr1.flatten()): 
    ax.plot(range(10)) 
    ax.set_title('title'+str(i), fontsize=10) 
    ax.set_xlabel('x'+str(i), fontsize=10) 
    ax.set_ylabel('y'+str(i), fontsize=10) 
plt.tight_layout() 

fig2, axarr2 = plt.subplots(2,2, figsize=(12,12), dpi=50) 
for i,ax in enumerate(axarr2.flatten()): 
    ax.plot(range(10)) 
    ax.set_title('title'+str(i), fontsize=20) 
    ax.set_xlabel('x'+str(i), fontsize=20) 
    ax.set_ylabel('y'+str(i), fontsize=20) 
plt.tight_layout() 

plt.show() 
+0

謝謝你。我想說的是,如果可能的話,我寧願不用savefig來完成它,因爲我使用具有不同參數調用的相同腳本來產生大量數字,並且需要爲腳本外部的每個腳本調用savefig(因爲我使用的文件名不容易「可編程」),並且我發現如果我這樣做,我會很容易發生錯誤,例如將錯誤的數字保存到文件中。如果將來我必須做類似的事情,我可能會忘記設置dpi。沒有使用savefig沒有辦法做到這一點? – PeterW

+0

我也很想知道爲什麼在任何人都知道的情況下,更改dpi會改變GUI窗口中的繪圖外觀。 – PeterW

+1

如果您的名字不易編程,請列出一個列表並傳遞相應的參數作爲保存圖像的文件名。關於第二條評論,我編輯了我的評論,以解釋爲什麼更改dpi的外觀可能是相同的。 dpi表示「每英寸點數」,而fontsize表示數字/字母的點大小。所以取決於你如何選擇它們,結果可能是一樣的。 – iblasi