如何使用matplotlib或plotly将等高线图覆盖在3D表面图上?

时间:2019-10-22 18:10:25

标签: python matplotlib plot plotly contourf

我有一个3-D表面图,其中显示了x和y坐标和深度。我还具有一个带有x和y坐标的二维轮廓图,并且在不同位置填充了轮廓。如果我知道Contourf图中坐标处的深度,是否可以在3-D表面图上显示轮廓?

我已使用HTTPS_PROXY=https://inbound_ip:443和以下代码创建了3-D表面图:

plotly

说我的contourf图可以用下面的代码创建:

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()

假设可以使用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() 模块确定每个位置的深度,我可以在等高线图上以正确的深度覆盖等高线图吗?

1 个答案:

答案 0 :(得分:0)

使用matplotlib的简短答案是“是”,但是有两个但是你有脸:

  1. 可视化3d数据很困难,并且重叠多个数据集通常比最简单的情况还要容易混淆
  2. Matplotlib具有2d渲染器,因此,即使您可以在同一3d图中绘制多个对象,也经常会出现渲染伪像(特别是两个对象通常可以完全位于彼此之前或之后)。 / li>

您需要的关键方法是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情节: 2d contour plot according to OP's original code

这是3d contourf版本: 3d-embedded contour plot where each level is filled with horizontal planes

这是3d contour版本: 3d-embedded contour plot where only level lines are plotted

如您所见,后两者之间的区别在于contourf还为每个级别绘制水平面(就像terraces一样,而contour仅绘制级别线本身。

由于使用相同轴的重复绘图将积累绘图,因此没有什么可以阻止您将这3d轮廓绘图中的任何一个叠加在原始曲面上。但是,根据我之前的警告,您必须注意轮廓是否在表面上正确绘制(在所有视角下),即使这样,结果对于传递信息也可能不是那么透明。我个人倾向于在3d图上发现contourfcontour更容易理解,但是我怀疑如果将它们放在全图上,后者会更好。