首页 > 解决方案 > 来自 MatPlotLib 的 Python svglib.svg2rlg 条形图

问题描述

鉴于下面的水平条形图(请注意修改后的 x 轴范围,从 6 而不是 0 开始):

import matplotlib.pyplot as plt
import numpy as np
import matplotlib 

np.random.seed(19680801)
plt.rcdefaults()
fig, ax = plt.subplots(figsize=(3,2))

people = ('Tom', 'Dick', 'Harry', 'Slim', 'Jim')
y_pos = np.arange(len(people))
performance = 3 + 10 * np.random.rand(len(people))
error = np.random.rand(len(people))

ax.barh(y_pos, performance, xerr=error, align='center',
        color='green', ecolor='black')
ax.set_xlim((6,14)) #THIS IS THE KEY ISSUE
ax.set_yticks(y_pos)
ax.set_yticklabels(people)
ax.invert_yaxis()  # labels read top-to-bottom
ax.set_xlabel('Performance')
plt.yticks(size=10)

ax.set_title('How fast do you want to go today?',size=10, fontname='Arial')

plt.tight_layout()
plt.savefig('image.svg')

当我尝试通过 svglib 将生成的 SVG 添加到 reportlab 时,如果我不修改 x 轴范围,它可以正常工作。但是,如果我添加具有修改范围的结果图表,则输出 PDF 中图表的条形将一直延伸到零。这在 matplotlib 的原始输出中不是问题,例如,如果我使用 PNG,则根本不会出现。

这是我用来通过 ReportLab 和 svglib 创建 PDF 的内容:

from reportlab.graphics import renderPDF
from reportlab.pdfgen import canvas
from svglib.svglib import svg2rlg

my_canvas = canvas.Canvas('svg_on_canvas.pdf')
drawing = svg2rlg('image.svg')
renderPDF.draw(drawing, my_canvas, 0, 40)
my_canvas.save()

提前致谢!

标签: python-3.xmatplotlibsvgreportlab

解决方案


matplotlib 方面的一种解决方案(实际上只是一种解决方法)是将 x 范围从 0 开始并从所有 x 值中减去 6,然后执行 plt.xticks([0,2...],['6' ,'8'...]) 手动标记它们。


推荐阅读