2016-11-25 76 views
1

我已經有了顏色條的散點圖,我保存爲PNG圖像。我需要情節是一定的figsize,但添加colorbar縮放原始情節。分別爲散點圖保存顏色條

import pylab as plt 

plt.figure(figsize=FIGSIZE) 
plt.scatter(X, Y, c=Z, s=marker_size, norm=LogNorm(), vmin=VMIN, vmax=VMAX, cmap=CMAP,rasterized=True,lw=0,) 
CB = plt.colorbar(ticks=TICKS, format=FORMAT) 

我怎麼能保存原始圖(與figsize的設置如上)和彩作爲兩個單獨的圖像?

回答

3

顯而易見的答案是「分開繪製顏色條」。您需要創建一個新的數字窗口並在那裏繪製顏色條,以防止第一個數字被扭曲。小例子:

import matplotlib.pyplot as plt 
import numpy as np # only for dummy data 

X,Y = np.mgrid[-2:3,-2:3] 
Z = np.random.rand(*X.shape) 
FIGSIZE = (2,3) 

plt.figure(figsize=FIGSIZE) 
mpb = plt.pcolormesh(X,Y,Z,cmap='viridis') 
# plot the original without a colorbar 
plt.savefig('plot_nocbar.png') 

# plot a colorbar into the original to see distortion 
plt.colorbar() 
plt.savefig('plot_withcbar.png') 

# draw a new figure and replot the colorbar there 
fig,ax = plt.subplots(figsize=FIGSIZE) 
plt.colorbar(mpb,ax=ax) 
ax.remove() 
plt.savefig('plot_onlycbar.png') 

# save the same figure with some approximate autocropping 
plt.savefig('plot_onlycbar_tight.png',bbox_inches='tight') 

考慮製作了以下四個數字(點擊正確查看):

no colorbardistorted with colorbarseparate colorbar with much whitecropped colorbar

首先是人物的已保存版本,而不到一個呼叫colormap。這很好,這是你想要保存的。第二張圖顯示如果我們撥打colorbar而沒有任何額外的煩惱會發生什麼:它需要原始圖中的一些空間,這是你想要防止的。

您必須使用plt.subplots打開一個新圖形(和軸),並使用原始圖形的大小。通過這種方式,您可以確定生成的彩條將與原始圖形中的彩條相同。在上面的設置中,我讓matplotlib確定了顏色條本身的大小;但之後我們需要刪除會污染結果圖的輔助軸。 (另一個選擇是手動創建一個單獨的座標軸,並帶有預期的顏色條大小,我懷疑這不是一個可行的行爲方式。)

現在,您可以在第三個繪圖時,刪除的軸之後留下的空白空間在結果圖中清晰可見(但顏色條的大小相當完美)。您可以在後期製作中手動剪下此空白區域,或者使用可以自動剪切彩色條圖像的東西。

我還包括一個版本的情節,其中matplotlib本身收穫大部分數字:bbox_inches='tight'關鍵字參數savefig正是這樣做的。好處在於,生成的圖像文件只包含色條(如上圖所示),但生成的色條大小與原始大小略有不同。根據您的特定需求,您需要嘗試使用可用的方法來提供最適合您的解決方案。

+0

太棒了!謝謝!我用你最後一個例子。 我不明白的唯一的事情是爲什麼設置dpi和figsize給出了一些意想不到的大小的結果圖像(我設置figsize =(3,8)和dpi = 80,但結果圖是144x660像素而不是240x640像素) – AntonK

+1

@AntonK如果在調用'figure()'時設置'dpi = 80',則它只會影響屏幕上的輸出。爲了在輸出文件中獲得預期的dpi,您需要在調用'plt.savefig(「filename.png」,dpi = 80)'時設置'dpi = 80''。 (默認是100我認爲)此外使用'bbox_inches ='tight''會改變figsize(這就是爲什麼你使用它,對吧?),所以你的輸出圖像尺寸是不可預知的。如果你需要一個特定的輸出大小,你不應該調用'bbox_inches ='tight''。 – ImportanceOfBeingErnest

+0

@ImportanceOfBeingErnest感謝您的輸入,我完全不熟悉'dpi'設置。至於彩條,我相信這種調整大小對於OP來說是可以的:重要的是,情節本身具有給定的尺寸,然後可以在其旁邊放置單獨的彩條(否則,這個問題似乎沒有意義至少對我來說)。在這種情況下,重要的是生成的顏色條對應於爲圖形繪製的內容,這就是爲什麼我建議從相同尺寸的圖像開始(但是它確實被裁剪爲自動設置的尺寸彩條)。 –