2017-04-23 70 views
1

我有下面的代码在pyplot绘制二维直方图:Matplotlib 2D直方图似乎换位

#!/usr/bin/env python 
import numpy as np 
import matplotlib.pyplot as plt 

MIN, MAX, num = .001, 5000, 500 
minn=1 
maxx=1000 
zbins = 10 ** np.linspace(np.log10(MIN), np.log10(MAX), num) 
x=np.linspace(100,600,50000) 
y=np.linspace(0,500,50000) 

fig1 = plt.figure(1) 
counts1,xedges1,edges1,d=plt.hist2d(x,y,bins=zbins) 
mesh1 = plt.pcolormesh(zbins, zbins, counts1) 
plt.xlim([minn, maxx]) 
plt.ylim([minn, maxx]) 
plt.gca().set_xscale("log") 
plt.gca().set_yscale("log") 
plt.colorbar() 

plt.show() 

道歉我可怕的变量命名!

无论如何,当我绘制这个,直方图似乎有切换x和y轴。我检查了matplotlib 2d hist文档,我确定我有正确的顺序的x和y参数,但我不能为我的生活找出我要出错的地方。任何帮助将不胜感激!

+0

'mesh1 = plt.pcolormesh(zbins,zbins,counts1)'是互换的轴的线(或类似)。 ...没有进一步调查,抱歉。 –

回答

3

混淆来自事实,返回的counts阵列不是你认为的那样。

plt.hist2d内部使用numpy.histogram2d来计算二维直方图。所述文档状态作为返回值:

H:ndarray,形状(NX,NY) 样本x和y的两维直方图。 x中的值是沿着第一维的直方图,y中的值是沿着第二维的直方图
xedges:ndarray,shape(nx,) 沿第一个维度的边沿​​。
yedges:ndarray,shape(ny,) 沿第二维的边沿。

除此之外,还有似乎是一个mistake concerning the exact shape of the arrays事实上,我们看到,返回的直方图数组的第一个维度是x和第二y

然而,matplotlib始终预计y是第一个维度。因此,plt.hist2d产生正确的图表,plt.pcolormesh需要数组的转置版本。

plt.pcolormesh(X,Y, counts.T) 

完整例如,比较plt.hist2dplt.pcolormesh

import numpy as np 
import matplotlib.pyplot as plt 

x=np.linspace(1,10,10) 
y=np.linspace(6,9,10) 

zbinsx= np.linspace(0,10,11) 
zbinsy= np.linspace(5,10,6) 

fig, (ax, ax2) = plt.subplots(ncols=2) 
counts,xedges,yedges,d = ax.hist2d(x,y, bins=[zbinsx,zbinsy]) 
# counts has shape (10, 5) 
X,Y = np.meshgrid(xedges,yedges) 
mesh1 =ax2.pcolormesh(X,Y, counts.T) 

plt.show() 

enter image description here

+0

这是一个很好的答案! –