🧩 一、项目背景
在信息化时代背景下,班级管理逐步数字化,如何从原始的学生信息中提取有价值的信息,为班级管理、数据归档、学生发展提供可视化参考,是一个非常具有实践意义的课题。
因此,我使用 Python 开发了一个面向班级学生信息的分析系统,通过数据可视化手段展示学生性别比例、城市与省份分布、签名词云、成绩走势以及宿舍关系图等信息。
🎯 二、系统设计思想
本系统以 Excel 表格为数据源,围绕六个维度展开分析:
-
性别结构分析
-
城市、省份地域分布
-
签名文化分析
-
学习成绩趋势
-
宿舍关系网络图谱
-
头像识别与未来扩展(预留腾讯云人脸识别)
开发采用模块化结构,每个可视化功能均为一个独立函数,便于维护与扩展。
🛠 三、功能模块实现
1. 性别饼状图
通过 matplotlib
绘制性别比例饼图,展示班级男女分布直观情况。
2. 城市柱状图
调用 seaborn
显示前10生源城市,观察地域集中度。
3. 省份地图分布
利用 pyecharts
绘制中国地图,反映各省份生源数量,地图文件保存为 省份地图.html
。
4. 个性签名词云
使用 jieba
分词+wordcloud
库生成签名词云,呈现出班级文化倾向与常用词汇。
5. 成绩分布折线图
统计并绘制大一到大三各学期的平均名次折线,观察整体学习成绩变化。
6. 宿舍关系网络图
利用 networkx
构建宿舍内部连线图,分析宿舍关系和成员组成。
🧬 四、核心源码展示
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import networkx as nx
from wordcloud import WordCloud
import jieba
from pyecharts.charts import Map
from pyecharts import options as opts
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 读取数据
file_path = "D:\Desktop\软件222学生详细名单.xlsx"
df = pd.read_excel(file_path)
# 1. 性别饼状图
def plot_gender_pie():
gender_counts = df['性别'].value_counts()
plt.figure(figsize=(6, 6))
plt.pie(gender_counts, labels=gender_counts.index, autopct='%1.1f%%', colors=['lightblue', 'pink'])
plt.title('班级性别比例')
plt.show()
# 2. 城市柱状图(前10)
def plot_city_bar():
city_counts = df['生源城市'].value_counts().head(10)
plt.figure(figsize=(8, 6))
sns.barplot(x=city_counts.values, y=city_counts.index, palette='Blues_d')
plt.title("前十城市分布")
plt.xlabel("人数")
plt.ylabel("城市")
plt.show()
# 3. 省份中国地图分布(使用 pyecharts)
def plot_province_map():
province_counts = df['生源省份'].value_counts().to_dict()
map_chart = Map()
map_chart.add("生源地", [list(z) for z in province_counts.items()], "china")
map_chart.set_global_opts(title_opts=opts.TitleOpts(title="学生省份分布"))
map_chart.render("省份地图.html")
print("中国省份分布图已生成:省份地图.html")
# 4. 人生格言词云
def plot_signature_wordcloud():
text = ' '.join(df['人生格言'].dropna().astype(str).tolist())
cut_text = ' '.join(jieba.cut(text))
wc = WordCloud(font_path='msyh.ttc', background_color='white', width=800, height=600).generate(cut_text)
plt.figure(figsize=(10, 6))
plt.imshow(wc, interpolation='bilinear')
plt.axis('off')
plt.title('签名词云')
plt.show()
# 5. 成绩折线图(平均名次)
def plot_score_trend():
score_cols = ['大一上学期名次', '大一下学期名次', '大二上学期名次', '大二下学期名次', '大三上学期名次']
df_score = df[score_cols].dropna()
avg_ranks = df_score.mean(axis=1)
plt.figure(figsize=(10, 5))
plt.plot(avg_ranks.values, marker='o')
plt.title("成绩分布折线图(平均名次)")
plt.xlabel("学生编号")
plt.ylabel("平均名次")
plt.grid(True)
plt.show()
# 6. 宿舍分布关系图
def plot_dorm_network():
G = nx.Graph()
for dorm, group in df.groupby('寝室号'):
members = group['姓名'].tolist()
for i in range(len(members)):
for j in range(i + 1, len(members)):
G.add_edge(members[i], members[j], dorm=dorm)
plt.figure(figsize=(10, 10))
nx.draw(G, with_labels=True, node_color='skyblue', edge_color='gray', node_size=800, font_size=10)
plt.title("宿舍关系图")
plt.show()
# 调用全部函数
def run_all():
plot_gender_pie()
plot_city_bar()
plot_province_map()
plot_signature_wordcloud()
plot_score_trend()
plot_dorm_network()
if __name__ == '__main__':
run_all()