如何更改分类 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 轴的绘图顺序的主要内容,如果未能解决你的问题,请参考以下文章