PYTHON基础技能 – 数据可视化中Matplotlib的10个精美图表
引言
Matplotlib作为Python中最受欢迎的绘图库之一,能够轻松应对从简单到复杂的数据可视化需求。本文将详细介绍10种常用且美观的图表类型及其绘制方法,帮助读者更好地理解和应用Matplotlib。
1. 基础设置
首先,我们需要进行一些基本的设置,以确保图表的美观性和可读性。
import matplotlib.pyplot as plt
import numpy as np
plt.style.use('seaborn') # 使用seaborn风格
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文显示
plt.rcParams['axes.unicode_minus'] = False # 正常显示负号
2. 条形图 – 显示不同类别的数量差异
条形图非常适合比较不同类别之间的数值大小。例如,展示某公司不同部门的销售额。
# 数据准备
labels = ['市场部', '销售部', '技术部']
sales = [120, 200, 150]
# 创建条形图
plt.figure(figsize=(8, 6))
plt.bar(labels, sales, color='skyblue')
plt.title('各部门销售额')
plt.xlabel('部门')
plt.ylabel('销售额(万元)')
plt.show()
输出:你会看到一个清晰的条形图,展示了每个部门的销售额。这种图直观地反映了各个部门之间的业绩差异。
3. 折线图 – 展示随时间变化的趋势
折线图用来观察数据随时间的变化趋势再合适不过了。例如,股票价格波动。
# 生成数据
dates = np.arange(10)
prices = np.random.randn(10).cumsum()
# 绘制折线图
plt.figure(figsize=(10, 5))
plt.plot(dates, prices, marker='o', linestyle='-', color='g')
plt.title('股价走势')
plt.xlabel('日期')
plt.ylabel('价格')
plt.grid(True)
plt.show()
输出:一个简洁的折线图展现在眼前,清楚地表明了股价的变动轨迹。标记点(marker='o'
)增加了可读性。
4. 散点图 – 探索变量间的关系
散点图能帮助我们发现两个变量之间的关系或模式。例如,研究收入与年龄之间的关联。
# 假设数据
ages = np.random.randint(20, 60, size=100)
incomes = ages * 1000 + np.random.normal(0, 50000, size=ages.shape)
# 绘制散点图
plt.figure(figsize=(10, 6))
plt.scatter(ages, incomes, alpha=0.6, edgecolors='w')
plt.title('年龄与收入关系')
plt.xlabel('年龄')
plt.ylabel('年收入')
plt.grid(True)
plt.show()
输出:这个散点图不仅美观,还揭示了年龄越大,收入越高的趋势。透明度(alpha=0.6
)避免了数据点重叠带来的视觉混乱。
5. 饼图 – 表示各部分占比
饼图特别适合展示整体中的各个部分所占的比例。例如,不同产品的市场份额。
# 数据
products = ['产品A', '产品B', '产品C', '产品D']
market_share = [30, 25, 20, 25]
# 绘制饼图
plt.figure(figsize=(8, 8))
plt.pie(market_share, labels=products, autopct='%1.1f%%', startangle=140)
plt.title('产品市场份额')
plt.axis('equal') # 确保饼图是圆形的
plt.show()
输出:一张清晰的饼图,精确地表现了每种产品在市场上的份额比例。这有助于快速了解哪个产品最受欢迎。
6. 直方图 – 分析数据分布
直方图用于显示数据的分布情况,特别是在连续数据集上非常有用。例如,可以用来分析考试成绩的分布情况。
# 生成模拟数据
scores = np.random.normal(loc=70, scale=15, size=1000)
# 绘制直方图
plt.figure(figsize=(10, 6))
plt.hist(scores, bins=20, edgecolor='black', alpha=0.7)
plt.title('考试成绩分布')
plt.xlabel('分数')
plt.ylabel('人数')
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()
输出:直方图清晰地展示了成绩的分布情况,可以看到大多数学生的分数集中在某个区间内,边缘分布的学生较少。这有助于老师了解学生的学习情况。
7. 箱形图 – 查看数据异常值
箱形图是一种统计图表,用于显示一组数据分散情况的五数概括(最小值、下四分位数、中位数、上四分位数、最大值),并能有效识别异常值。
# 生成数据
data = np.random.normal(loc=0, scale=1, size=(100, 4))
# 绘制箱形图
plt.figure(figsize=(10, 6))
plt.boxplot(data, vert=False, patch_artist=True,
boxprops=dict(facecolor="skyblue", color="black"),
capprops=dict(color="black"),
whiskerprops=dict(color="black"),
flierprops=dict(color="red", markeredgecolor="red"),
medianprops=dict(color="black"))
plt.title('数据分布箱形图')
plt.xlabel('数值')
plt.grid(axis='x', linestyle='--', alpha=0.7)
plt.show()
输出:箱形图展示了数据的五数概括,并且红色的点表示异常值。这样的图对于数据分析非常有帮助,能够快速发现数据中的异常情况。
8. 热力图 – 观察数据相关性
热力图通常用于观察矩阵数据的相关性或密度。例如,可以用来查看不同城市之间的气温分布。
# 生成数据
np.random.seed(0)
temperatures = np.random.rand(10, 10)
# 绘制热力图
plt.figure(figsize=(10, 8))
plt.imshow(temperatures, cmap='hot', interpolation='nearest')
plt.colorbar(label='温度')
plt.title('城市气温分布')
plt.xticks(range(10), ['城市%d' % i for i in range(10)])
plt.yticks(range(10), ['城市%d' % i for i in range(10)])
plt.xlabel('城市')
plt.ylabel('城市')
plt.grid(False)
plt.show()
输出:热力图展示了不同城市之间的气温分布情况,颜色越深表示温度越高。这样的图对于地理学研究非常有用,能够直观地看出不同地区的温度差异。
9. 雷达图 – 比较多个维度
雷达图用于展示多维度数据,并且能够比较不同对象在各个维度上的表现。例如,可以用来比较不同员工在各项能力上的得分。
# 准备数据
categories = ['技能A', '技能B', '技能C', '技能D', '技能E']
values = [4, 2, 5, 1, 3]
# 绘制雷达图
angles = np.linspace(0, 2 * np.pi, len(categories), endpoint=False).tolist()
values += values[:1] # 闭合图形
angles += angles[:1]
fig, ax = plt.subplots(figsize=(8, 8), subplot_kw=dict(polar=True))
ax.fill(angles, values, color='skyblue', alpha=0.25)
ax.set_theta_offset(np.pi / 2)
ax.set_theta_direction(-1)
ax.set_xticks(angles[:-1])
ax.set_xticklabels(categories)
ax.set_rlabel_position(0)
plt.title('员工技能雷达图')
plt.show()
输出:雷达图展示了员工在各个技能上的得分情况,颜色填充使得图表更加美观。这样的图对于人力资源管理非常有用,能够快速了解员工的优势和不足。
10. 点状图 – 显示离散数据
点状图用于展示离散数据点,特别适用于小样本数据集。例如,可以用来展示不同班级的平均成绩。
# 准备数据
class_labels = ['一班', '二班', '三班', '四班']
class_averages = [75, 80, 85, 90]
# 绘制点状图
plt.figure(figsize=(10, 6))
plt.scatter(class_labels, class_averages, s=100, color='green', marker='o', edgecolors='black')
plt.title('班级平均成绩')
plt.xlabel('班级')
plt.ylabel('平均成绩')
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()
输出:点状图展示了不同班级的平均成绩,大点(s=100
)使得图表更加醒目。这样的图对于教育评估非常有用,能够快速了解不同班级的成绩情况。
实战案例:销售数据可视化
假设你是一家公司的数据分析师,你需要为销售团队制作一份销售报告。报告中需要包含以下信息:
1. 不同产品的销售额对比。2. 过去一年的月度销售额趋势。3. 不同地区销售额的分布情况。
我们可以使用前面介绍的各种图表来完成这份报告。
产品销售额对比
# 数据
products = ['产品A', '产品B', '产品C', '产品D']
sales = [120, 200, 150, 180]
# 绘制条形图
plt.figure(figsize=(10, 6))
plt.bar(products, sales, color='skyblue')
plt.title('产品销售额对比')
plt.xlabel('产品')
plt.ylabel('销售额(万元)')
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()
月度销售额趋势
# 生成数据
months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
monthly_sales = np.random.randint(100, 200, size=12)
# 绘制折线图
plt.figure(figsize=(10, 6))
plt.plot(months, monthly_sales, marker='o', linestyle='-', color='g')
plt.title('月度销售额趋势')
plt.xlabel('月份')
plt.ylabel('销售额(万元)')
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()
地区销售额分布
# 数据
regions = ['华东', '华南', '华北', '华西']
regional_sales = [300, 250, 200, 150]
# 绘制饼图
plt.figure(figsize=(8, 8))
plt.pie(regional_sales, labels=regions, autopct='%1.1f%%', startangle=140)
plt.title('地区销售额分布')
plt.axis('equal')
plt.show()
通过这些图表,销售团队可以快速了解不同产品的销售额、月度销售额的趋势以及不同地区的销售额分布情况,从而制定相应的策略。
总结
本文详细介绍了Matplotlib中10种常用的图表类型及其绘制方法。这些图表不仅美观实用,还能帮助用户更好地理解和分析数据。通过实际案例的应用,我们进一步展示了如何利用这些图表来进行有效的数据可视化。希望本文能帮助读者掌握Matplotlib的核心功能,提高数据分析的能力。