Как я могу нанести четырехугольные патчи с помощью pcolor в matplotlib? - PullRequest
1 голос
/ 01 апреля 2020

У меня проблема с pcolor() из matplotlib. Я хочу построить патчи, которые имеют четырехугольную форму. (Они имеют неправильную форму, но имеют 4 угла и не перекрываются). Чтобы продемонстрировать мою проблему, вот минимальный код, который производит неожиданное поведение.

import numpy as np
from matplotlib import pyplot as plt

x = [0, 1]
y = [0, 2]
val = [[1]]
xx, yy = np.meshgrid(x, y)

fig, ax = plt.subplots(1, 2, figsize=[10, 10])

ax = plt.subplot(2, 1, 1)
yy[1,0] =2.9
#displays a 1x2 rectangle
ax.pcolor(xx, yy, val, edgecolors='black')

ax = plt.subplot(2, 1, 2)
yy[1,0] =3
#displays the expected 1x3(x2) trapezoid
ax.pcolor(xx, yy, val, edgecolors='black')

plt.show()

(мы ожидаем трапецию с высотой 2,9, но она выводит прямоугольник с 2x1. Второй пример с высотой 3 работает нормально)

Вот вывод

image

Также при использовании pcolormesh возникает та же проблема.

Is это баг или я просто слепой?

1 Ответ

1 голос
/ 01 апреля 2020

Проблема в типе данных xx, а yy - int64. Поэтому, когда вы пытаетесь присвоить yy[1, 0] = 2.9, оно приводится к int, что приводит к yy[1, 0] == 2.

. Решение состоит в том, чтобы изменить тип данных на float, самый простой способ сделать это, используя numpy.ndarray.astype:

import numpy as np
from matplotlib import pyplot as plt

x = [0, 1]
y = [0, 2]
val = [[1]]
xx, yy = np.meshgrid(x, y)

xx = xx.astype('float64')
yy = yy.astype('float64')

fig, ax = plt.subplots(1, 2, figsize=[10, 10])

ax = plt.subplot(2, 1, 1)
yy[1,0] = 2.9
ax.pcolor(xx, yy, val, edgecolors='black')

ax = plt.subplot(2, 1, 2)
yy[1,0] = 3
ax.pcolor(xx, yy, val, edgecolors='black')

Это даст ожидаемый результат

enter image description here

...