我正在使用 matplotlib 繪制影像,到目前為止,imshow在我的情況下最好的插值引數是,interpolation='None'但如果我還給出了一個alpha引數,則在保存圖形時,不會保留 alpha。
最小的例子:
import matplotlib.pyplot as plt
import numpy as np
arr = np.abs(np.sin(np.linspace(0, 2*np.pi)))
x,y = np.meshgrid(arr,arr)
arr = x*y
plt.figure()
plt.imshow(arr,alpha=arr,interpolation='None')
plt.savefig("fig1.pdf")
預期結果:

我得到了什么:

我只在此特定插值設定中遇到此問題。
matplotlib 版本:3.4.3
uj5u.com熱心網友回復:
@mapf 建議光柵化是好的,但你可以只光柵化影像,而不是整個軸;將軸標簽等保留為向量。
import matplotlib.pyplot as plt
import numpy as np
arr = np.abs(np.sin(np.linspace(0, 2*np.pi)))
x,y = np.meshgrid(arr, arr)
arr = x*y
fig, ax = plt.subplots()
ax.imshow(arr, alpha=arr, interpolation='none', rasterized=True)
fig.savefig("fig1.pdf")

如果你真的想對影像進行矢量化,那么另存為 pcolormesh:
fig, ax = plt.subplots()
ax.pcolormesh(arr, alpha=arr)
fig.savefig("fig2.pdf")

如果你想要 imshow 的垂直方向和縱橫比:
ax.flipud()
ax.set_aspect(1)
uj5u.com熱心網友回復:
即使 pdf 支持透明度(與 eps 不同),如果您使用interpolation='None',則需要通過使用強制光柵化(位圖)繪圖ax.set_rasterized(True):
import matplotlib.pyplot as plt
import numpy as np
arr = np.abs(np.sin(np.linspace(0, 2*np.pi)))
x,y = np.meshgrid(arr, arr)
arr = x*y
fig, ax = plt.subplots()
ax.imshow(arr, alpha=arr, interpolation='None')
ax.set_rasterized(True)
fig.savefig("fig1.pdf")
請注意,通過這樣做,您不再保存矢量圖形(不幸的是失去了它帶來的所有好處)。相反,您實際上是生成一個 png,然后將其合并到 pdf 中。因此,為了避免像素化,您可能需要提高 dpi。
盡管如此,最簡單的解決方案可能是 drop interpolation='None',除非您真的需要它。
由于您說這interpolation='None'最適合您的專案,但對于除 Agg、ps、pdf 和 svg 之外的所有其他后端,插值默認為'nearest',因此實際上最適合您的專案的是interpolation='nearest'. 所以我建議嘗試一下。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/355917.html
標籤:Python matplotlib
