Python 数据分析与可视化 Day 5 - 数据可视化入门(Matplotlib Seaborn)
🎯 今日目标
- 掌握 Matplotlib 的基本绘图方法(折线图、柱状图、饼图)
- 掌握 Seaborn 的高级绘图方法(分类图、分布图、箱线图)
- 熟悉图像美化(标题、标签、颜色、风格)
- 完成一组学生成绩数据的可视化展示
🧱 一、Matplotlib 基础绘图
import matplotlib.pyplot as plt# 示例数据
names = ["张三", "李四", "王五", "赵六"]
scores = [88, 92, 75, 60]# 折线图
plt.plot(names, scores, marker="o")
plt.title("学生成绩折线图")
plt.xlabel("姓名")
plt.ylabel("成绩")
plt.grid(True)
plt.show()
✅ 常见图表类型
# 柱状图
plt.bar(names, scores)# 饼图
plt.pie(scores, labels=names, autopct="%.1f%%")# 保存图像
plt.savefig("charts/score_chart.png")
🌈 二、Seaborn 入门(更美观 + 高级)
import seaborn as sns
import pandas as pd# 示例 DataFrame
df = pd.DataFrame({"姓名": names,"成绩": scores,"性别": ["男", "女", "男", "女"]
})# 设置风格
sns.set_style("whitegrid")# 分类柱状图
sns.barplot(data=df, x="姓名", y="成绩", hue="性别")
plt.title("学生成绩(按性别)")
plt.show()
🎨 三、其他 Seaborn 图示示例
# 成绩分布直方图
sns.histplot(df["成绩"], bins=5)# 箱线图:成绩分布(可识别异常值)
sns.boxplot(data=df, x="性别", y="成绩")# 成绩与是否及格关系散点图(需添加字段)
sns.scatterplot(data=df, x="成绩", y="是否及格")
🧪 今日练习任务
使用 students_cleaned.csv
(前两天清洗的表格数据)文件,完成以下图表:
-
所有学生成绩的折线图 & 柱状图
-
不同性别的平均成绩柱状图
-
所有学生成绩分布直方图
-
学生成绩箱线图(按性别分组)
-
将所有图像保存为 PNG 图片到
charts/
文件夹import pandas as pd import matplotlib.pyplot as plt import seaborn as sns import osrc = {'font.sans-serif': 'Arial Unicode MS','axes.unicode_minus': False} # 设置中文字体支持(如 matplotlib 出现乱码) plt.rcParams['font.family'] = 'Arial Unicode MS' # Mac 用户可用 # plt.rcParams['font.sans-serif'] = ['SimHei'] # Windows 用户用这行 plt.rcParams['axes.unicode_minus'] = False# 路径设置 input_path = "data/students_cleaned.csv" output_dir = "charts" os.makedirs(output_dir, exist_ok=True)# 加载数据 df = pd.read_csv(input_path) print("✅ 已加载学生数据:") print(df.head())# -------- 图表 1:学生成绩折线图 -------- plt.figure(figsize=(8, 5)) plt.plot(df["姓名"], df["成绩"], marker='o') plt.title("学生成绩折线图") plt.xlabel("姓名") plt.ylabel("成绩") plt.grid(True) plt.tight_layout() plt.savefig(f"{output_dir}/成绩折线图.png") plt.close()# -------- 图表 2:学生成绩柱状图 -------- plt.figure(figsize=(8, 5)) plt.bar(df["姓名"], df["成绩"], color="skyblue") plt.title("学生成绩柱状图") plt.xlabel("姓名") plt.ylabel("成绩") plt.tight_layout() plt.savefig(f"{output_dir}/成绩柱状图.png") plt.close()# -------- 图表 3:不同性别的平均成绩柱状图 -------- plt.figure(figsize=(6, 4)) sns.set(style="whitegrid", rc=rc) avg_by_gender = df.groupby("性别")["成绩"].mean().reset_index() sns.barplot(data=avg_by_gender, x="性别", y="成绩", hue='性别', palette="Set2", legend=False) plt.title("不同性别的平均成绩") plt.tight_layout() plt.savefig(f"{output_dir}/性别平均成绩柱状图.png") plt.close()# -------- 图表 4:成绩分布直方图 -------- plt.figure(figsize=(6, 4)) sns.histplot(df["成绩"], bins=5, kde=True, color="orange") plt.title("成绩分布直方图") plt.xlabel("成绩") plt.tight_layout() plt.savefig(f"{output_dir}/成绩分布直方图.png") plt.close()# -------- 图表 5:成绩箱线图(按性别) -------- plt.figure(figsize=(6, 4)) sns.boxplot(data=df, x="性别", y="成绩", hue="性别", palette="Pastel1", legend=False) plt.title("成绩箱线图(按性别)") plt.tight_layout() plt.savefig(f"{output_dir}/成绩箱线图_按性别.png") plt.close()print(f"\n✅ 所有图表已生成并保存至:{output_dir}/")
✍️ 今日总结
- 掌握了 Matplotlib 基本图形绘制技巧
- 掌握了 Seaborn 的分类、分布图制作方法
- 能基于清洗后的数据完成完整的图形展示
- 理解了图表选择和美化对表达分析结论的重要性