我嘗試使用 matplotlib 的plot_surface 制作簡單的 3D 繪圖,下面是最小的示例:import numpy as npimport matplotlib.pyplot as pltfrom matplotlib import cmx_test = np.arange(0.001, 0.01, 0.0005)y_test = np.arange(0.1, 100, 0.05)fig = plt.figure()ax = fig.add_subplot(111, projection='3d')Xtest, Ytest = np.meshgrid(x_test, y_test)Ztest = Xtest**-1 + Ytestsurf = ax.plot_surface(Xtest, Ytest, Ztest, cmap=cm.plasma, alpha=1, antialiased=False)fig.colorbar(surf, shrink=0.5, aspect=5)ax.set_ylabel(r'$ Y $', fontsize=16)ax.set_xlabel(r'$ X $', fontsize=16)ax.set_zlabel(r'$ Z $', fontsize=16)結果給出了奇怪的顏色圖,它并不代表 z 尺度的大小,正如您可以從這里看到的3D 繪圖結果。我的意思是,如果你沿著 Z 軸不變的直線,你不會看到相同的顏色。我嘗試更改ccountandrcount內部plot_surface函數或更改 Xtest 或 Ytest 數據的間隔,但沒有任何幫助。我嘗試了這里和這里的一些建議。但似乎沒有關聯。你能幫我解決這個問題嗎?這似乎是一個簡單的問題,但我無法解決。謝謝!編輯我添加了示例,但使用了我沒有在這里寫的原始方程(它很復雜),請看一下:Comparison。左圖是在 Matlab 中完成的(由我的顧問完成),右圖是使用 matplotlib 完成的。您可以清楚地看到左側的圖確實很有意義,最亮的顏色始終位于最大 z 軸上。不幸的是,我不懂matlab。我希望我可以使用 python 來做到這一點,希望這次編輯能讓問題更清楚。編輯2 我確信這不是最好的解決方案。這就是為什么我把它放在這里,而不是作為答案。正如 @swatchai 建議使用contour3D. 由于曲面是一組線,因此我可以通過繪制大量輪廓線來生成正確的結果,方法是:surf = ax.contour3D(Xtest, Ytest, Ztest, 500, cmap=cm.plasma,
alpha=0.5, antialiased=False)正如您可以從這里看到的那樣,顏色圖是正確的alternative1 但情節非常沉重。當你放大時,它看起來不太好,除非你再次增加輪廓的數量。歡迎任何建議:)。
3 回答

收到一只叮咚
TA貢獻1821條經驗 獲得超5個贊
我不知道如何實現這一點,但也許可以解釋一下為什么會發生這種情況。 plot_surface
生成一個網格,其中頂點由x
和y
和定義z
。每個面片都有 4 個角,并獲得與其 z 值相對應的顏色。查看該圖,它可能是 4 個角的最大 z 值(只是猜測)。如果您仔細觀察,當您向 +y 方向移動時,色塊的顏色實際上會變淺。但更明顯的是x
方向上的顏色變化,產生了你提到的斜坡。
但如果每個補丁只有單一顏色,這就無法避免。
如果將公式更改為,您可能會更清楚地看到這一點Z = (X**-1 + 10 * Y)

慕絲7291255
TA貢獻1859條經驗 獲得超6個贊
曲面圖的行為不是您所期望的。只有contour3D 或contourf3D 可以顯示此類行為。這是相關代碼,您可以嘗試獲取以下情節:
surf = ax.plot_surface(Xtest, Ytest, Ztest, cmap=cm.plasma, alpha=0.55) ax.contourf3D(Xtest, Ytest, Ztest, cmap=cm.plasma)
顯示曲面和輪廓的圖:

弒天下
TA貢獻1818條經驗 獲得超8個贊
我想,繪制這種曲面的正式答案是使用Axes3D.contour
和Axes3D.contourf
。例如:
surf2?=?ax.contourf(Xtest,?Ytest,?Ztest,?250,?cmap=cm.plasma, ????????????????????alpha=0.6,?antialiased=False) surf?=?ax.contour(Xtest,?Ytest,?Ztest,?250,?cmap=cm.plasma, ??????????????????alpha=0.6,?antialiased=False)
顏色圖顯示正確的 z 比例。它不像光滑表面那么完美,因為這取決于我們縮放多少或放置輪廓多少。我不知道是否有辦法通過plot_surface創建它。
添加回答
舉報
0/150
提交
取消