我需要绘制一个分箱统计信息,就像从scipy.stats.binned_statistic_2d
获得的那样。基本上,这意味着我有边缘值和bin-bin数据。这也意味着我不能(据我所知)使用plt.hist2d
。这是一个代码片段,用于生成我可能需要绘制的数据类型:
import numpy as np
x_edges = np.arange(6)
y_edges = np.arange(6)
bin_values = np.random.randn(5, 5)
可以想象我可以使用pcolormesh
来解决此问题,但问题是pcolormesh
不允许使用bin边缘值。以下内容仅绘制区间1到区域4中的值。排除第5个值,因为虽然pcolormesh"知道" 4.0的值是某个值,没有以后绘制的值,所以第5个bin的宽度为零。
import matplotlib.pyplot as plt
X, Y = np.broadcast_arrays(x_edges[:5, None], y_edges[None, :5])
plt.figure()
plt.pcolormesh(X, Y, bin_values)
plt.show()
我可以通过添加一组等于上一个值的额外值来解决这个问题:
import matplotlib.pyplot as plt
X, Y = np.broadcast_arrays(x_edges[:, None], y_edges[None, :])
dummy_bin_values = np.zeros([6, 6])
dummy_bin_values[:5, :5] = bin_values
dummy_bin_values[5, :] = dummy_bin_values[4, :]
dummy_bin_values[:, 5] = dummy_bin_values[:, 4]
plt.figure()
plt.pcolormesh(X, Y, dummy_bin_values)
plt.show()
然而,这个 是一个丑陋的黑客。有没有更简洁的方法来绘制具有bin边缘值的2D直方图数据? "否"可能是正确答案,但如果确实如此,请说服我。
答案 0 :(得分:2)
我不明白这两个选项中的任何一个的问题。所以这里是一个简单的代码,它使用numpy直方图数据和pcolormesh,以及简单的plt.hist2d
。
import numpy as np
import matplotlib.pyplot as plt
x_edges = np.arange(6)
y_edges = np.arange(6)
data = np.random.rand(340,2)*5
### using numpy.histogram2d
bin_values,_,__ = np.histogram2d(data[:,0],data[:,1],bins=(x_edges, y_edges) )
X, Y = np.meshgrid(x_edges,y_edges)
fig, (ax,ax2) = plt.subplots(ncols=2)
ax.set_title("numpy.histogram2d \n + plt.pcolormesh")
ax.pcolormesh(X, Y, bin_values.T)
### using plt.hist2d
ax2.set_title("plt.hist2d")
ax2.hist2d(data[:,0],data[:,1],bins=(x_edges, y_edges))
plt.show()
当然,这同样适用于scipy.stats.binned_statistic_2d
。