如何按类别创建散点图并排序坐标轴值?含Python实现需求
用Seaborn实现符合需求的散点图解决方案
以下是针对你的需求的完整实现步骤,解决轴排序、数据分类、点大小调整和图例设置的问题:
步骤1:导入依赖库
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt
步骤2:数据预处理(解决轴排序+统计计数)
先处理数据的有序性,同时统计每个(学年、班级、主题)组合的活动次数:
# 假设你的数据表已读取为data DataFrame,这里先模拟示例数据 data = pd.DataFrame({ '活动学年': ['2021-2022', '2021-2022', '2022-2023', '2020-2021', '2022-2023', '2021-2022', '2020-2021', '2022-2023'], '学校班级': ['初一1班', '初二2班', '初一1班', '初三3班', '初二2班', '初一1班', '初二2班', '初一1班'], '文化活动主题': ['读书节', '艺术节', '读书节', '科技节', '艺术节', '读书节', '科技节', '艺术节'] }) # 1. 自定义学年排序(按时间先后),解决x轴排序问题 year_order = sorted(data['活动学年'].unique(), key=lambda x: int(x.split('-')[0])) data['活动学年'] = pd.Categorical(data['活动学年'], categories=year_order, ordered=True) # 2. 自定义班级排序(按年级+班级号),解决y轴排序问题 class_order = sorted(data['学校班级'].unique(), key=lambda x: (x[:2], int(x[2:-1]))) data['学校班级'] = pd.Categorical(data['学校班级'], categories=class_order, ordered=True) # 3. 统计每个组合的活动次数,用于调整点大小 count_data = data.groupby(['活动学年', '学校班级', '文化活动主题']).size().reset_index(name='活动次数')
步骤3:绘制散点图(解决分类、点大小、图例)
plt.figure(figsize=(10,6)) # 核心绘图代码 sns.scatterplot( data=count_data, x='活动学年', y='学校班级', hue='文化活动主题', # 按主题分类上色 size='活动次数', # 按活动次数调整点大小 sizes=(150, 800), # 控制点的大小范围 alpha=0.7, # 增加透明度避免点重叠遮挡 palette='Set2' # 可选配色方案,也可以自定义颜色 ) # 调整图例位置,避免遮挡图表 plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', title='文化活动主题\n(点大小=活动次数)') # 添加图表标签和标题 plt.title('各学年班级文化活动分布统计', fontsize=14) plt.xlabel('活动学年', fontsize=12) plt.ylabel('学校班级', fontsize=12) # 自动调整布局,确保图例完整显示 plt.tight_layout() plt.show()
关键问题解决说明
- 轴排序:通过
pd.Categorical将学年、班级设置为有序类别,指定自定义排序规则,替代默认的字母排序。如果你的数据学年/班级格式不同,只需修改排序逻辑即可。 - 数据分类:使用
hue参数绑定「文化活动主题」,自动为不同主题分配不同颜色,实现分类展示。 - 点大小调整:先通过
groupby统计每个组合的活动次数,再用size参数绑定该计数字段,sizes参数控制大小范围,让次数多的点更醒目。 - 图例设置:通过
bbox_to_anchor将图例移到图表外侧,避免遮挡,同时自定义图例标题,让含义更清晰。
内容的提问来源于stack exchange,提问作者Brindavoine
相关产品推荐
相关产品推荐

