2010-10-11 94 views
9

我一直在尋找解決這個簡單問題的高和低,但我找不到它!有大量的帖子詳細介紹了2D中數據的semilog/loglog繪圖。 plt.setxscale('log')但是我有興趣在三維圖(mplot3d)上使用對數尺度。使用對數刻度繪製mplot3d/axes3D xyz曲面繪圖?

我沒有確切的代碼交出,因此不能張貼在這裏,但是下面的簡單的例子應該足夠說明情況。我目前正在使用Matplotlib 0.99.1,但很快就會更新到1.0.0 - 我知道我必須更新我的mplot3d實現的代碼。

from mpl_toolkits.mplot3d import Axes3D 
from matplotlib import cm 
from matplotlib.ticker import LinearLocator, FixedLocator, FormatStrFormatter 
import matplotlib.pyplot as plt 
import numpy as np 

fig = plt.figure() 
ax = Axes3D(fig) 
X = np.arange(-5, 5, 0.025) 
Y = np.arange(-5, 5, 0.025) 
X, Y = np.meshgrid(X, Y) 
R = np.sqrt(X**2 + Y**2) 
Z = np.sin(R) 
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet, extend3d=True) 
ax.set_zlim3d(-1.01, 1.01) 

ax.w_zaxis.set_major_locator(LinearLocator(10)) 
ax.w_zaxis.set_major_formatter(FormatStrFormatter('%.03f')) 

fig.colorbar(surf) 

plt.show() 

上述代碼在3D中繪製得很好,但是三個刻度(X,Y,Z)都是線性的。我的'Y'數據跨越了幾個數量級(如9!),因此將它繪製在對數座標上會非常有用。我可以通過取得'Y'的日誌,重新創建numpy數組並在線性範圍內繪製日誌(Y)來解決此問題,但是以真正的python樣式,我正在尋找更智能的解決方案,它將繪製數據日誌規模。

是否可以使用對數刻度生成我的XYZ數據的3D曲面圖,理想情況下,我想在線性刻度上使用X & Z,並且使用對數刻度上的Y?

任何幫助將不勝感激。請原諒在上面的例子中的任何明顯的錯誤,如上所述,我沒有我的確切代碼,因此改變了我的記憶matplotlib畫廊的例子。

謝謝

回答

4

所有你需要做的就是定義你想要的軸的比例。舉例來說,如果你想要的X和Y軸是對數刻度,你應該寫:

ax.xaxis.set_scale('log') 
ax.yaxis.set_scale('log') 

,並最終:

ax.zaxis.set_scale('log') 
+1

上面的答案聲稱這個答案是錯誤的。你有迴應嗎? – dbliss 2015-11-17 05:54:24

10

因爲我遇到了同樣的問題,Alejandros回答沒有產生期望的結果這裏是我發現到目前爲止。

3D中軸的日誌縮放是matplotlib中的一個持續問題。目前只能重新標記軸有:

ax.yaxis.set_scale('log') 

不過,這不會導致軸進行縮放對數,但標記數。 ax.set_yscale('log')將導致異常的3D

在Github上查看issue 209

所以你還是要重新創建numpy的陣列中的OSX

+0

有沒有已知的解決方案呢?看起來set_yscale仍然不能在3D中工作。 – Blink 2014-02-13 21:43:18

+0

感謝您指出錯誤報告! – balu 2014-11-13 12:10:33

+0

@Blink:我不這麼認爲。 :( – balu 2014-11-13 12:11:08

1

:跑ax.zaxis._set_scale( '登錄')(注意下劃線)