Python使用Matplotlib绘制基础可视化图表

在Python中进行数据可视化,最常用且功能强大的库是 Matplotlib。它可以帮助你轻松绘制出柱状图、折线图、饼图、散点图、直方图、箱线图、热力图、雷达图等。

在开始之前,请确保你已经安装了Matplotlib库。如果没有,可以在终端或命令行中运行以下命令进行安装:

复制代码
pip install matplotlib

1.折线图 (Line Chart)

折线图非常适合展示数据随时间变化的趋势。

python 复制代码
import matplotlib.pyplot as plt

# 解决中文显示问题 (Windows系统使用SimHei,Mac系统可换成PingFang SC)
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

# 准备数据
months = ["1月", "2月", "3月", "4月", "5月", "6月"]
sales =[78,85,74,95,84,80]

# 绘制折线图
plt.figure(figsize=(8, 5))  # 设置画布大小
plt.plot(months, sales, marker="o", color="blue", linewidth=2, label="销售额")

# 添加标题和标签
plt.title("上半年销售额趋势")
plt.xlabel("月份")
plt.ylabel("销售额(元)")
plt.legend()  # 显示图例
plt.grid(True, linestyle="--", alpha=0.5)  # 添加网格线

plt.show()

效果图:

2.柱状图 (Bar Chart)

柱状图适合比较不同类别之间的数值大小。

python 复制代码
import matplotlib.pyplot as plt

# 解决中文显示问题
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

# 准备数据
products = ["手机", "电脑", "耳机", "平板", "手表"]
sales =[78,85,74,95,84]

# 绘制柱状图
plt.figure(figsize=(8, 5))
plt.bar(products, sales, color="orange", width=0.6)

# 在柱子顶部添加具体的数值标签
for index, value in enumerate(sales):
    plt.text(index, value + 10, str(value), ha="center")

# 添加标题和标签
plt.title("不同产品销量对比")
plt.xlabel("产品")
plt.ylabel("销量")

plt.show()

效果图:

3.饼图 (Pie Chart)

饼图主要用于展示各部分数据在整体中的占比关系。

python 复制代码
import matplotlib.pyplot as plt

# 解决中文显示问题
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

# 准备数据
channels = ["搜索引擎", "短视频", "社交媒体", "直接访问", "邮件"]
users =[1000, 500, 300, 400, 200]

# 绘制饼图
plt.figure(figsize=(7, 7))
plt.pie(
    users, 
    labels=channels, 
    autopct="%.1f%%",  # 显示百分比,并保留1位小数
    startangle=90,     # 设置饼图起始角度
    counterclock=False # 按顺时针方向绘制
)

plt.title("用户来源占比")
plt.show()

效果图

4.散点图 (Scatter Plot)

测试数据:模拟了100名学生的"每日学习时长"与"期末考试成绩"之间的关系,用来观察两者是否存在正相关。

python 复制代码
import matplotlib.pyplot as plt
import numpy as np

# 设置中文显示
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

# 生成测试数据:100个学生的学习时长(1-8小时)和对应的成绩
np.random.seed(42) # 固定随机种子,保证每次运行结果一致
study_hours = np.random.uniform(1, 8, 100)
# 成绩 = 学习时长 * 8 + 基础分40 + 随机波动
scores = study_hours * 8 + 40 + np.random.normal(0, 5, 100)

# 绘制散点图
plt.figure(figsize=(8, 5))
plt.scatter(study_hours, scores, color="skyblue", edgecolors="black", alpha=0.7)

plt.title("学习时长与考试成绩的关系", fontsize=14)
plt.xlabel("每日学习时长 (小时)")
plt.ylabel("考试成绩 (分)")
plt.grid(True, linestyle="--", alpha=0.5)
plt.show()

效果图

5.直方图 (Histogram)

测试数据:模拟了1000名成年男性的身高数据(符合正态分布),用来展示身高的整体分布区间。

python 复制代码
import matplotlib.pyplot as plt
import numpy as np

# 设置中文显示
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

# 生成测试数据:1000名男性的身高 (均值175cm,标准差7cm)
np.random.seed(42)
heights = np.random.normal(175, 7, 1000)

# 绘制直方图
plt.figure(figsize=(8, 5))
# bins=30 表示将数据分成30个区间,color设置颜色,edgecolor设置柱子边框色
plt.hist(heights, bins=30, color="mediumseagreen", edgecolor="black", alpha=0.7)

plt.title("成年男性身高分布情况", fontsize=14)
plt.xlabel("身高 (cm)")
plt.ylabel("人数")
plt.grid(axis="y", linestyle="--", alpha=0.5)
plt.show()

效果图

6.箱线图 (Box Plot)

测试数据:模拟了 A、B、C 三个不同班级学生的数学成绩,用来对比各班的平均水平、波动范围以及识别异常低分/高分。

python 复制代码
import matplotlib.pyplot as plt
import numpy as np

# 设置中文显示
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

# 生成测试数据:三个班级的数学成绩
np.random.seed(42)
class_A = np.random.normal(75, 10, 100) # A班:均值75,标准差10
class_B = np.random.normal(80, 8, 100)  # B班:均值80,标准差8
class_C = np.random.normal(70, 12, 100) # C班:均值70,标准差12(波动更大)

# 将数据组合成列表传入
data_to_plot = [class_A, class_B, class_C]
labels = ["A班", "B班", "C班"]

# 绘制箱线图
plt.figure(figsize=(8, 5))
plt.boxplot(data_to_plot, labels=labels, patch_artist=True, 
            boxprops=dict(facecolor="lightcoral", color="black"),
            medianprops=dict(color="white"))

