python-3.x - 来自 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()
提前致谢!
解决方案
matplotlib 方面的一种解决方案(实际上只是一种解决方法)是将 x 范围从 0 开始并从所有 x 值中减去 6,然后执行 plt.xticks([0,2...],['6' ,'8'...]) 手动标记它们。
推荐阅读
- swift - 根据绘制的框架,裁剪无法正常工作
- docker-compose - Docker-compose 卷错误:格式不正确,应该是 external:internal[:mode]
- ios - Xcode 12.4 React 本机构建在 IOS 中失败,显示所有消息命令 PhaseScriptExecution 失败,退出代码为非零
- c++ - 为什么即使一切都正确,我的 C++ 代码仍会返回一些奇怪的数字?
- python - 如何将列表内列表的值分配给列表内另一个列表的值(python)?
- c# - 是否可以在 Console.WriteLine 或 Console.ReadKey 中添加延迟以显示文本?
- angular - 如何使用 mergeMap 对链式请求进行单元测试
- r - 使用整个数据集在线性回归图上绘制数据的子部分
- monitoring - 在无主架构中使用 zookeeper 有意义吗?
- python - 每次重新启动程序后,Python Tkinter 的渲染速度都会变慢