簡體   English   中英

在 pyplot.contourf 上隱藏輪廓線以僅獲取填充

[英]Hide contour linestroke on pyplot.contourf to get only fills

我有一個創建地圖圖像的寵物項目,在那里我在地形高程的等高線圖上繪制道路和其他東西。 它的目的是規划山地自行車路線(過去我手工制作了一些矢量圖,它們非常適合可視化)。

目前,我從這里下載 GeoTIFF 中的數字高程模型: http : //www.ecologia.ufrgs.br/labgeo/arquivos/downloads/dados/SRTM/geotiff/rs.rar

然后使用 GDAL 和 Matplotlib contourf函數創建繪圖:

from osgeo import gdal
import matplotlib
import matplotlib.pyplot as plt
from pylab import cm
import numpy

f = 'rs.tif'

elev = gdal.Open(f)

a = elev.GetRasterBand(1).ReadAsArray()

w = elev.RasterXSize
h = elev.RasterYSize
print w, h

altura  = (0.35, 0.42)
largura = (0.70, 0.82)

a = a[int(h*altura[0]):int(h*altura[1]),
      int(w*largura[0]):int(w*largura[1])]


cont = plt.contourf(a, origin='upper', cmap=cm.gist_earth, levels=numpy.arange(0,1000,20))
plt.title('Altitudes - max: %d m; min: %d m' % (numpy.amax(a), numpy.amin(a)))
plt.show()

這使:

在此處輸入圖片說明

問題是等高線是“白色”的,會產生一些視覺污染,這是不希望的,因為我以后想繪制道路和河流。

因此,我試圖通過參數設置或通過 hack(更改源代碼)來修改contourf創建這些較輕線條的方式,類似於此處提出的方法:

如何從 Matplotlib 格式化輪廓線

另外,如果有人知道如何使用其他庫以更優雅的方式生成這樣的地圖,我將非常感謝您的提示!

謝謝閱讀。

我終於找到了解決這個長期存在的問題(目前在 Matplotlib 3 中)的合適解決方案,它不需要多次調用輪廓或光柵化圖形。

請注意,問題中說明的問題僅出現在保存的出版質量圖形格式(如 PDF)中,而不出現在質量較低的光柵文件(如 PNG)中。

我的解決方案受到這個答案的啟發,與顏色欄的類似問題有關。 結果證明,類似的解決方案也可以解決等高線圖,如下所示:

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(123)
x, y = np.random.uniform(size=(100, 2)).T
z = np.exp(-x**2 - y**2)
levels = np.linspace(0, 1, 100)

cnt = plt.tricontourf(x, y, z, levels=levels, cmap="ocean")

# This is the fix for the white lines between contour levels
for c in cnt.collections:
    c.set_edgecolor("face")

plt.savefig("test.pdf")    

以下是修復前的輪廓示例

在此處輸入圖片說明

下面是上面修復后的同一個圖

在此處輸入圖片說明

該問題的解決方案雖然不是真正的解決方案,而是一種解決方法,但很簡單:只需重復相同的contourf命令,這將神奇地擺脫虛假輪廓。

正如 OP 所述,在間隔太近的情況下進行輪廓填充 ( contourf ) 時,會出現虛假輪廓。 我們可以通過設置大量間隔來重現這種行為,例如:

plt.contourf(plon,plat,ssh,np.arange(-1,1.001,0.001)) # 2001 intervals

這給了我們作為輸出:

在此處輸入圖片說明

細的虛假輪廓明顯影響輪廓填充的凈顏色。

如果你執行兩次命令:

plt.contourf(plon,plat,ssh,np.arange(-1,1.001,0.001)) # Not once,
plt.contourf(plon,plat,ssh,np.arange(-1,1.001,0.001)) # but twice!

給我:

在此處輸入圖片說明

現在好多了。 這是最好的,有 3 個連續的contourf命令:

在此處輸入圖片說明

我再也看不到任何細小的輪廓了! 不幸的是,這可能會顯着減慢您的腳本速度,具體取決於數組大小和等高線間隔的數量。 如果使用更多的等高線間隔,虛假等高線會更加突出。 通常什么最適合我是用50〜100線距,並做contourf兩次。

請注意,我使用的 matplotlib 版本不是最新版本。 此問題可能已在1.1.0版中解決。 如果有,請告訴我。

Python 2.7.1 |EPD 7.0-2 (32-bit)| (r271:86832, Nov 29 2010, 13:52:51)
In [1]: matplotlib.__version__
Out[1]: '1.0.1'

當 alpha 設置為 <1 時,發布的解決方案對我不起作用,但我在這個解決方案中找到了答案: Matplotlib Contourf Plots Unwanted Outlines when Alpha < 1

添加參數antialiased=True為我解決了這個問題。

嘗試將 kw 參數添加到plt.contourf(...)調用: lw=0ls=None http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.contourf

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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