如何更改分类 x 轴的绘图顺序

Posted

技术标签:

【中文标题】如何更改分类 x 轴的绘图顺序【英文标题】:How to change the plot order of the categorical x-axis 【发布时间】:2020-10-19 04:31:10 【问题描述】:

我得到了一个如下所示的数据框:

df:

Time of Day Season  value
Day        Shoulder 30.581606
Day        Summer   25.865560
Day        Winter   42.644530
Evening    Shoulder 39.954759
Evening    Summer   32.053458
Evening    Winter   53.678297
Morning    Shoulder 32.171245
Morning    Summer   25.070815
Morning    Winter   42.876667
Night      Shoulder 22.082042
Night      Summer   17.510290
Night      Winter   33.262356

我正在使用 seaborn 使用以下代码绘制线图中的值:

g = sns.lineplot(x='Time of Day',y='value',data=df,hue='Season')

它会生成以下图表:

图表的问题是 x 轴的顺序不是所需的顺序。我想将a轴值的顺序更改为['Morning','Day','Evening','Night']。我尝试使用以下命令对其进行更改:

g.set_xticklabels(['Morning','Day','Evening','Night'])

但是这个命令只改变x轴的标签,而不是数据点的顺序。谁能帮我解决这个问题?

【问题讨论】:

【参考方案1】: 使用pandas.Categorical 设置Time of Day 在数据框中的分类顺序。
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

data = 'Time of Day': ['Day', 'Day', 'Day', 'Evening', 'Evening', 'Evening', 'Morning', 'Morning', 'Morning', 'Night', 'Night', 'Night'],
        'Season': ['Shoulder', 'Summer', 'Winter', 'Shoulder', 'Summer', 'Winter', 'Shoulder', 'Summer', 'Winter', 'Shoulder', 'Summer', 'Winter'],
        'value': [30.581606, 25.865560000000002, 42.644529999999996, 39.954759, 32.053458, 53.678297, 32.171245, 25.070815, 42.876667, 22.082042, 17.510289999999998, 33.262356]

# create dataframe
df = pd.DataFrame(data)

# set categorical order
df['Time of Day'] = pd.Categorical(df['Time of Day'],
                                   categories=['Morning', 'Day', 'Evening', 'Night'],
                                   ordered=True)

# plot
g = sns.lineplot(x='Time of Day', y='value', data=df, hue='Season')
plt.legend(bbox_to_anchor=(1.04,0.5), loc="center left", borderaxespad=0)

【讨论】:

【参考方案2】:

如果您不想将其更改为分类列并进行有序绘图?!

# here dictionary value in map() will decide which value should be first and next
df_sort = df.sort_values('Time of Day'
                         , key=lambda col: col.map(
                                  'Morning':10
                                  ,'Evening':3
                                  ,'Day':2
                                  ,'Night':4))
sns.lineplot(x='Time of Day', y='value', data=df_sort, hue='Season');

【讨论】:

以上是关于如何更改分类 x 轴的绘图顺序的主要内容,如果未能解决你的问题,请参考以下文章

Python 的 Matplotlib 绘图顺序错误

ggplot2按y轴的比例排序分类堆积条

是否有可能实现与多个分类轴的Shiny情节交互?

朴素贝叶斯和 SVM 分类 - 如何在 x y 轴上绘制精度?

如何定义matlab里面绘图的x,y轴的范围

用css 如何控制英文网站中分类顺序是按照英文26字母顺序排序的