感谢 matplotlib,如何在同一张图中显示具有重叠数据的多个图形?
How to display multiple graphs with overlapping data in the same figure thank to matplotlib?
我正在搜索以在同一图中使用不同轴 X、Y 和数据 Z 从颜色图或 contourf 函数绘制多个图形(这里是 2 个)。但是我只想用所有图表的单个颜色条显示每个数据的最大值。
在这个例子中,我创建了一个单独的图形,我在其中添加了每个图形,但第二个图形覆盖了第一个图形,无论它的数据是更低还是更高。
import matplotlib.pyplot as plt
import numpy as np
a = [1,0.25]
fig = plt.figure(1)
ax = fig.gca()
for i in range(2):
x = np.linspace(-3, 3, 51)
y = np.linspace(-2*a[i], 2*a[i], 41)
X, Y = np.meshgrid(x, y)
if i == 0:
Z = (1 - X/2 + X**5 + Y**3) * np.exp(-X**2 - Y**2)
else:
Z = 0.5*np.ones((41,51))
graph = ax.contourf(X,Y,Z)
bar = fig.colorbar(graph)
plt.show()
Figure 1 displayed by the code
这是我要显示的内容:
Figure 2 desired
非常感谢,
特里斯坦
根据我们在您的 post 评论中的讨论,我认为您可以编辑您的代码来实现您想要的,如下所示。
首先,作为一般性评论,我建议您将变量移至脚本顶部。
其次,这是主要部分,如果您使用比较来测试要填充 Z 数组的值,则可以只绘制一张图。您可以使用 np.logical_and
and then use np.where
链接多个比较,以使用函数值或常量值填充 Z 数组,具体取决于您是否在所需的 x 和 y 值框内以及函数值或期望的常数值最大。
fig = plt.figure()
ax = fig.gca()
xmin, xmax, nx = -3, 3, 51
ymin, ymax, ny = -2, 2, 41
# box values
xbmin, xbmax = -3, 3
ybmin, ybmax = -0.5, 0.5
zlevel = 0.5
x = np.linspace(xmin, xmax, nx)
y = np.linspace(ymin, ymax, ny)
X, Y = np.meshgrid(x,y)
Z = (1 - X/2 + X**5 + Y**3) * np.exp(-X**2 - Y**2)
test1 = Z<zlevel
test2 = np.logical_and(X>=xbmin, X<=xbmax)
test3 = np.logical_and(Y>=ybmin, Y<=ybmax)
mask = np.logical_and(np.logical_and(test1, test2), test3)
Z = np.where(mask, zlevel*np.ones(Z.shape), Z)
graph = ax.contourf(X,Y,Z)
bar = fig.colorbar(graph)
plt.show()
我正在搜索以在同一图中使用不同轴 X、Y 和数据 Z 从颜色图或 contourf 函数绘制多个图形(这里是 2 个)。但是我只想用所有图表的单个颜色条显示每个数据的最大值。
在这个例子中,我创建了一个单独的图形,我在其中添加了每个图形,但第二个图形覆盖了第一个图形,无论它的数据是更低还是更高。
import matplotlib.pyplot as plt
import numpy as np
a = [1,0.25]
fig = plt.figure(1)
ax = fig.gca()
for i in range(2):
x = np.linspace(-3, 3, 51)
y = np.linspace(-2*a[i], 2*a[i], 41)
X, Y = np.meshgrid(x, y)
if i == 0:
Z = (1 - X/2 + X**5 + Y**3) * np.exp(-X**2 - Y**2)
else:
Z = 0.5*np.ones((41,51))
graph = ax.contourf(X,Y,Z)
bar = fig.colorbar(graph)
plt.show()
Figure 1 displayed by the code
这是我要显示的内容:
Figure 2 desired
非常感谢, 特里斯坦
根据我们在您的 post 评论中的讨论,我认为您可以编辑您的代码来实现您想要的,如下所示。
首先,作为一般性评论,我建议您将变量移至脚本顶部。
其次,这是主要部分,如果您使用比较来测试要填充 Z 数组的值,则可以只绘制一张图。您可以使用 np.logical_and
and then use np.where
链接多个比较,以使用函数值或常量值填充 Z 数组,具体取决于您是否在所需的 x 和 y 值框内以及函数值或期望的常数值最大。
fig = plt.figure()
ax = fig.gca()
xmin, xmax, nx = -3, 3, 51
ymin, ymax, ny = -2, 2, 41
# box values
xbmin, xbmax = -3, 3
ybmin, ybmax = -0.5, 0.5
zlevel = 0.5
x = np.linspace(xmin, xmax, nx)
y = np.linspace(ymin, ymax, ny)
X, Y = np.meshgrid(x,y)
Z = (1 - X/2 + X**5 + Y**3) * np.exp(-X**2 - Y**2)
test1 = Z<zlevel
test2 = np.logical_and(X>=xbmin, X<=xbmax)
test3 = np.logical_and(Y>=ybmin, Y<=ybmax)
mask = np.logical_and(np.logical_and(test1, test2), test3)
Z = np.where(mask, zlevel*np.ones(Z.shape), Z)
graph = ax.contourf(X,Y,Z)
bar = fig.colorbar(graph)
plt.show()