簡體   English   中英

如何使用 matplotlib 或 Z26C592950DC26CA2AEF5DBACC23D 表面 plot 覆蓋輪廓 plot

[英]How to overlay contour plot on 3-D surface plot with matplotlib or plotly?

我有一個 3-D 表面 plot 顯示 x 和 y 坐標和深度。 我還有一個二維輪廓 plot 與 x 和 y 坐標和不同位置的填充輪廓。 如果我知道輪廓 plot 中坐標處的深度,有沒有辦法可以在 3-D 表面 plot 上顯示輪廓?

我使用plotly創建了一個 3-D 表面 plot,代碼如下:

import plotly.graph_objects as go
import oceansdb
import numpy as np 
import matplotlib.pyplot as plt

Xa = np.linspace(29.005,29.405,200)
Ya = np.linspace(-93.6683,-93.2683,200)

db = oceansdb.ETOPO()
dcont = db['topography'].extract(lat=Xa, lon=Ya)
depth = dcont['height']

fig = go.Figure(data=[go.Surface(z=depth, x=Xa, y=Ya)])
fig.show()

說我的輪廓 plot 可以使用以下代碼創建:

X = np.array([29.1,29.15,29.2,29.25])
Y = np.array([-93.5,-93.45,-93.4,-93.35])
r = np.array([0,0,0,2,3,0,0,6,7,8,9,1,9,0,0,0])

plt.figure()
plt.contourf(X,Y,r.reshape(len(X),len(Y)))
plt.show()

假設可以使用oceansdb模塊確定每個位置的深度,我可以在表面plot上以正確的深度覆蓋輪廓plot嗎?

使用 matplotlib 的簡短回答是“是”,但有兩個你有臉:

  1. 可視化 3d 數據很困難,除了最簡單的情況外,重疊多個數據集往往會造成混淆
  2. Matplotlib 有一個 2d 渲染器,因此即使您可以 plot 多個對象在同一個 3d 圖中,通常也會出現渲染偽影(特別是兩個對象)。

您需要的關鍵方法是Axes3D.contourAxes3D.contourf 以下是您的示例數據的實際操作:

import numpy as np 
import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D  # this enables 3d axes

X = np.array([29.1,29.15,29.2,29.25]) 
Y = np.array([-93.5,-93.45,-93.4,-93.35]) 
r = np.array([0,0,0,2,3,0,0,6,7,8,9,1,9,0,0,0]).reshape(X.size, Y.size)

# plot your 2d contourf for reference 
fig,ax = plt.subplots() 
ax.contourf(X, Y, r) 

# plot in 3d using contourf
fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
ax.contourf(X, Y, r) 

# plot in 3d using contour
fig = plt.figure() 
ax = fig.add_subplot(111, projection='3d') 
ax.contour(X, Y, r) 

plt.show() 

這是您的二維contourf 根據 OP 原始代碼的 2d 等高線圖

這是 3d contourf版本: 3d 嵌入式等高線圖,其中每個級別都填充有水平面

這是 3d contour版本: 僅繪制水平線的 3d 嵌入式等高線圖

正如您所看到的,后兩者之間的區別在於, contourf還為每個級別繪制水平面(就像露台一樣),而contour只繪制水平線本身。

由於使用相同軸的重復繪圖會累積繪圖,因此沒有什么能阻止您在原始表面上疊加這些 3d 等高線圖。 但是,根據我之前的警告,您必須注意輪廓是否在表面上正確渲染(在所有視角下),即使是這樣,結果對於傳達信息也可能不是那么透明。 我個人傾向於發現contourcontourf plot 上的輪廓更容易理解,但我懷疑如果我們將這些放在全表面圖的頂部,后者會更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM