python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python Matplotlib绘制可视化图表

Python使用Matplotlib绘制基础可视化图表的完整指南

作者:清山博客

在Python中进行数据可视化,最常用且功能强大的库是 Matplotlib,它可以帮助你轻松绘制出柱状图,折线图,饼图,散点图等,下面小编就和大家详细介绍一下具体实现方法吧

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

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

pip install matplotlib

1.折线图 (Line Chart)

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

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)

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

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)

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

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名学生的“每日学习时长”与“期末考试成绩”之间的关系,用来观察两者是否存在正相关。

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名成年男性的身高数据(符合正态分布),用来展示身高的整体分布区间。

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 三个不同班级学生的数学成绩,用来对比各班的平均水平、波动范围以及识别异常低分/高分。

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 库。请先在终端或命令行中运行以下命令安装依赖:

pip install matplotlib seaborn numpy pandas

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

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)来绘制。以下是包含完整测试数据的可运行实例,模拟了两名游戏角色的六维能力对比

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()

效果图

以上就是Python使用Matplotlib绘制基础可视化图表的完整指南的详细内容,更多关于Python Matplotlib绘制可视化图表的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文