python - 如何使用 matplotlib 或 plotly 在 3-D 曲面图上叠加等高线图?
问题描述
我有一个显示 x 和 y 坐标和深度的 3-D 曲面图。我还有一个二维轮廓图,其中包含 x 和 y 坐标以及不同位置的填充轮廓。如果我知道轮廓图中坐标处的深度,有没有办法可以在 3-D 曲面图上显示轮廓?
我使用plotly
以下代码创建了一个 3-D 曲面图:
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()
假设可以使用该oceansdb
模块确定每个位置的深度,我可以在正确深度的表面图上覆盖等高线图吗?
解决方案
使用 matplotlib 的简短回答是“是”,但有两个但你有脸:
- 可视化 3d 数据很困难,重叠多个数据集往往会导致混淆,超出最简单的情况
- Matplotlib 有一个 2d 渲染器,因此即使您可以在同一个 3d 图形中绘制多个对象,也经常会出现渲染伪影(特别是,两个对象通常可以完全在彼此的前面或后面)。
您需要的关键方法是Axes3D.contour
或Axes3D.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
它还为每个级别绘制水平面(就像露台一样),而contour
只绘制水平线本身。
由于使用相同轴的重复绘图会累积绘图,因此没有什么能阻止您将这些 3d 等高线图中的任何一个叠加在原始表面上。但是,根据我之前的警告,您必须注意轮廓是否在表面上正确渲染(在所有视角下),即使是这样,结果对于传达信息也可能不是那么透明。我个人倾向于发现contourf
比contour
在 3d 图上更容易理解,但我怀疑如果我们将这些放在全表面图之上,后者会更好。
推荐阅读
- python - 需要有关随机字符串生成 python 的帮助
- javascript - ngrx 推迟一个有效的动作,直到另一个动作被分派
- php - Codigniter flashdata 有时不起作用
- mongodb - 如何从 MongoDB 字段中的字符串中删除特殊字符?
- python - 如何在 python 中编码视频响应?
- wordpress - 如何删除或禁用 wordpress 上的移动菜单?
- azure-devops - ArchiveFiles@2 和根文件夹
- python - 如何在 Pandas 中设置合并金额的小幅度差异
- c++ - main.cpp:3:1:注意:“std::thread”在标题中定义
'; 你忘了'#include '? - javascript - MongoDB:创建包含当前时间戳的复合_id