【问题标题】:How to rotate seaborn barplot x-axis tick labels如何旋转seaborn barplot x轴刻度标签
【发布时间】:2020-08-05 16:39:08
【问题描述】:

我正在尝试获得一个条形图,将其 X 标签旋转 45°,以使其可读(因为存在重叠)。

len(genero) 是 7,len(filmes_por_genero) 是 20

我正在使用 MovieLens 数据集并制作一个图表,计算每种类型的电影数量。这是我现在的代码:

import seaborn as sns
import matplotlib.pyplot as plt
sns.set_style("whitegrid")

filmes_por_genero = filmes["generos"].str.get_dummies('|').sum().sort_values(ascending=False)
genero = filmes_com_media.index

chart = plt.figure(figsize=(16,8))
sns.barplot(x=genero,
            y=filmes_por_genero.values,
            palette=sns.color_palette("BuGn_r", n_colors=len(filmes_por_genero) + 4)
            )

chart.set_xticklabels(
    chart.get_xticklabels(), 
    rotation=45, 
    horizontalalignment='right'
)

这是完整的错误:

/usr/local/lib/python3.6/dist-packages/pandas/core/groupby/grouper.py in get_grouper(obj, key, axis, level, sort, observed, mutated, validate)
    623                 in_axis=in_axis,
    624             )
--> 625             if not isinstance(gpr, Grouping)
    626             else gpr
    627         )

/usr/local/lib/python3.6/dist-packages/pandas/core/groupby/grouper.py in __init__(self, index, grouper, obj, name, level, sort, observed, in_axis)
    254         self.name = name
    255         self.level = level
--> 256         self.grouper = _convert_grouper(index, grouper)
    257         self.all_grouper = None
    258         self.index = index

/usr/local/lib/python3.6/dist-packages/pandas/core/groupby/grouper.py in _convert_grouper(axis, grouper)
    653     elif isinstance(grouper, (list, Series, Index, np.ndarray)):
    654         if len(grouper) != len(axis):
--> 655             raise ValueError("Grouper and axis must be same length")
    656         return grouper
    657     else:

ValueError: Grouper and axis must be same length

【问题讨论】:

    标签: python pandas matplotlib seaborn


    【解决方案1】:
    import pandas as pd
    import mathplotlib.pyplot as plt
    import seaborn as sns
    sns.set_style("whitegrid")
    
    # data
    df = pd.read_csv('ml-25m/movies.csv')
    
    print(df.head())
    
       movieId                               title                                       genres
    0        1                    Toy Story (1995)  Adventure|Animation|Children|Comedy|Fantasy
    1        2                      Jumanji (1995)                   Adventure|Children|Fantasy
    2        3             Grumpier Old Men (1995)                               Comedy|Romance
    3        4            Waiting to Exhale (1995)                         Comedy|Drama|Romance
    4        5  Father of the Bride Part II (1995)                                       Comedy
    
    # clean genres
    df['genres'] = df['genres'].str.split('|')
    df = df.explode('genres').reset_index(drop=True)
    
    print(df.head())
    
       movieId             title     genres
    0        1  Toy Story (1995)  Adventure
    1        1  Toy Story (1995)  Animation
    2        1  Toy Story (1995)   Children
    3        1  Toy Story (1995)     Comedy
    4        1  Toy Story (1995)    Fantasy
    
    

    类型计数

    gc = df.genres.value_counts().to_frame()
    
    print(genre_count)
    
                        genres
    Drama                25606
    Comedy               16870
    Thriller              8654
    Romance               7719
    Action                7348
    Horror                5989
    Documentary           5605
    Crime                 5319
    (no genres listed)    5062
    Adventure             4145
    Sci-Fi                3595
    Children              2935
    Animation             2929
    Mystery               2925
    Fantasy               2731
    War                   1874
    Western               1399
    Musical               1054
    Film-Noir              353
    IMAX                   195
    

    剧情:sns.barplot

    ax

    fig, ax = plt.subplots(figsize=(12, 6))
    sns.barplot(x=gc.index, y=gc.genres, palette=sns.color_palette("BuGn_r", n_colors=len(genre_count) + 4), ax=ax)
    ax.set_xticklabels(ax.get_xticklabels(), rotation=45, horizontalalignment='right')
    plt.show()
    

    没有ax

    plt.figure(figsize=(12, 6))
    chart = sns.barplot(x=gc.index, y=gc.genres, palette=sns.color_palette("BuGn_r", n_colors=len(genre_count)))
    chart.set_xticklabels(chart.get_xticklabels(), rotation=45, horizontalalignment='right')
    plt.show()
    

    剧情:sns.countplot

    • 如果情节顺序无关紧要,请使用sns.countplot 跳过使用.value_counts()
    • 要订购countplot,必须使用order=df.genres.value_counts().index,因此如果需要降序排列,countplot 并不能真正让您免于需要.value_counts()
    fig, ax = plt.subplots(figsize=(12, 6))
    sns.countplot(data=df, x='genres', ax=ax)
    ax.set_xticklabels(ax.get_xticklabels(), rotation=45, horizontalalignment='right')
    plt.show()
    

    【讨论】:

      猜你喜欢
      • 2015-10-29
      • 1970-01-01
      • 1970-01-01
      • 2015-11-21
      • 2019-10-29
      • 2015-05-04
      • 2015-10-16
      • 1970-01-01
      相关资源
      最近更新 更多