使用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
相关产品推荐
相关产品推荐

