Python svglib.svg2rlg Гистограмма от MatPlotLib - PullRequest
0 голосов
/ 17 декабря 2018

Учитывая эту горизонтальную гистограмму ниже (, обратите внимание на измененный диапазон оси 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')

Когда я пытаюсь добавить результирующееSVG для reportlab через svglib, он отлично работает, если я не изменяю диапазон оси x.Однако, если я добавлю получившуюся диаграмму с измененным диапазоном, столбцы диаграммы в выходном PDF-файле расширятся до нуля.Это не проблема в исходном выводе matplotlib и не возникает вообще, если я использую PNG, например.

Вот что я использую для создания PDF через ReportLab и svglib:

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()

Заранее спасибо!

1 Ответ

0 голосов
/ 17 декабря 2018

Одним из решений (на самом деле просто обходной путь) на стороне matplotlib было бы начать диапазон x с 0 и вычесть 6 из всех значений x, а затем выполнить plt.xticks ([0,2 ...], [«6», «8» ...]), чтобы пометить их вручную.

...