【问题标题】:How to keep seaborn xtick labels the same for each plot iteration?如何在每次绘图迭代中保持 seaborn xtick 标签相同?
【发布时间】:2020-02-11 23:24:44
【问题描述】:

我有三个客户的付款数据,每次付款的月份和年份:

              user_id  amount  Mon_Year
2076273          1664  245.16  Jan-2019
3682561          1664  122.58  Jul-2019
5437947          1664  109.43  Nov-2019
6067277          1664  218.86  Dec-2019
1911317          3396  319.00  Jan-2019
6079810          3396  360.00  Dec-2019
1961388          4192  104.28  Jan-2019
2500575          4192  104.28  Mar-2019
2709024          4192  104.28  Apr-2019
3049894          4192  104.28  May-2019

我可以为每个客户创建一个情节:

for user in df.user_id.unique():
    temp = df[df['user_id']==user]
    plt.figure(figsize=(15,5))
    ax = sns.barplot(x="Mon_Year", y="amount", data=temp,ci=None)
    ax.set_title(f'transactions for user: {user}')
    ax.set_xticklabels(ax.get_xticklabels(),rotation=30)
    plt.show()

但是我希望每个图都具有相同的 xticks(Mon_Year 列中的所有日期),因此图具有相同的比例。

情节 #2 缺少几个月,所以理想情况下它会有空条。我将能够更轻松地比较客户,并查看哪些月份没有花费。像这样:

我尝试使用xlim 但完全破坏了它,我认为这仅适用于数字数据,但Mon_Year 是分类的。

对于这个示例 df,xticks 的范围从 2019 年 1 月到 2019 年 12 月:

df.Mon_Year.unique()

array(['Jan-2019', 'Jul-2019', 'Nov-2019', 'Dec-2019', 'Mar-2019',
       'Apr-2019', 'May-2019'], dtype=object)

请注意,在 df 中,我为每个客户按月顺序对它们进行了预排序。

如何使用分类数据设置 xlim 并在每次迭代时保持相同?

亩样本df:

import pandas as pd
import seaborn as sns

df = pd.DataFrame({'index': pd.Series([2076273, 3682561, 5437947, 6067277, 1911317, 6079810, 1961388, 2500575, 2709024, 3049894],dtype='int64',index=pd.RangeIndex(start=0, stop=10, step=1)), 'user_id': pd.Series(['1664', '1664', '1664', '1664', '3396', '3396', '4192', '4192', '4192', '4192'],dtype='object',index=pd.RangeIndex(start=0, stop=10, step=1)), 'amount': pd.Series([245.16, 122.58, 109.43, 218.86, 319.0, 360.0, 104.28, 104.28, 104.28, 104.28],dtype='float64',index=pd.RangeIndex(start=0, stop=10, step=1)), 'Mon_Year': pd.Series(['Jan-2019', 'Jul-2019', 'Nov-2019', 'Dec-2019', 'Jan-2019', 'Dec-2019', 'Jan-2019', 'Mar-2019', 'Apr-2019', 'May-2019'],dtype='object',index=pd.RangeIndex(start=0, stop=10, step=1))}, index=pd.RangeIndex(start=0, stop=10, step=1))

【问题讨论】:

    标签: python seaborn


    【解决方案1】:

    我修改了您的循环,将所有月份-年份值添加到 temp 数据框中。这将在新行中添加 indexamount 的 NaN 值,并在结果图中添加一个空白区域。

    mon_year = ['Jan-2019', 'Feb-2019', 'Mar-2019', 'Apr-2019', 'May-2019', 'Jun-2019', 'Jul-2019','Aug-2019', 'Sept-2019', 'Oct-2019', 'Nov-2019', 'Dec-2019']
    
    for user in df.user_id.unique():
        temp = df[df['user_id']==user].set_index('Mon_Year')
        temp = temp.reindex(mon_year)
        temp = temp.reset_index()
        plt.figure(figsize=(15,5))
        ax = sns.barplot(x="Mon_Year", y="amount", data=temp,ci=None)
        ax.set_title(f'transactions for user: {user}')
        ax.set_xticklabels(ax.get_xticklabels(),rotation=30)
        plt.show()
    

    【讨论】:

    • 谢谢,我会试试这个并报告:)
    • 好的,它适用于我的大多数用户。有些人在“Mon_Year”期间支付了不止一笔款项,这会导致问题。我需要解决这个问题。否则它可以工作,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2017-12-10
    • 2017-08-06
    • 2021-11-30
    • 1970-01-01
    • 2020-08-19
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多