2017-04-23 45 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

這是一個很好的答案! –