matplotlib Seaborn正在打乱X轴刻度标签,不再指条形图

k75qkfdt  于 2023-06-06  发布在  其他
关注(0)|答案(1)|浏览(171)

我正试图写一个小套件的定期海运阴谋,沿着造型,以允许定期生产类似风格的阴谋。我在做条形图。大多数情况下,这很好,但如果我在x轴上有太多的值,特别是,如果名称太长和太多,轴刻度标签会完全混乱,这意味着图变得无用。
我真的很感激任何可以帮助我使x轴上的刻度总是信息丰富的建议,当我有一个场景,我有很多值标签的数据,我试图可视化。我意识到我可以把标签贴在条形图上,但我想把它作为x轴的刻度。
这里有一个x轴变得无意义的例子。我使用的数据取自这里https://footystats.org/england/premier-league/xg

下面是我的示例代码:

def bar_plot(self,
            df: pd.DataFrame,
            x_var: str,
            y_var: str,
            x_label: str,
            y_label: str,
            y_line: float,
            rotate_x_labels: bool = False,
            export: bool = False,
            filepath: str = None):
    '''
    produces a bar plot. 
    '''
    plt.figure(figsize=self.figsize)

    ax = sns.barplot(data=df,
                    x=x_var,
                    y=y_var,
                    palette=self.plot_elems_palette)
    
    ax.spines['bottom'].set_linewidth(0.75)
    ax.spines['left'].set_linewidth(0.75)

    ax.tick_params(axis='x', which='major', width=0.5)
    ax.tick_params(axis='x', which='minor', width=0.5)
    ax.tick_params(axis='y', which='major', width=0.5)
    ax.tick_params(axis='y', which='minor', width=0.5)

    if x_label:
        ax.set_xlabel(x_label, fontweight='bold')

    if y_label:
        ax.set_ylabel(y_label, fontweight='bold')

    if y_line is not None:
        ax.axhline(y_line, 
                    color=self.plot_elems_colour, 
                    linestyle='--',
                    linewidth=0.5)

    if rotate_x_labels:
        ax.tick_params(axis='x', rotation=45)

    ax.tick_params(axis='both', labelsize=(self.font_size*0.5), rotation=45)

    if export:
        if filepath:
            plt.savefig(filepath, 
                        dpi=DPI, 
                        bbox_inches=BBOX)
        else:
            raise ValueError('filepath must be specified if export is True')

    plt.show()

这一切都存在于一个类中,它初始化了我所有绘图方法的默认值,看起来像这样:

class PlotBuilder:
    def __init__(self, 
                 figsize: tuple = FIGSIZE,
                 background: str = BACKGROUND,
                 body_colour: str = BODY_COLOUR,
                 plot_elems_colour: str = PLOT_ELEMS_COLOUR,
                 plot_elems_palette: list = generate_colour_palette(BODY_COLOUR),
                 grid_colour: str = GRID_COLOUR,
                 font: str = FONT,
                 font_size: int = FONT_SIZE):
        self.figsize = figsize
        self.background = background
        self.body_colour = body_colour
        self.plot_elems_colour = plot_elems_colour
        self.plot_elems_palette = plot_elems_palette
        self.grid_colour = grid_colour
        self.font = font
        self.font_size = font_size
g52tjvyc

g52tjvyc1#

标签看起来很混乱,因为它们的“中心”在刻度下方对齐。如果您将标签的右端对齐在刻度下方,则在视觉上会更令人愉悦:

import seaborn as sns

ax = sns.barplot(x=[f'very long label for bar #{i}' for i in range(10)], y=range(10))
plt.xticks(rotation=45, ha='right')

相关问题