28

私は地図の画像を作成するためのペット プロジェクトを持っています。ここでは、地形標高の等高線上に道路やその他のものを描きます。これは、マウンテン バイクのルートを計画することを目的としています (私は過去にいくつかのベクトル図を手作業で作成しましたが、それらは視覚化に最適です)。

現在、GeoTIFF の Digital Elevation Model をここからダウンロードします: http://www.ecologia.ufrgs.br/labgeo/arquivos/downloads/dados/SRTM/geotiff/rs.rar

次に、GDAL と Matplotlibcontourf関数を使用してプロットを作成します。

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()

これにより、次のことが得られます。

ここに画像の説明を入力

問題は、等高線が「白」であり、道路や川を後でプロットしたいので望ましくない視覚的な汚染を生成することです。

contourfそのため、ここで提案されているものと同様に、パラメーター設定またはハック (ソース コードの変更) を介して、これらのより軽い線を作成する方法を変更しようとしています。

Matplotlib から等高線をフォーマットする方法

また、他のライブラリを使用して、よりエレガントな方法でそのようなマップを生成する方法を誰かが知っている場合は、そのヒントをいただければ幸いです!

読んでくれてありがとう。

4

4 に答える 4

53

私は最終的に、この長年の問題 (現在は Matplotlib 3) に対する適切な解決策を見つけました。

質問に示されている問題は、PNG などの低品質のラスター ファイルではなく、PDF などの保存された出版品質の図形式でのみ発生することに注意してください。

私の解決策は、カラーバーの同様の問題に関連するこの回答に触発されました。次のように、同様の解法で等高線図も解かれます。

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")    

以下は、修正前の輪郭の例です

ここに画像の説明を入力

そして、以下は上記の修正後の同じ図です

ここに画像の説明を入力

于 2015-10-02T16:03:06.440 に答える
7

この問題の解決策は、実際の解決策ではなく回避策ですが、簡単です。同じcontourfコマンドを繰り返すだけで、偽の輪郭が魔法のように取り除かれます。

contourfOPで述べたように、間隔が近すぎる輪郭塗りつぶし()を実行すると、偽の輪郭が表示されます。非常に多くの間隔を設定することで、この動作を再現できます。たとえば、次のようになります。

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

これにより、次の出力が得られます。

ここに画像の説明を入力

薄い疑似等高線は、等高線塗りつぶしの正味の色に明らかに影響します。

コマンドを 2 回実行すると、次のようになります。

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!

私に与えます:

ここに画像の説明を入力

はるかに良くなりました。contourfこれは、3 つの連続したコマンドを使用した最高のものです。

ここに画像の説明を入力

細い輪郭が見えなくなりました!残念ながら、これにより、配列のサイズと等高線間隔の数によっては、スクリプトが大幅に遅くなる可能性があります。より多くの等高線間隔を使用すると、擬似等高線がより目立ちます。通常、私にとって最も効果的なのは、50 ~ 100 の等高線間隔を使用して、contourf2 回行うことです。

私が使用している 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'
于 2012-05-17T19:59:15.690 に答える
4

呼び出しに kw 引数を追加してみてくださいplt.contourf(...): どちらかlw=0またはls=None. http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.contourf

于 2011-11-25T10:48:01.063 に答える