繁体   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