Код: Выделить всё
import numpy as np
import plotly.graph_objects as go
N_DISKS = 8
DISK_POINTS = 60
DISK_RADIUS = 0.4
# Centers along a helix
t = np.arange(N_DISKS)
centers = np.column_stack([
np.cos(t * np.pi / 3) * 1.2,
t * 0.9,
np.sin(t * np.pi / 3) * 1.2,
])
traces = []
lx, ly, lz = [], [], []
for i in range(len(centers) - 1):
lx += [centers[i, 0], centers[i+1, 0], None]
ly += [centers[i, 1], centers[i+1, 1], None]
lz += [centers[i, 2], centers[i+1, 2], None]
traces.append(go.Scatter3d(
x=lx, y=ly, z=lz,
mode="lines+markers",
line=dict(color="black", width=85),
marker=dict(color="black", size=30),
showlegend=False,
))
traces.append(go.Scatter3d(
x=lx, y=ly, z=lz,
mode="lines+markers",
line=dict(color="red", width=65),
marker=dict(color="red", size=24),
showlegend=False,
))
fig = go.Figure(data=traces)
fig.update_layout(
scene=dict(
xaxis=dict(visible=False),
yaxis=dict(visible=False),
zaxis=dict(visible=False),
camera=dict(eye=dict(x=0,y=2.5,z=0)),
aspectmode="cube",
),
margin=dict(l=0, r=0, t=0, b=0),
)
fig.show()

Я хотел бы сохранить это как SVG. Технически я могу сделать это, вызвав Plotly.toImage на стороне JS как SVG, но экспорт из этого файла — это не на самом деле SVG, а просто PNG, завернутый в SVG. Я примерно понимаю, почему они это делают, поскольку они просто пишут в контекст WebGL, но при этом создается впечатление, что в этом нет смысла.
Итак, как мне получить настоящий вывод SVG из этого рисунка Plotly? Я понимаю, что могу написать другой конвейер рендеринга, который вообще пропускает Plotly (и я это сделал), но наверняка есть какой-то способ получить из этого настоящий SVG.