如何用imshow()显示三个二维直方图之和?
How to display the sum of three 2D histograms with imshow()?
我正在尝试使用 imshow 制作情节。期望的行为是每个高斯将以给定的坐标为中心,例如,第一个峰将是 (53,74),x 和 y 方向的标准偏差为 3.14。相反,实际行为是 imshow 在 (50,50) 处将所有三个峰堆叠在一起。我将不胜感激任何帮助。我已经尝试查找并查看 https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.imshow.html.
中的每个参数
import matplotlib.pyplot as plt
import numpy as np
num = 100000
xs1 = np.random.normal(loc=53, scale=3.14, size=num)
ys1 = np.random.normal(loc=74, scale=3.14, size=num)
xs2 = np.random.normal(loc=62, scale=4, size=num)
ys2 = np.random.normal(loc=31, scale=4, size=num)
xs3 = np.random.normal(loc=39, scale=4.5, size=num)
ys3 = np.random.normal(loc=45, scale=4.5, size=num)
data1 = np.histogram2d(xs1, ys1, bins=112)
data2 = np.histogram2d(xs2, ys2, bins=112)
data3 = np.histogram2d(xs3, ys3, bins=112)
total = data1[0] + data2[0] + data3[0] + 900
plt.imshow(data1[0] + data2[0] + data3[0], aspect="auto", )
plt.show()
要将 3 个直方图相加,它们需要完全相同的分箱。例如使用全局最小值和最大值计算。
另外直方图的维度有x
在前,所以需要对结果进行转置
imshow()
比较奇特,默认从顶部开始渲染。 origin='lower'
在这里设置正确。要显示坐标,可以使用 extent=
。
import matplotlib.pyplot as plt
import numpy as np
num = 100000
xs1 = np.random.normal(loc=53, scale=3.14, size=num)
ys1 = np.random.normal(loc=74, scale=3.14, size=num)
xs2 = np.random.normal(loc=62, scale=4, size=num)
ys2 = np.random.normal(loc=31, scale=4, size=num)
xs3 = np.random.normal(loc=39, scale=4.5, size=num)
ys3 = np.random.normal(loc=45, scale=4.5, size=num)
xmin = min(xs1.min(), xs2.min(), xs3.min())
ymin = min(ys1.min(), ys2.min(), ys3.min())
xmax = max(xs1.max(), xs2.max(), xs3.max())
ymax = max(ys1.max(), ys2.max(), ys3.max())
bins = (np.linspace(xmin, xmax, 112), np.linspace(ymin, ymax, 112))
data1 = np.histogram2d(xs1, ys1, bins=bins)
data2 = np.histogram2d(xs2, ys2, bins=bins)
data3 = np.histogram2d(xs3, ys3, bins=bins)
plt.imshow((data1[0] + data2[0] + data3[0]).T, extent=[xmin, xmax, ymin, ymax],
aspect="auto", origin='lower', cmap='inferno')
plt.show()
我正在尝试使用 imshow 制作情节。期望的行为是每个高斯将以给定的坐标为中心,例如,第一个峰将是 (53,74),x 和 y 方向的标准偏差为 3.14。相反,实际行为是 imshow 在 (50,50) 处将所有三个峰堆叠在一起。我将不胜感激任何帮助。我已经尝试查找并查看 https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.imshow.html.
中的每个参数import matplotlib.pyplot as plt
import numpy as np
num = 100000
xs1 = np.random.normal(loc=53, scale=3.14, size=num)
ys1 = np.random.normal(loc=74, scale=3.14, size=num)
xs2 = np.random.normal(loc=62, scale=4, size=num)
ys2 = np.random.normal(loc=31, scale=4, size=num)
xs3 = np.random.normal(loc=39, scale=4.5, size=num)
ys3 = np.random.normal(loc=45, scale=4.5, size=num)
data1 = np.histogram2d(xs1, ys1, bins=112)
data2 = np.histogram2d(xs2, ys2, bins=112)
data3 = np.histogram2d(xs3, ys3, bins=112)
total = data1[0] + data2[0] + data3[0] + 900
plt.imshow(data1[0] + data2[0] + data3[0], aspect="auto", )
plt.show()
要将 3 个直方图相加,它们需要完全相同的分箱。例如使用全局最小值和最大值计算。
另外直方图的维度有x
在前,所以需要对结果进行转置
imshow()
比较奇特,默认从顶部开始渲染。 origin='lower'
在这里设置正确。要显示坐标,可以使用 extent=
。
import matplotlib.pyplot as plt
import numpy as np
num = 100000
xs1 = np.random.normal(loc=53, scale=3.14, size=num)
ys1 = np.random.normal(loc=74, scale=3.14, size=num)
xs2 = np.random.normal(loc=62, scale=4, size=num)
ys2 = np.random.normal(loc=31, scale=4, size=num)
xs3 = np.random.normal(loc=39, scale=4.5, size=num)
ys3 = np.random.normal(loc=45, scale=4.5, size=num)
xmin = min(xs1.min(), xs2.min(), xs3.min())
ymin = min(ys1.min(), ys2.min(), ys3.min())
xmax = max(xs1.max(), xs2.max(), xs3.max())
ymax = max(ys1.max(), ys2.max(), ys3.max())
bins = (np.linspace(xmin, xmax, 112), np.linspace(ymin, ymax, 112))
data1 = np.histogram2d(xs1, ys1, bins=bins)
data2 = np.histogram2d(xs2, ys2, bins=bins)
data3 = np.histogram2d(xs3, ys3, bins=bins)
plt.imshow((data1[0] + data2[0] + data3[0]).T, extent=[xmin, xmax, ymin, ymax],
aspect="auto", origin='lower', cmap='inferno')
plt.show()