我正在尝试为以下数据创建直方图
x = [2, 3, 4, 5]
y = [1, 1, 1, 1]
我正在使用以下代码,例如,在how to generate 2D histograms in matplotlib这个问题的答案的旧版本中描述。
import matplotlib.pyplot as plt
import numpy as np
bins = np.arange(-0.5, 5.5, 1.0), np.arange(-0.5, 5.5, 1.0)
heatmap, xedges, yedges = np.histogram2d(x, y, bins=bins)
extent = [xedges[0], xedges[-1], yedges[0], yedges[-1]]
plt.clf()
plt.imshow(heatmap,
extent=extent,
interpolation='nearest',
cmap=plt.get_cmap('viridis'), # use nicer color map
)
plt.colorbar()
plt.xlabel('x')
plt.ylabel('y')
然而,这产生的情节似乎以某种方式旋转。
我在期待这个:
但我得到了
显然,这与我的输入数据不符。此图中突出显示的坐标为(1, 0), (1, 1), (1, 2), (1, 3)
。
发生了什么事?
答案 0 :(得分:3)
plt.imshow
图像空间约定,用于索引输入数组。也就是说,右上角为(0, 0)
,向下为y轴。
为避免这种情况,您必须使用可选参数origin =' lower'来调用plt.imshow
。 (纠正原点)并传递转换为heatmap.T
的数据以纠正轴的翻转。
但这还不能让你得到正确的情节。起源不仅在错误的地方,而且索引惯例也不同。 numpy数组遵循行/列索引,而图像通常使用列/行索引。所以另外,你必须转置数据。
所以最后,你的代码应该是这样的:
import matplotlib.pyplot as plt
import numpy as np
bins = np.arange(-0.5, 5.5, 1.0), np.arange(-0.5, 5.5, 1.0)
heatmap, xedges, yedges = np.histogram2d(x, y, bins=bins)
extent = [xedges[0], xedges[-1], yedges[0], yedges[-1]]
plt.clf()
plt.imshow(heatmap.T,
origin='lower',
extent=extent,
interpolation='nearest',
cmap=plt.get_cmap('viridis'), # use nicer color map
)
plt.colorbar()
plt.xlabel('x')
plt.ylabel('y')
或者甚至更好地使用matplotlib.pyplot.hist2d
来完全避免这个问题。