Скрыть контур linestroke на pyplot.contourf, чтобы получить только заливки
У меня есть проект для домашних животных, чтобы создавать изображения карт, где я рисую дороги и другие вещи по контурному сюжету местности. Он предназначен для планирования маршрутов на горных велосипедах (в прошлом я сделал несколько векторных рисунков вручную, и они отлично работают для визуализации).
В настоящее время я загружаю Digital Elevation Model, в 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()
Что дает:
![enter image description here]()
Проблема состоит в том, что контурные линии являются "белыми" и генерируют некоторое визуальное загрязнение, что нежелательно, поскольку я хочу позже строить дороги и реки.
Итак, я пытаюсь изменить способ contourf
создавать эти более светлые строки либо с помощью установки параметров, либо с помощью взлома (смены исходного кода), аналогично предложенному здесь:
Как форматировать контурные линии от Matplotlib
Кроме того, если кто-нибудь знает, как создать такую карту более элегантным способом, используя другие библиотеки, я был бы очень признателен за отзыв!
Спасибо за чтение.
Ответы
Ответ 1
Наконец-то я нашел правильное решение этой давней проблемы (в настоящее время в Matplotlib 2.0), которая не требует нескольких вызовов для контура или растеризации рисунка.
Обратите внимание, что проблема, проиллюстрированная в вопросе, появляется только в сохраненных форматах цифр качества публикации, таких как PDF, а не в более низких растровых файлах, таких как PNG.
Мое решение было вдохновлено ответом this, связанным с аналогичной проблемой с colorbar. Аналогичное решение также позволяет решить контурный график следующим образом:
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")
Ниже приведен пример контуров перед исправлением
![введите описание изображения здесь]()
И вот ниже приведенная цифра после исправления выше.
![введите описание изображения здесь]()
Ответ 2
heltonbiker, вы нашли решение своей проблемы? Я случайно наткнулся на этот вопрос, и у меня была такая же проблема на некоторое время. Я пробовал предложения Женей, однако они тоже не работают для меня. Решение проблемы, несмотря на то, что оно не является реальным решением, но более обходным путем, просто: просто повторите ту же команду contourf
, и это волшебным образом избавится от ложных контуров.
Как указано OP, при выполнении контурной заливки (contourf
) появляются ложные контуры с интервалами, слишком близкими друг к другу. Мы можем воспроизвести это поведение, установив очень большое количество интервалов, например:
plt.contourf(plon,plat,ssh,np.arange(-1,1.001,0.001)) # 2001 intervals
Это дает нам вывод:
![enter image description here]()
Тонкие ложные контуры, очевидно, влияют на чистый цвет контура.
Если вы выполните команду дважды:
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!
дает мне:
![enter image description here]()
Намного лучше. Здесь самый лучший, с тремя последовательными командами contourf
:
![enter image description here]()
Я больше не вижу тонких контуров! К сожалению, это может значительно замедлить ваши сценарии в зависимости от размера массива и количества интервалов контура. Фрагментные контуры выделяются больше, если используются больше интервалов контура. Обычно для меня лучше всего использовать от 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'
Ответ 3
Попробуйте добавить kw argrument к вызову plt.contourf(...)
: либо lw=0
, либо ls=None
.
http://matplotlib.sourceforge.net/api/pyplot_api.html#matplotlib.pyplot.contourf