Python 使用pcolormesh绘制二维直方图数据

Python 使用pcolormesh绘制二维直方图数据,python,matplotlib,Python,Matplotlib,我需要绘制一个装箱的统计数据,就像我们从中得到的一样。基本上,这意味着我有边值和箱内数据。这也意味着我不能(据我所知)使用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不允许使用b

我需要绘制一个装箱的统计数据,就像我们从中得到的一样。基本上,这意味着我有边值和箱内数据。这也意味着我不能(据我所知)使用
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中的值。第五个值被排除在外,因为虽然pcolormesh“知道”4.0处的值是某个值,但没有稍后的值可绘制,因此第五个箱子的宽度为零

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边缘值绘制二维直方图数据?“不”可能是正确的答案,但如果是,请说服我。

我不理解这两个选项中的任何一个的问题。这里有一个简单的代码,它既使用了带pcolormesh的numpy历史程序数据,也简单地使用了
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\u statistic\u 2d

我不理解这两个选项中的任何一个的问题。这里有一个简单的代码,它既使用了带pcolormesh的numpy历史程序数据,也简单地使用了
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\u statistic\u 2d

您是对的。我错误理解的核心是没有意识到可以将X和Y传递给长度大于Z的pcolormesh。你是对的。我错误理解的核心是没有意识到可以将X和Y传递给长度大于Z的pcolormesh。
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()