python - 在单个图表上叠加绘图

标签 python matplotlib histogram heatmap imshow

我有两个基于二维直方图的热图,我试图将它们叠加在单个图表上。它们的轴(extent_L 和extent_H)的界限不一定完全重合。如果需要,我可以令人满意地制作各个图,但是当尝试在单个图表上很好地显示两个热图时,仅显示最新的一个。

import numpy as np
import numpy.random
import matplotlib.pyplot as plt

# Generate some test data
x_L = np.random.randn(8873)
y_L = np.random.randn(8873)

x_H = np.random.randn(1000)
y_H = np.random.randn(1000)

heatmap_L, xedges_L, yedges_L = np.histogram2d(x_L, y_L, bins=50)
extent_L = [xedges_L[0], xedges_L[-1], yedges_L[0], yedges_L[-1]]

heatmap_H, xedges_H, yedges_H = np.histogram2d(x_H, y_H, bins=50)
extent_H = [xedges_H[0], xedges_H[-1], yedges_H[0], yedges_H[-1]]

plt.clf()
im1 = plt.imshow(heatmap_L.T, extent=extent_L, origin='lower', cmap='Blues')
im2 = plt.imshow(heatmap_H.T, extent=extent_H, origin='lower', cmap='Greens')
plt.show() 

Only most recent heatmap displayed

编辑:如果我没记错的话,所有点都不在正确的位置

import numpy as np
import numpy.random
import matplotlib.pyplot as plt

# Generate some test data
x_L = np.random.randn(8873)
y_L = np.random.randn(8873)

x_H = np.random.randn(1000)
y_H = np.random.randn(1000)

heatmap_L, xedges_L, yedges_L = np.histogram2d(x_L, y_L, bins=50)
extent_L = np.array([xedges_L[0], xedges_L[-1], yedges_L[0], yedges_L[-1]])

heatmap_H, xedges_H, yedges_H = np.histogram2d(x_H, y_H, bins=50)
extent_H = np.array([xedges_H[0], xedges_H[-1], yedges_H[0], yedges_H[-1]])

plt.clf()
im1 = plt.imshow(heatmap_L.T, extent=extent_L, origin='lower', cmap='Blues')
im2 = plt.imshow(heatmap_H.T, extent=extent_H, origin='lower', cmap='Greens')
plt.autoscale()
plt.show()

enter image description here

flatHMH = np.reshape(heatmap_H, 2500)  # flatten the 2D arrays
flatHML = np.reshape(heatmap_L, 2500)
maxHMH = flatHMH.max()  # Find the maximum in each
maxHML = flatHML.max()
# Now for each value in the flat array build an RGBA tuple using 
# 1 for the colour we want - either green or blue, and then scaling
# the value by the maximum, finally reshaping back to a 50x50 array
augHMH = np.array([(0, 1, 0, x/maxHMH) for x in flatHMH]).reshape((50, 50, 4))
augHML = np.array([(0, 0, 1, x/maxHML) for x in flatHML]).reshape((50, 50, 4))

plt.clf()
# Plot without cmap as colours are now part of the data array passed.
im1 = plt.imshow(augHML, extent=extent_L, origin='lower')
im2 = plt.imshow(augHMH, extent=extent_H, origin='lower')
plt.autoscale()
plt.show()

enter image description here

如果仔细观察最后一张图中的点,例如边缘处的点聚类,您会发现它们与上图中的不同。

最佳答案

您正在显示两张图,问题是您正在将一张图绘制在另一张图之上。要查看实际情况,您可以移动其中一个图,如下所示:

import numpy as np
import numpy.random
import matplotlib.pyplot as plt

# Generate some test data
x_L = np.random.randn(8873)
y_L = np.random.randn(8873)

x_H = np.random.randn(1000)
y_H = np.random.randn(1000)

heatmap_L, xedges_L, yedges_L = np.histogram2d(x_L, y_L, bins=50)
extent_L = np.array([xedges_L[0], xedges_L[-1], yedges_L[0], yedges_L[-1]])

heatmap_H, xedges_H, yedges_H = np.histogram2d(x_H, y_H, bins=50)
extent_H = np.array([xedges_H[0], xedges_H[-1], yedges_H[0], yedges_H[-1]])

plt.clf()
im1 = plt.imshow(heatmap_L.T, extent=extent_L, origin='lower', cmap='Blues')
im2 = plt.imshow(heatmap_H.T+2, extent=extent_H+2, origin='lower', cmap='Greens')
plt.autoscale()
plt.show() 

您还需要其中的 plt.autoscale() 调用,否则限制将无法正确调整。

将两个图重叠显示的一种方法是在 imshow 调用中使用参数 alpha=X(其中 0 < X < 1)为了设置绘图调用的透明度。另一种可能更清晰的方法是将每个值从 histogram2D 转换为 RGBA 值。请参阅the imshow docs两种显示绘图的替代方案。

转换值的一种方法是展平数据,并用您想要的颜色对其进行增强。

# imports and test data generation as before, removed for clarity...

flatHMH = np.reshape(heatmap_H, 2500)  # flatten the 2D arrays
flatHML = np.reshape(heatmap_L, 2500)
maxHMH = flatHMH.max()  # Find the maximum in each
maxHML = flatHML.max()
# Now for each value in the flat array build an RGBA tuple using 
# 1 for the colour we want - either green or blue, and then scaling
# the value by the maximum, finally reshaping back to a 50x50 array
augHMH = np.array([(0, 1, 0, x/maxHMH) for x in flatHMH]).reshape((50, 50, 4))
augHML = np.array([(0, 0, 1, x/maxHML) for x in flatHML]).reshape((50, 50, 4))

plt.clf()
# Plot without cmap as colours are now part of the data array passed.
im1 = plt.imshow(augHML, extent=extent_L, origin='lower')
im2 = plt.imshow(augHMH, extent=extent_H, origin='lower')
plt.autoscale()
plt.show() 

关于python - 在单个图表上叠加绘图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51391488/

相关文章:

python - 属性错误 : '_io.TextIOWrapper' object has no attribute 'next' python

python - Pandas groupby 年份和绘图图

python - IPython : How to show the same plot in different cells?

python - 评估时间序列的频率、持续时间和值

r - ggplot2,直方图 : why do y = . .密度 .. 和 stat = "density"有什么不同?

python - 如何解析具有 FIX 消息格式的平面文件(在 python 中)?

python - 用于 AJAX 内容的 Scrapy CrawlSpider

plot - 无法设置行堆叠直方图条的边框线宽

python - 设置颜色以用于使用 matplotlib contourf 绘制的数组屏蔽值

matplotlib - 如何将 scipy 树状图保存为高分辨率文件?