如何将平面 y = x 添加到 Plotly 中的 3D 曲面图?

问题描述 投票:0回答:2

我目前正在使用 Python 中的 Plotly 绘制 3D 曲面图。下面是我到目前为止的代码:

import numpy as np
import plotly.graph_objects as go

# Definition of the domain
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)

# Definition of the function, avoiding division by zero
Z = np.where(X**2 + Y**2 != 0, (X * Y) / (X**2 + Y**2), 0)

# Creation of the interactive graph
fig = go.Figure(data=[go.Surface(z=Z, x=X, y=Y, colorscale='Viridis')])

# Add title and axis configurations
fig.update_layout(
    title='Interactive graph of f(x, y) = xy / (x^2 + y^2)',
    scene=dict(
        xaxis_title='X',
        yaxis_title='Y',
        zaxis_title='f(X, Y)'
    ),
)

# Show the graph
fig.show()

我想将平面 (y = x) 添加到该图中。但是,我无法弄清楚如何做到这一点。

任何人都可以提供有关如何将此平面添加到我现有的曲面图中的指导吗?任何帮助将不胜感激!

python numpy plotly
2个回答
1
投票

要将“𝑦=𝑥”添加到 Plotly 中的 3D 曲面图,您可以为此平面定义一个单独的曲面,并使用另一个“go.Surface”对象将其添加到图形中。

在 Plotly 中,曲面图需要 𝑍 的显式值来显示平面。为了在给定的 𝑍 范围内实现 𝑦=𝑥 平面,我们需要设置 𝑋 和 𝑌 来表示 𝑦=𝑥 在 𝑍 平坦范围内。

这是我修改的新代码,

import numpy as np
import plotly.graph_objects as go

# Definition of the domain
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)

# Definition of the function, avoiding division by zero
Z = np.where(X**2 + Y**2 != 0, (X * Y) / (X**2 + Y**2), 0)

# Creation of the main surface plot
fig = go.Figure(data=[go.Surface(z=Z, x=X, y=Y, colorscale='Viridis')])

# Define the y = x plane
x_plane = np.linspace(-5, 5, 100)
y_plane = x_plane  # y = x
X_plane, Z_plane = np.meshgrid(x_plane, np.linspace(-1, 1, 2))  # Z range can be adjusted as needed
Y_plane = X_plane  # Since y = x

# Add the y = x plane to the plot
fig.add_trace(go.Surface(z=Z_plane, x=X_plane, y=Y_plane, colorscale='Reds', opacity=0.5))

# Add title and axis configurations
fig.update_layout(
    title='3D Surface Plot with Plane y = x',
    scene=dict(
        xaxis_title='X',
        yaxis_title='Y',
        zaxis_title='f(X, Y)'
    ),
)

# Show the graph
fig.show()

输出是 output


0
投票

问题是,您无法绘制一个垂直平面,将 Z 定义为 X 和 Y 的函数,就像您对其他曲面所做的那样。这就是 Busra 的代码没有显示任何内容的原因。

(以 2D 方式思考:您可以将曲线绘制为 x=a 范围,y=f(x)。但是如果您想为其添加一条垂直线,则不能只用另一个

f
做同样的事情,垂直曲线)

幸运的是,没有必要。

Surface
并不真正绘制
Z=f(x,y)
曲面,但一般来说,以 3 个 2D 数组的形式指定 x、y 和 z 的一堆“矩形”(好吧,可能是成对的三角形)的绘图。

因此,就像您将垂直线绘制为 x=g(y) 和 y=a 范围(g 为常数)一样,您也可以在这里做同样的事情。例如,让 x 和 z 形成网格,并定义 y=f(x,z)=x

import numpy as np
import plotly.graph_objects as go

# Definition of the domain
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)

# Definition of the function, avoiding division by zero
Z = np.where(X**2 + Y**2 != 0, (X * Y) / (X**2 + Y**2), 0)

# Creation of the main surface plot
fig = go.Figure(data=[go.Surface(z=Z, x=X, y=Y, colorscale='Viridis')])

# Define the plane y = x over the same domain
z_plane = np.linspace(Z.min(), Z.max(), 100)  # For a flat plane at Z=0 or another value
XY_plane, Z_plane=np.meshgrid(x,z_plane)

# Add the plane to the plot
fig.add_trace(go.Surface(z=Z_plane, x=XY_plane, y=XY_plane, colorscale='Reds', opacity=0.5))

# Add title and axis configurations
fig.update_layout(
    title='3D Surface Plot with Plane y = x',
    scene=dict(
        xaxis_title='X',
        yaxis_title='Y',
        zaxis_title='f(X, Y)'
    ),
)
fig.show()

enter image description here

请注意,我已经回收了您的

x_plane
,只是为了使其尽可能接近域名的预期重用。 但是,由于这是一个平面(完全一样,仍然继续我的 2D 类比,因此您需要 y 是 100 个点的 linspace 来绘制垂直线。 x=[0,0], y=[-ymin, ymax]就可以了),你真的不需要费心绘制 100×100 的离散曲面。

所以

XY_plane, Z_plane=np.meshgrid([-5,5],[Z.min(), Z.max()])

会得到完全相同的结果,但情节上的痛苦更少。只需一组 2x2 的 x、y 和 z 点,定义一个矩形。

© www.soinside.com 2019 - 2024. All rights reserved.