为什么sns.relplot绘制的x轴month-year值未按正确顺序排列
问题原因
x轴顺序错乱的核心原因是month-year列在读取后为字符串(object)类型,Seaborn绘图时会默认按照字符串的字典序对x轴类别进行排序,而非你预期的时间先后顺序:
- 按字典序规则,首字母A开头的
Apr-19会排在首字母F开头的Feb-19前面,和实际时间顺序完全不符 - 跨年份的场景下还会出现
Jan-20排在Dec-19前面的排序错误
修复方案
先将该列转换为datetime类型,再绘图即可自动按时间顺序排列x轴:
import pandas as pd import seaborn as sns import matplotlib.dates as mdates # 读取数据、修改列名步骤保持不变 data = pd.read_csv('personal expenses without rent.csv') data.columns = ['month-year', 'Expenses (USD)', 'unnamed', 'unnamed', 'unnamed', 'unnamed'] # 转换列格式为datetime,匹配%b-%y(月份英文缩写+两位年份)的格式 data['month-year'] = pd.to_datetime(data['month-year'], format='%b-%y') # 绘图,此时x轴会自动按时间顺序排列 g = sns.relplot(x = 'month-year', y = 'Expenses (USD)', data = data, kind = 'scatter') # 可选:如果需要x轴仍显示Feb-19这类原始缩写格式,补充以下配置 g.ax.xaxis.set_major_formatter(mdates.DateFormatter('%b-%y')) # 可选:旋转x轴标签避免文字重叠 g.ax.tick_params(axis='x', rotation=45)
内容的提问来源于stack exchange,提问作者Riku Mochizuki
相关产品推荐
相关产品推荐

