Меня удивляет, что это еще не упоминалось, поэтому для полноты ...
Вы можете выполнить распаковку списка с помощью оператора «splat»: *
, который также будет скопируйте элементы вашего списка.
old_list = [1, 2, 3]
new_list = [*old_list]
new_list.append(4)
old_list == [1, 2, 3]
new_list == [1, 2, 3, 4]
Очевидным недостатком этого метода является то, что он доступен только в Python 3.5 +.
Сроки, однако, это работает лучше, чем другие распространенные методы.
x = [random.random() for _ in range(1000)]
%timeit a = list(x)
%timeit a = x.copy()
%timeit a = x[:]
%timeit a = [*x]
#: 2.47 µs ± 38.1 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
#: 2.47 µs ± 54.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
#: 2.39 µs ± 58.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
#: 2.22 µs ± 43.2 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
Как уже упоминалось в комментариях, заголовок фигуры центрирован относительно фигуры, а не по осям. Это поведение жестко запрограммировано в функциях рендеринга, нет параметров конфигурации, которые бы его изменили.
Одним из обходных путей является создание собственного класса, который наследует от pygal.Line
и переопределяет функцию, которая отображает заголовок (который не очень большой):
class MyLineChart(pygal.Line):
def __init__(self, *args, **kwargs):
super(MyLineChart, self).__init__(*args, **kwargs)
def _make_title(self):
"""Make the title"""
if self._title:
for i, title_line in enumerate(self._title, 1):
self.svg.node(
self.nodes['title'],
'text',
class_='title plot_title',
x=self.margin_box.left + self.view.width / 2, # Modified
y=i * (self.style.title_font_size + self.spacing)
).text = title_line
Функция _make_title
выше было скопировано прямо из исходного кода для класса Graph
(класса, который наследует сам Line
). Единственное изменение в строке, обозначенной комментарием «Изменено», это было взято из функции, которая отображает метку оси x (потому что она центрирована по осям).
Этим вы можете заменить chart = pygal.Line
на chart = MyLineChart
, но оставьте остальную часть кода как есть. Возможно, вы также захотите изменить имя класса на что-то более значимое.
По умолчанию у вашего заголовка есть свойство text-anchor:middle
:
blockquote>
text-anchor
атрибут используется для выравнивания (начального, среднего или конечного выравнивания) строки текста относительно заданного точка.Вы можете вручную изменить это значение , то есть, на
end
в финальном файле SVG (откройте файл в текстовом редакторе и найдите.title
).