使用Seaborn绘制年龄计数图仅显示单块图形的问题排查
问题:Seaborn计数图与预期效果不符
期望实现的效果

我使用的代码
from pandas import * from matplotlib.pyplot import * from math import * import numpy as num import pandas as pd import matplotlib import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D %matplotlib inline import seaborn as sns import statistics users = pd.read_table("/content/drive/MyDrive/Colab Notebooks/Datasets/users.dat",sep="::",names=['UserID','Gender','Age','Occupation','ZipCode'],encoding='latin-1') users['Age'].value_counts() sns.countplot(users["Age"])
实际得到的效果

已做的排查
- 更换过数据文件确认数据正确性
- 检查代码拼写错误
- 尝试使用单引号索引列
- 目前怀疑是数据本身的问题
数据文件来源:Google Drive(链接已省略)
解决方案
问题出在Age列的排序逻辑上:Seaborn的countplot默认会按数据中类别出现的顺序或频率排序,而你期望的是按年龄从小到大的逻辑顺序展示。
步骤1:确认Age列的数据类型
先查看Age列的类型:
print(users['Age'].dtype)
这类数据里Age通常是字符串类型,而非数值型,所以无法自动按数值排序。
步骤2:设置有序分类或指定排序顺序
两种方法任选其一:
方法一:将Age转为有序分类
# 定义年龄的逻辑顺序 age_order = ['1', '18', '25', '35', '45', '50', '56'] # 转换为有序分类 users['Age'] = pd.Categorical(users['Age'], categories=age_order, ordered=True) # 绘制计数图 sns.countplot(x='Age', data=users) plt.show()
方法二:在countplot中直接指定order参数
age_order = ['1', '18', '25', '35', '45', '50', '56'] sns.countplot(x='Age', data=users, order=age_order) plt.show()
执行后就能得到和预期一致、按年龄逻辑顺序排列的计数图。
内容的提问来源于stack exchange,提问作者Migs Panganiban
相关产品推荐
相关产品推荐

