как не окрашивать значения nan при создании контурного графика с помощью matplotlib.collections.PolyCollection - PullRequest
1 голос
/ 03 февраля 2020

Я пытаюсь нанести три / четыре мне sh вместе с результатами по этому мне sh. Я строю результаты симуляции CFD.

Я использую matplotlib.collections.PolyCollection для построения графика, потому что он обрабатывает не три элементы, где другие методы поддерживают только три элемента.

мой текущий код работает нормально , но когда я пытаюсь отобразить результаты, когда в некоторых ячейках нет воды (прямо сейчас им присвоено значение np.nan), построение графиков завершается сбоем, и все цвета контура портятся.

Мой текущий код:

ax = plt.subplot(111)
cmap = matplotlib.cm.jet
polys = element_coords #list of Nx2 np.arrays containing the coordinates of each element polygon)
facecolors = element_values #np array of values at each element, same length as polys
pc = matplotlib.collections.PolyCollection(polys, cmap=cmap)
pc.set_array(facecolors)
ax.add_collection(pc)
ax.plot()

Когда element_values ​​не содержит никаких значений nan, он работает нормально и выглядит примерно так:

works

Однако, когда element_values содержит значения nan, происходит сбой, и я получаю эту ошибку:

C:\Users\deden\AppData\Local\Continuum\anaconda3\envs\test\lib\site-packages\matplotlib\colors.py:527: RuntimeWarning: invalid value encountered in less
  xa[xa < 0] = -1

Я играл с element_values и могу подтвердить, что это происходит только при наличии значений nan.

Сначала я попытался игнорировать значения nan, выполнив это только для того, чтобы прояснить их:

pc.cmap.set_bad(color='white',alpha=0)

Но я все еще получаю ту же ошибку.

Итак ... Я пытался устанавливая все значения nan на -999, затем пытаясь отрезать цвет p вот так:

vmin = np.nanmin(facecolors)
vmax = np.nanmax(facecolors)
facecolors[np.isnan(facecolors)] = -999
pc.cmap.set_under(color='white',alpha=0)

затем попытался установить пределы цветовой карты на основе других вопросов стека, которые я видел .. вроде:

pc.cmap.set_clim(vmin,vmax)

, но затем я получаю:

AttributeError: 'ListedColormap' object has no attribute 'set_clim'

У меня нет идей ... кто-нибудь может мне помочь? Я просто хочу НЕ ЦВЕТИТЬ ни один элемент, значение которого равно nan.

Чтобы воспроизвести мою ошибку ... вы можете попробовать использовать эти фиктивные данные:

polys = [np.array([[ 223769.2075899 , 1445713.24572239],
                   [ 223769.48419606, 1445717.09102757],
                   [ 223764.48282055, 1445714.84782264]]),
         np.array([[ 223757.9584215 , 1445716.57576502],
                   [ 223764.48282055, 1445714.84782264],
                   [ 223762.05868674, 1445720.48031478]])]
facecolors = np.array([np.nan, 1]) #will work if you replace np.nan with a number

SIDE NOTE - если кто-нибудь знает как Я могу построить эту сетку + данные без поликоллекций, которые были бы хороши ... это включает в себя 3-х и 4-х сторонние меня sh элементы

1 Ответ

2 голосов
/ 03 февраля 2020

Механика картографирования Matplotlib возникла в то время, когда numpy.nan не было рядом. Вместо этого он работает с замаскированными массивами.

facecolors = np.ma.array(facecolors, mask=np.isnan(facecolors))

Что касается другой получаемой ошибки, обратите внимание, что .set_clim является атрибутом цвета bar , а не цветом map .


Наконец, если ваш me sh содержит только 3-сторонние элементы, вы можете использовать tripcolor, но это не будет работать с 4-сторонними сетками.

...