2013-10-11 26 views
3

我使用imshow以及使用zorder關鍵字在它們之間繪製一些矢量數據來繪製matplotlib中的多個圖像。當使用imshow時,Matplotlib PDF輸出不尊重zorder

最少例如:

import numpy as np 
import matplotlib.pyplot as plt 

img = np.arange(100).reshape((10,10)) 
plt.imshow(img, extent = [0.25, 0.75, 0.25, 0.75], zorder = 10) 
plt.imshow(img, extent = [0.1, 0.9, 0.1, 0.9], zorder = 1) 
plt.plot([0, 1], [0, 1], color = 'black', zorder = 5) 
plt.axis([0, 1, 0, 1]) 

plt.savefig('img.png') 

當導出到PNG,如預期的輸出。但是,當保存爲PDF(或EPS,SVG,...)時,zorder不受尊重(該行將繪製在兩個圖像上)。看起來這兩張圖片在導出時會合併爲一張。通過使用pcolormesh而不是imshow工程將圖像保存爲向量而不是柵格,但繪製大圖像時生成的PDF格式非常龐大。有沒有辦法使這項工作與imshow

+0

請創建此問題。 – tacaswell

回答

1

這聽起來像你應該提出一個錯誤報告here - 我找到了一個類似的問題here但你的問題看起來不同,以便有一個單獨的票證。

你可以做的是將你的對角線手動分割爲兩部分,而不是依靠z命令來爲你隱藏它。 喜歡的東西:

plt.plot([0, 0.25], [0, 0.25], color = 'black', zorder = 5) 
plt.plot([0.75, 1], [0.75, 1], color = 'black', zorder = 5) 

更換您:

plt.plot([0, 1], [0, 1], color = 'black', zorder = 5) 

更新:

鑑於你的現實世界中的情節可能是一個複雜得多比直線你可能把你的頂層,你的陰謀,並找到一個面具/邊界,其中兩個攔截刪除,(自動),你需要隱藏的部分行。

另一種選擇是將所有圖層作爲單獨的圖像生成,然後使用PIL對其進行分層,但由於PNG輸出工作正常,因此您可能會更好地輸出爲PNG,然後轉換爲PDF或嵌入爲PDF作爲工作。

+0

謝謝,我剛剛提交了一個錯誤報告(https://github.com/matplotlib/matplotlib/issues/2517)。不幸的是,我實際上並沒有試圖繪製直線,而是繪製了一個輪廓圖,所以我認爲除了現在使用PNG輸出外,沒有簡單的解決方法。 – mrbump