![](/img/trans.png)
[英]Saving plots (AxesSubPlot) generated from python pandas with matplotlib's savefig
[英]matplotlib savefig() plots different from show()
當我使用show()
在X
繪制圖形時,圖形看起來非常好。 但是當我開始使用savefig()
生成大量圖形時, savefig()
生成的圖形的字體,線條,多邊形看起來都比show()
生成的圖形小。 我的環境是Ubuntu, show()
的后端是Qt4Agg
。 如何使show()
圖和savefig()
圖看起來一致?
savefig
指定已保存圖形的DPI(如果未在.matplotlibrc中指定,則默認值為100,請查看savefig的dpi
savefig
)。 它並沒有從原始數字的DPI中得到它。
DPI會影響文本的相對大小和線條上筆畫的寬度等。如果您希望看起來相同, fig.dpi
fig.savefig
傳遞給fig.savefig
。
例如
import matplotlib.pyplot as plt
fig = plt.figure()
plt.plot(range(10))
fig.savefig('temp.png', dpi=fig.dpi)
您將matplotlib圖表渲染到不同的設備(例如,通過石英在屏幕上使用不同的函數( plot vs savefig )通過pdf 渲染到參數幾乎相同,但這些參數的默認值不相同兩個功能。
換句話說,在savefig默認參數是從默認的顯示參數不同 。
如果你在matplotlib配置文件中執行它們,那么對齊它們很簡單。 模板文件包含在源包中,名為matplotlibrc.template 。 如果您在安裝matplotlib時沒有創建一個,則可以從matplotlib源或matplotlib網站獲取此模板。
按照自己的方式自定義此文件后,將其重命名為matplotlibrc (無擴展名)並將其保存到目錄.matplotlib (注意前導'。'),該目錄應位於您的主目錄中。
用於保存數字的配置參數從提供的matplotlibrc.template中的第314行開始(本節前面的第一行是:### SAVING FIGURES)。
特別是,您需要查看以下內容:
savefig.dpi : 100 # figure dots per inch
savefig.facecolor : white # figure facecolor when saving
savefig.edgecolor : white # figure edgecolor when saving
savefig.extension : auto # what extension to use for savefig('foo'), or 'auto'
這些行下面是字體類型和各種圖像格式特定參數的設置。
用於顯示的這些相同參數,即PLT.show() ,從matplotlibrc.template中的第277a 行開始(此部分前面是行:### FIGURE):
figure.figsize : 8, 6
figure.dpi : 80
figure.facecolor : 0.75
figure.edgecolor : white
正如你可以通過比較參數這兩個塊的值看,對於相同的人物的屬性的默認設置是用於savefig與顯示器 (顯示) 不同 。
老問題,但顯然谷歌喜歡它,所以我想我在對這個問題進行一些研究之后給出了答案。
如果您從頭開始創建一個圖形,則可以在創建時為其指定尺寸選項:
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(3, 6))
plt.plot(range(10)) #plot example
plt.show() #for control
fig.savefig('temp.png', dpi=fig.dpi)
figsize(width,height)調整繪圖的絕對尺寸,有助於確保兩個繪圖看起來相同。
如另一個答案中所述, dpi選項會影響文本的相對大小和行上行程的寬度等。使用dpi = fig.dpi選項可確保show()和savefig的相對大小相同() 。
或者,可以在創建后使用以下內容更改圖形大小:
fig.set_size_inches(3, 6, forward=True)
forward允許動態改變大小。
如果在創建的圖像中有太大的邊框時遇到問題,可以使用以下方法調整這些邊框:
plt.tight_layout()
#or:
plt.tight_layout(pad=2)
要么:
fig.savefig('temp.png', dpi=fig.dpi, bbox_inches='tight')
#or:
fig.savefig('temp.png', dpi=fig.dpi, bbox_inches='tight', pad_inches=0.5)
第一個選項只是最小化布局和邊框,第二個選項允許手動調整邊框。 這些提示至少幫助我解決了我的不同savefig()和show()圖像的問題。
我已經在matplotlib源代碼中修復了這個問題,但這不是一個很好的修復方法。 但是,如果你像我一樣非常關注圖表的外觀,那就值得了。
問題似乎在渲染后端; 它們每個都獲得正確的線寬,字體大小等值,但是當渲染為PDF或PNG時,與使用show()渲染時相比,它會略大。
我在文件matplotlib / backends / backend_agg.py中添加了幾行代碼來生成PNG。 您可以為您使用的每個后端進行類似的更改,或者找到一種方法在單個位置進行更聰明的更改;)
添加到我的matplotlib / backends / backend_agg.py文件中:
# The top of the file, added lines 42 - 44
42 # @warning: CHANGED FROM SOURCE to draw thinner lines
43 PATH_SCALAR = .8
44 FONT_SCALAR = .95
# In the draw_markers method, added lines 90 - 91
89 def draw_markers(self, *kl, **kw):
90 # @warning: CHANGED FROM SOURCE to draw thinner lines
91 kl[0].set_linewidth(kl[0].get_linewidth()*PATH_SCALAR)
92 return self._renderer.draw_markers(*kl, **kw)
# At the bottom of the draw_path method, added lines 131 - 132:
130 else:
131 # @warning: CHANGED FROM SOURCE to draw thinner lines
132 gc.set_linewidth(gc.get_linewidth()*PATH_SCALAR)
133 self._renderer.draw_path(gc, path, transform, rgbFace)
# At the bottom of the _get_agg_font method, added line 242 and the *FONT_SCALAR
241 font.clear()
242 # @warning: CHANGED FROM SOURCE to draw thinner lines
243 size = prop.get_size_in_points()*FONT_SCALAR
244 font.set_size(size, self.dpi)
所以這適合我現在的需求,但是,根據您正在做的事情,您可能希望在其他方法中實現類似的更改。 或者在沒有這么多行更改的情況下找到更好的方法來做同樣的事情!
更新:在Github上向matplotlib項目發布問題后,我能夠找到問題的根源:我已經更改了matplotlibrc文件中的figure.dpi設置。 如果該值與默認值不同,我的savefig()圖像會出現不同,即使我將savefig dpi設置為與圖dpi相同。 因此,我沒有像上面那樣更改源代碼,而是將figure.dpi設置保留為默認值80,並且能夠使用savefig()生成圖像,該圖像看起來像是show()中的圖像。
萊昂,你有沒改變過這個環境?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.