Вопрос или проблема
Я хотел создать каркасную поверхность в Plotly. Однако приведенный ниже код выполняет провода только вдоль одной оси. Как мне преобразовать эти параллельные провода в сетку?
import numpy as np
import plotly.graph_objects as go
import plotly.io as pio
x = np.linspace(-5, 5, 20)
y = np.linspace(-5, 5, 20)
x, y = np.meshgrid(x, y)
a = 1
b = 1
z = (x**2 / a**2) - (y**2 / b**2)
# Добавить линии
lines = []
line_marker = dict(color="#000000", width=4)
for i, j, k in zip(x, y, z):
lines.append(go.Scatter3d(x=i, y=j, z=k, mode="lines", line=line_marker))
fig = go.Figure(data=lines)
pio.templates["Mathematica"] = go.layout.Template()
# Обновить макет
fig.update_layout(
title="3D Гиперболический Параболоид",
scene=dict(
xaxis_title="Ось X",
yaxis_title="Ось Y",
zaxis_title="Ось Z"
),
template="Mathematica",
)
fig.show()
Не беспокойтесь, я справился, хотя было бы неплохо более изящное решение.
Проблема заключается в meshgrid
, потому что итерация по сетке обеспечивает изменяющееся значение x
для постоянного y
. Взяв транспонированные x
, y
и z
, сгенерированные сеткой, можно построить перпендикулярные линии:
import numpy as np
import plotly.graph_objects as go
import plotly.io as pio
x = np.linspace(-5, 5, 10)
y = np.linspace(-5, 5, 10)
x, y = np.meshgrid(x, y)
a = 1
b = 1
z = (x**2 / a**2) - (y**2 / b**2)
# Добавить линии
lines = []
line_marker = dict(color="#000000", width=4)
for i, j, k in zip(x, y, z):
lines.append(go.Scatter3d(x=i, y=j, z=k, mode="lines", line=line_marker))
for i, j, k in zip(x.T, y.T, z.T):
lines.append(go.Scatter3d(x=i, y=j, z=k, mode="lines", line=line_marker))
trace1 = lines
trace2 = go.Surface(z=z, x=x, y=y)
fig = go.Figure(lines)
fig.add_trace(trace2)
pio.templates["Mathematica"] = go.layout.Template()
# Обновить макет
fig.update_layout(
title="3D Гиперболический Параболоид",
scene=dict(
xaxis_title="Ось X",
yaxis_title="Ось Y",
zaxis_title="Ось Z"
),
template="Mathematica",
)
fig.show()
Ответ или решение
Для создания сетчатой поверхности с проволочными каркасами в Plotly, мы можем использовать функции для создания графиков в трехмерном пространстве. Ваша первоначальная реализация, действительно, создает линии только вдоль одной оси. Однако, как вы правильно заметили, можно легко исправить это, используя транспонирование массива данных, чтобы получить перпендикулярные линии.
Вот более упрощенная версия кода с комментариями на русском языке для большего понимания:
import numpy as np
import plotly.graph_objects as go
import plotly.io as pio
# Определяем диапазоны для осей x и y
x = np.linspace(-5, 5, 10)
y = np.linspace(-5, 5, 10)
# Создаем сетку координат с помощью meshgrid
x, y = np.meshgrid(x, y)
# Константы для уравнения гиперболического параболоида
a = 1
b = 1
# Вычисляем значения z на основе формулы гиперболического параболоида
z = (x**2 / a**2) - (y**2 / b**2)
# Добавляем линии для каркасной структуры
lines = []
line_marker = dict(color="#000000", width=4)
# Добавление линий вдоль оси y для заданного x и z
for i, j, k in zip(x, y, z):
lines.append(go.Scatter3d(x=i, y=j, z=k, mode="lines", line=line_marker))
# Добавление линий вдоль оси x для заданного y и z
for i, j, k in zip(x.T, y.T, z.T):
lines.append(go.Scatter3d(x=i, y=j, z=k, mode="lines", line=line_marker))
# Создаем объект Surface для отображения нашей поверхности
surface = go.Surface(z=z, x=x, y=y)
# Создаем фигуру и добавляем проволочные линии и поверхность
fig = go.Figure(data=lines)
fig.add_trace(surface)
# Устанавливаем шаблон для отображения
pio.templates["Mathematica"] = go.layout.Template()
# Настраиваем параметры отображения
fig.update_layout(
title="3D Гиперболический Параболоид",
scene=dict(
xaxis_title="Ось X",
yaxis_title="Ось Y",
zaxis_title="Ось Z"
),
template="Mathematica",
)
# Отображаем фигуру
fig.show()
Примечания:
- Параметры сетки: Я уменьшил количество точек в сетке до 10 для лучшего визуального восприятия. Вы можете изменить это значение, чтобы сделать сетку более плотной или разреженной, в зависимости от ваших потребностей.
- Настройки линий: Цвет и ширина линий каркасной структуры заданы в параметрах
line_marker
. - Проверка: Убедитесь, что у вас установлены необходимые библиотеки
numpy
иplotly
. Вы можете установить их через pip, если они ещё не установлены.
Этот код должен создать 3D-график гиперболического параболоида с используемыми линиями каркасной структуры, которые пересекают обе оси, что делает визуализацию более информативной и удобной.