使用Matplotlib实现多种数据可视化图表
基础柱状图绘制
通过plt.bar()函数可创建垂直柱状图。为确保中文正常显示,需设置字体为'SimHei',同时关闭负号的Unicode处理以正确展示负数值。
import matplotlib.pyplot as plt
import pandas as pd
# 加载并排序数据
df = pd.read_excel("scores.xlsx")
df = df.sort_values(by="分数", ascending=False)
# 配置中文字体与负号显示
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams['axes.unicode_minus'] = False
# 绘制柱状图
plt.bar(x=df["姓名"], height=df["分数"], color="lightblue", label="成绩")
plt.xlabel("学生姓名")
plt.ylabel("考试得分")
plt.title("一年级期末成绩分布", fontsize=16, fontweight='bold')
plt.xticks(rotation=45)
plt.ylim(0, max(df["分数"]) + 10)
plt.legend()
plt.show()
分组柱状图优化实现
当需要对比多个类别的多组数据时,可通过调整x轴位置实现分组效果。每组之间留出适当间距,避免视觉重叠。
width = 0.15 # 单个柱子宽度
gap = 0.1 # 组间间隔
labels = df["影片名"]
days = ["第一天票房", "第二天票房", "第三天票房", "第四天票房", "第五天票房"]
for idx, day in enumerate(days):
positions = [i + gap * idx for i in range(len(labels))]
plt.bar(positions, df[day], width=width, label=day)
plt.xlabel("电影名称")
plt.ylabel("票房(万元)")
plt.title("五日票房走势对比")
plt.xticks([i + gap*2 for i in range(len(labels))], labels)
plt.legend(ncol=3)
plt.tight_layout()
plt.show()
堆叠式柱状图与文本标注
利用bottom参数实现数据堆叠,并结合plt.text()在柱内添加数值标签,增强信息可读性。
subjects = ["语文", "数学", "英语"]
colors = ["#FF9999", "#66B2FF", "#99FF99"]
bottom_values = [0] * len(df)
for i, subj in enumerate(subjects):
plt.bar(df["姓名"], df[subj], bottom=bottom_values, label=subj, color=colors[i])
# 添加科目分数标签
for j, val in enumerate(df[subj]):
total_height = sum(df[s].iloc[j] for s in subjects[:i+1])
plt.text(j, total_height - 5, f'{val}', ha='center', va='bottom', color='white', fontweight='bold')
bottom_values = [b + v for b, v in zip(bottom_values, df[subj])]
plt.ylabel("总分")
plt.title("学生成绩堆叠分析")
plt.legend(loc='upper center', ncol=3)
plt.show()
横向条形图展示
使用plt.barh()生成水平方向的条形图,适用于标签较长或类别较多的情况。
plt.barh(y=df["姓名"], width=df["分数"], height=0.6, color='skyblue')
plt.xlabel("成绩")
plt.ylabel("学生")
plt.title("成绩排名(从下至上)")
plt.grid(axis='x', alpha=0.3)
plt.show()
折线趋势图绘制
多系列折线图适合表现时间序列变化。通过不同颜色和标记区分各数据流。
categories = ["蔬菜", "水果", "食品", "用品"]
colors = ['red', 'green', 'blue', 'orange']
for cat in categories:
plt.plot(df["时间"], df[cat], marker='o', markersize=6, label=cat, color=colors[categories.index(cat)])
plt.xlabel("日期")
plt.ylabel("销量")
plt.title("商品周销售趋势")
plt.legend()
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()
饼图与环形图应用
plt.pie()支持比例分布可视化,可通过explode突出特定扇区,autopct显示百分比。
# 基础饼图
plt.pie(df["第一次"], labels=df["姓名"], autopct='%1.1f%%', startangle=90,
explode=(0.05, 0.05, 0.1), shadow=True)
plt.title("首次测试成绩占比")
plt.axis('equal')
plt.show()
# 双层饼图模拟环形图
plt.pie(df["第一次"], radius=1, autopct='%1.1f%%', pctdistance=0.85)
plt.pie(df["第二次"], radius=0.7, autopct='%1.1f%%', pctdistance=0.75, labeldistance=0.6)
plt.title("两次测试对比")
plt.axis('equal')
plt.legend(bbox_to_anchor=(1.2, 1))
plt.show()
子图布局管理
使用subplots或add_subplot组织多个图表。也可通过add_axes精确控制子图位置。
fig = plt.figure(figsize=(10, 6))
# 方法一:add_subplot网格布局
ax1 = fig.add_subplot(2, 2, 1)
ax1.plot(df["班级"], df["销售量"])
ax1.set_title("销售量趋势")
ax2 = fig.add_subplot(2, 2, 2)
ax2.bar(df["班级"], df["毛利率"])
ax2.set_title("毛利率柱状图")
# 自定义位置子图
left, bottom, w, h = 0.65, 0.65, 0.2, 0.2
ax_small = fig.add_axes([left, bottom, w, h])
ax_small.plot(df["姓名"], df["分数"], 'g-')
ax_small.set_title("缩略图")
plt.tight_layout()
plt.show()
参考线辅助分析
使用axhline添加水平参考线,如平均值、阈值等,帮助快速识别数据特征。
avg_score = df["第一次"].mean()
plt.bar(df["姓名"], df["第一次"], color='cornflowerblue', label='原始成绩')
plt.axhline(y=avg_score, color='darkred', linestyle='--', linewidth=2, label=f'平均分: {avg_score:.1f}')
plt.title("成绩对比与平均水平")
plt.legend()
plt.show()
