You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用svgpathtools绘制SVG图像上下倒置问题的修复方法

问题根因

SVG 标准默认坐标系以视图左上角为原点,Y轴正方向垂直向下;但 matplotlib 默认使用数学坐标系,以绘图区域左下角为原点,Y轴正方向垂直向上。两者Y轴方向完全相反,直接将svgpathtools解析出的原生路径坐标传入matplotlib绘图,就会出现图像上下颠倒的问题,属于坐标系规则不匹配,并非svgpathtools解析出错。

修复方案

不需要调整路径解析逻辑,两种方案二选一即可:

  • 坐标预处理时翻转Y值:在原有坐标居中逻辑完成后,对Y轴坐标做取反操作
  • 渲染阶段翻转坐标轴:不修改原始坐标,直接调用matplotlib内置接口翻转Y轴,代码改动最小
修正后的完整代码
import svgpathtools
import numpy as np
import matplotlib.pyplot as plt

svgpaths, attributes = svgpathtools.svg2paths('./jedi_symbol.svg')
paths = []

for n, (attrs, svgpath) in enumerate(zip(attributes, svgpaths)):
    path = []
    for segment in svgpath:
        num_steps = int(segment.length()/0.5)
        tt = np.linspace(0, 1, num_steps)
        xy = np.array([segment.point(t) for t in tt])
        if len(xy) > 0:
            if path and xy[0] == path[-1]:
                xy = xy[1:]
        path.extend(xy)
    paths.append(np.array(path))

paths = np.array(paths)
x_table, y_table = paths[0].real, paths[0].imag

# 图像居中处理
x_table = x_table - min(x_table)
y_table = y_table - min(y_table)
x_table = x_table - max(x_table) / 2
y_table = y_table - max(y_table) / 2    

# 新增:翻转Y坐标适配matplotlib坐标系
y_table = -y_table

fig, ax = plt.subplots(figsize=(5, 5))
ax.set_aspect('equal', 'datalim')
ax.plot(x_table, y_table)
plt.show()

如果选用渲染阶段翻转的方案,可以删掉上面代码里y_table = -y_table这一行,在ax.plot(x_table, y_table)后添加ax.invert_yaxis(),效果完全一致。

内容的提问来源于stack exchange,提问作者rafaelcb21

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 17:54:18