如何避免Plotly导出PDF时减少折线的采样点数?
原因:这是Plotly的默认降采样特性
Plotly在导出PDF、SVG、EPS这类矢量格式时,会自动对包含大量数据点的折线进行降采样处理——通过减少写入文件的点数来控制矢量文件体积。这是官方设计的特性,而非Bug:矢量图的每个点都会作为独立元素存储,高密度数据会导致文件体积暴涨,降采样是平衡显示效果和文件大小的策略。而PNG是位图格式,渲染时会绘制所有数据点,所以不会出现点状效果。
解决办法
1. 关闭降采样(推荐)
在write_image方法中添加downsample=None参数,强制保留所有数据点:
fig.write_image("cos.pdf", downsample=None)
该参数适用于Plotly默认的Kaleido渲染引擎,能直接让折线恢复平滑,同时如果原始数据点数合理(比如10000点的PDF体积仍在可接受范围),不会对LaTeX编译造成影响。
2. 自定义降采样密度
如果担心全量数据导致文件过大,可以通过downsample参数设置采样间隔。例如设置downsample=2表示每2个点保留1个,兼顾平滑度和体积:
fig.write_image("cos.pdf", downsample=2)
3. 调整原始数据点数
如果降采样参数无法生效,也可以直接减少生成数据时的点数。比如将np.linspace(0,10,10000)改为np.linspace(0,10,2000),2000个点的折线在矢量图中已经足够平滑,同时能大幅降低文件体积。
4. 标记点模拟折线(不推荐)
这是你提到的临时方案:将折线改为极小标记点,同时调整图例显示。但该方法会显著增加文件体积,且图例样式需要额外调整,仅作为备选:
fig.add_trace(go.Scatter( x=xvalues, y=np.cos(xvalues), name="cos(x) line", mode='markers', marker=dict(size=1), # 强制图例显示为折线 legendwidth=10, legendgroup="cos" ))
适配LaTeX的建议
优先选择PDF格式插入LaTeX,关闭降采样后若文件体积过大,可适当减少原始数据点数(1000-3000点足够满足学术图表的平滑要求)。SVG格式也可直接插入,但部分LaTeX环境可能需要额外包支持(如svg包)。
内容的提问来源于stack exchange,提问作者Dennis

