Center-align Pygal 图表中的标题

Center-align title in Pygal chart

我正在用 Pygal 制作折线图。我想将图表的标题居中,但我不知道该怎么做。

我尝试查看 Pygal 文档,但找不到任何与标题对齐相关的内容。这是我拥有的:

custom_style = Style(
    background = 'transparent',
    font_family='Avenir',
    colors = ['#14A1FF', '#14FF47'],
    opacity = .5)

chart = pygal.Line(
    style=custom_style, 
    print_values=True, 
    interpolate='hermite', 
    fill=True, dots_size=4, 
    show_y_guides=False,
    legend_at_bottom=True,
    legend_at_bottom_columns=2)

chart.title = "Rubik's Cube Solve Times Recorded Over Five Days"
chart.x_labels = ["1", "2", "3", "4", "5"]
chart.x_title = "Day"
chart.y_title = "Seconds"
chart.add("Average of 100", ao100)
chart.add("Average of 25", ao25)
chart.render_to_file('times.svg')

默认你的标题有 属性 text-anchor:middle:

text-anchor attribute is used to align (start-, middle- or end-alignment) a string of text relative to a given point.

您可以手动 change this value,即在结局 svg 文件中 end(在文本编辑器中打开文件并找到 .title)。

如评论中所述,图形标题相对于图形而不是轴居中。此行为在渲染函数中 hard-coded,没有配置选项可以改变它。

一个解决方法是创建您自己的 class 继承自 pygal.Line 和 over-rides 呈现标题(不是很大)的函数:

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 函数直接从 the source code for the Graph class 复制而来(Line 本身继承自 class)。唯一的变化是在注释 'Modified' 指示的行中,这是从呈现 x 轴标签的函数中获取的(因为它以轴为中心)。

有了这个,您可以用 chart = MyLineChart 替换 chart = pygal.Line,但保留其余代码。您可能还想将 class 的名称更改为更有意义的名称。