plt.title("三个班级数学成绩分布对比", fontsize=14)
plt.ylabel("数学成绩")
plt.grid(axis="y", linestyle="--", alpha=0.5)
plt.show()

效果图

7.热力图 (Heatmap)

绘制热力图我们需要用到更美观的 seaborn 库。请先在终端或命令行中运行以下命令安装依赖:

python 复制代码
pip install matplotlib seaborn numpy pandas

测试数据:模拟了一周7天内,某电商平台在24小时内的每小时订单量矩阵,用来直观查看哪个时间段是下单高峰期。

python 复制代码
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd

# 设置中文显示
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

# 生成测试数据:7天 x 24小时的订单量矩阵
np.random.seed(42)
days = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
hours = [f"{h}点" for h in range(24)]
# 模拟数据:周末和晚间订单量较高
orders = np.random.randint(10, 100, size=(7, 24))
orders[5:, 18:23] += 50  # 周末晚间增加订单量

# 将数据转换为 DataFrame
df = pd.DataFrame(orders, index=days, columns=hours)

# 绘制热力图
plt.figure(figsize=(14, 6))
# annot=True 显示数值,fmt="d" 表示显示为整数,cmap 设置颜色主题
sns.heatmap(df, annot=False, fmt="d", cmap="YlOrRd", cbar_kws={'label': '订单量'})

plt.title("一周内每小时订单量热力图", fontsize=14)
plt.xlabel("时间")
plt.ylabel("星期")
plt.show()

效果图

8.雷达图(radar chart

雷达图(也叫蜘蛛图)非常适合用来展示多维度的数据,比如评估一个人的综合能力、对比不同产品的性能指标等。

在 Python 中,我们可以使用 matplotlib 的极坐标系(polar coordinates)来绘制。以下是包含完整测试数据的可运行实例,模拟了两名游戏角色的六维能力对比

python 复制代码
import matplotlib.pyplot as plt
import numpy as np

# 设置中文显示 (Windows系统使用SimHei,Mac系统可换成PingFang SC)
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

# 1. 准备测试数据
# 设定6个能力维度
categories = ["攻击", "防御", "速度", "耐力", "技术", "策略"]
num_vars = len(categories)

# 角色A的能力值(假设是均衡型战士)
stats_A = [85, 90, 70, 88, 75, 80]
# 角色B的能力值(假设是高攻高速刺客)
stats_B = [95, 60, 92, 65, 88, 70]

# 2. 计算每个维度的角度
# 将圆周(2*pi)平均分成 N 份
angles = np.linspace(0, 2 * np.pi, num_vars, endpoint=False).tolist()

# 3. 闭合图形
# 雷达图需要首尾相连,所以要把第一个维度的角度和数据追加到列表末尾
stats_A += stats_A[:1]
stats_B += stats_B[:1]
angles += angles[:1]

# 4. 创建极坐标画布并绘图
fig, ax = plt.subplots(figsize=(8, 8), subplot_kw=dict(polar=True))

# 绘制角色A的折线和填充区域
ax.plot(angles, stats_A, color="blue", linewidth=2, linestyle="solid", label="角色 A (均衡型)")
ax.fill(angles, stats_A, color="blue", alpha=0.2)

# 绘制角色B的折线和填充区域
ax.plot(angles, stats_B, color="red", linewidth=2, linestyle="solid", label="角色 B (刺客型)")
ax.fill(angles, stats_B, color="red", alpha=0.2)

# 5. 美化图表
# 设置半径(能力值)的范围,留出一点空间给图例
ax.set_ylim(0, 100)
# 设置维度标签(攻击、防御等)
ax.set_xticks(angles[:-1])
ax.set_xticklabels(categories, size=12)
# 添加图例
plt.legend(loc="upper right", bbox_to_anchor=(1.3, 1.1))
# 添加标题
plt.title("游戏角色六维能力对比雷达图", size=16, pad=20)

plt.show()

效果图

相关推荐
专注API从业者2 小时前
告别人工盯品!借助 Open Claw 搭建电商商品自动化监控与数据分析系统(完整可运行源码)
大数据·运维·数据库·数据分析·自动化
这个DBA有点耶8 小时前
实时数据集成工具选型2026:从CDC到数据同步的完整指南
数据库·数据挖掘·dba
2601_9507607910 小时前
树突状细胞亚群的分类、标志物与功能特征
人工智能·分类·数据挖掘·蛋白
阿里云大数据AI技术11 小时前
从数据平台到智能数据助手:Agentic 数据分析与 API 生产实践
人工智能·数据分析·agent
慧都小项12 小时前
夜间Web回归跑到一半停了?TestComplete 15.83提升批量测试稳定性
前端·测试工具·数据挖掘·回归·汽车·web
躺柒13 小时前
读数据可视化13空间标量场(上)
人工智能·深度学习·信息可视化·数据可视化·空间·大数据分析
逻辑君15 小时前
ANNA 意识驱动 RAG 系统
人工智能·机器学习·数据挖掘
数据智研16 小时前
【数据分享】阿庐风景名胜区(国家级地质公园)边界数据
人工智能·数据分析·数据可视化
CC数分17 小时前
如何用Excel数据透视分析业务?3分钟出报表
数据分析·excel
民乐团扒谱机18 小时前
【读论文】2005 一种旋律转录的分类方法A classification approach to melody transcription[C]
人工智能·分类·数据挖掘