感谢matplotlib,如何在同一图中显示具有重叠数据的多个图形?

Posted

技术标签:

【中文标题】感谢matplotlib,如何在同一图中显示具有重叠数据的多个图形?【英文标题】:How to display multiple graphs with overlapping data in the same figure thank to matplotlib? 【发布时间】:2022-01-12 20:36:14 【问题描述】:

我正在搜索从同一个图中具有不同轴 X、Y 和数据 Z 的颜色图或轮廓函数绘制多个图形(这里是 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

非常感谢, 特里斯坦

【问题讨论】:

是否有意让第一次迭代中的 y 值仅从 -0.5 变为 0.5,而第二次迭代中的 y 值从 -2 变为 2? 是的,这是为了表明我可以拥有不同网格和数据的图表。我不能简单地计算和比较以获得最大 Z 并按 X 和 Y 绘制,因为每个图的 X 和 Y 都不相同。 好的,所以在我看来,您希望在所有 x 值上设置一条腰带,但 y 介于 -0.5 和 0.5 之间,其中图形的高度为 0.5 或 Z 函数的高度,取 Z 值最大的那个。这是正确的吗? 在这个例子中是的,但我会给出一个适合任何 Z 和 X-Y 比例值的答案。我在帖子中添加了一张关于我想要什么的图片,用油漆制作。 【参考方案1】:

根据我们在 cmets 中对您帖子的讨论,我认为您可以编辑您的代码以实现您想要的效果,如下所示。

首先,作为一般性评论,我建议您将变量移到脚本的顶部。

其次,这是主要部分,如果您使用比较来测试要填充 Z 数组的值,您可以只绘制一个图表。您可以使用 np.logical_and 链接多个比较,然后使用 np.where 根据您是否在所需的 x 和 y 值框内以​​及是否使用函数值或常数值填充 Z 数组函数值或期望的常数值最大。

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()

【讨论】:

感谢 E.Klahn 回答我的问题。这个答案适用于这个例子,但我无法在我的项目中实现这个方法,因为我有太多的图表需要覆盖和比较。我希望 matplotlib 能够将所有数据相互嵌套以充分利用它们。我还尝试了另一种方法来绘制 3d 图并从上方查看视图,但 3d 图在 matplotlib 上显示效果不佳,这与在 Matlab 中的其他工具不同,在 Matlab 中一切都做得很干净。 但是你认为这种方法应该适用于我们相互比较的n个图和n组数据(x,y,X,Y,Z)吗? 这样的东西可以修改为适用于 n 个图,是的。但这取决于你想要什么。如果您有多个函数,您是否希望在比较两个函数时始终保持最大值?您是否希望能够添加许多具有恒定高度的正方形区域?这些事情当然可以做,但那时需要做出一些选择。 想象几个独立的波浪,我希望在同一个图上有一个俯视图(所以使用相同的轴和颜色条)。那么是的,我想在比较两个函数时始终保持最大值。这个高度恒定的正方形区域只是一个例子。在我的项目中,我想显示最多几个 (n) 复杂函数的顶视图(二维)。我可以向您展示我在 Matlab 上所做的事情,以了解我想要做什么。 在这种情况下,您可以做的是创建一个形状为 (nx, ny, N) 的数组(我们称之为 A),其中 N 是您要比较的图形的数量。然后用你的函数填充数组,这样第一个函数(我们可以称之为 Z0)转到数组中的 [:,:,0],Z1 转到数组中的 [:,:,1],依此类推。最后,通过计算 Z = np.amax(A, axis=2) 比较所有数组。

以上是关于感谢matplotlib,如何在同一图中显示具有重叠数据的多个图形?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Matplotlib 如何在最终图中突出显示一个点

如何在 matplotlib pandas 的一张图中组合两个文件的两个条形图

d3.js 如何在条形图中添加线条

如何在 matplotlib 饼图中显示实际值

如何在 Python matplotlib 子图中显示图例

从 Matplotlib 图中提取信息并将其显示在 PyQt5 GUI 中