将Plotly的三维散点图保存为规范的SVG文件
我有一个非常简单的三维图形,是用Plotly以线条和圆盘构成。没有曲面。没有光照。没有复杂性。只有线条和圆盘。下面是一个最小示例:
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。技术上我可以通过在JS端把它导出为SVG,并调用 Plotly.toImage,但这种导出其实并不是一个真正的SVG,它只是一个被SVG包裹的PNG。我大致理解他们为什么这样做,因为他们只是写入一个WebGL上下文,但这也让人感觉没有抓住重点。
那么,如何从这个Plotly图形获得真正的SVG输出?我知道我可以写一个完全跳过Plotly的渲染管线(我已经这么做过),但肯定有某种方法能得到真正的SVG。
解决方案
你可以把绘图渲染为SVG(参见 Static Image Renderers):
fig.show(renderer="svg")
或者将其导出为一个SVG文件(参见 Write Image to a File):
fig.write_image("fig.svg")
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。