簡體   English   中英

matplotlib savefig()繪圖與show()不同

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM