我想绘制两个平面并找到它们的交叉线,但是我得到了这个结果,因为一个平面覆盖了另一个平面,因此无法分辨它们相交的位置。
3D投影应隐藏平面的不可见部分,如何使用 matplotlib 获得此结果?
你可以清楚地看到这些平原应该相交。
以下是我用来获得此结果的代码
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
values = range(-10, 11)
def plotPlane(plot, normal, d, values, colorName):
# x, y, z
x, y = np.meshgrid(values, values)
z = (-normal[0] * x - normal[1] * y - d) * 1. / normal[2]
# draw plot
plot.plot_surface(x, y, z, color=colorName)
image = plt.figure().gca(projection='3d')
plotPlane(image, [3, 2, -4], 1, values, "red")
plotPlane(image, [5, -1, 2], 4, values, "gray")
plt.show()
答案 0 :(得分:5)
请参阅How to draw intersecting planes?以获取详细说明+可能的解决方法。
matplotlib的3D支持中的简短答案是巧妙地使用投影来生成3D对象的2D视图,然后将其渲染到画布。由于matplotlib呈现的方式(艺术家一次),一位艺术家要么完全高于另一位艺术家。如果您需要真正的3D支持,请查看mayavi
。
答案 1 :(得分:4)
使用plotly。您将获得一个交互式绘图,您可以在任何角度对其进行快照。
import numpy as np
import plotly.graph_objects as go
from typing import Tuple, Iterable
def plotPlane(fig: go.Figure,
normal: Tuple[int, int, int],
d: int,
values: Iterable,
colorScaleName: str) -> None:
"""
:param fig: figure to plot on
:param colorScaleName: choose from <https://plotly.com/javascript/colorscales/>
"""
# x, y, z
x, y = np.meshgrid(values, values)
z = (-normal[0] * x - normal[1] * y - d) * 1. / normal[2]
# draw plane
surface = go.Surface(x=x, y=y, z=z, colorscale=colorScaleName, showscale=False)
fig.add_trace(surface, row=1, col=1)
# create figure
fig = make_subplots(rows=1, cols=1, specs=[[{'type': 'surface'}]])
# plot two intersectioned surfaces
values = range(-10, 11)
plotPlane(fig, (3, 2, -4), 1, values, "Hot")
plotPlane(fig, (5, -1, 2), 4, values, "Greys")
fig.show()
我在 jupyter-notebbok 中运行它。