Python使用Matplotlib绘制基础可视化图表
在Python中进行数据可视化,最常用且功能强大的库是Matplotlib。它可以帮助你轻松绘制出柱状图、折线图、饼图、散点图、直方图、箱线图、热力图、雷达图等。
在开始之前,请确保你已经安装了Matplotlib库。如果没有,可以在终端或命令行中运行以下命令进行安装:
pip install matplotlib1.折线图 (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()效果图
