如何在 matplotlib 中用 pcolor 绘制四边形补丁?
How can I plot quadrilateral patches with pcolor in matplotlib?
我 运行 遇到了来自 matplotlib 的 pcolor()
问题。我想绘制具有四边形形状的补丁。 (它们确实有一个不规则的形状,但有 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 的第二个示例工作正常)
这是输出
同样,使用pcolormesh
,也会出现同样的问题。
这是一个错误还是我只是瞎了眼?
问题是 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')
这将给出预期的结果
我 运行 遇到了来自 matplotlib 的 pcolor()
问题。我想绘制具有四边形形状的补丁。 (它们确实有一个不规则的形状,但有 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 的第二个示例工作正常)
这是输出
同样,使用pcolormesh
,也会出现同样的问题。
这是一个错误还是我只是瞎了眼?
问题是 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')
这将给出预期的结果