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()