楼主: 8977_cdabigdata
138 0

[其他] Python数据可视化掌握Matplotlib与Seaborn [推广有奖]

  • 0关注
  • 0粉丝

等待验证会员

学前班

40%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
20 点
帖子
1
精华
0
在线时间
0 小时
注册时间
2018-4-4
最后登录
2018-4-4

楼主
8977_cdabigdata 发表于 2025-12-11 18:24:48 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

一、数据可视化是什么?为什么要学?

数据可视化是将抽象的数字或文本信息转化为图形和图表的过程,帮助人们更直观地发现数据中的规律、趋势以及异常情况。Python凭借其强大的库支持,如Matplotlib和Seaborn,已成为该领域的主流工具之一。相比Excel,Python能高效处理大规模数据;相较于R语言,它与Pandas、NumPy等数据分析库无缝集成,学习门槛更低,特别适合初学者入门。

本文将从环境配置开始,逐步引导你掌握使用Python进行专业级数据可视化的技能,涵盖折线图、柱状图、饼图、散点图等常用图表类型,并提供可直接运行的完整代码示例。

二、环境准备:安装核心库

首先确保系统中已安装Python(建议版本3.8及以上),然后通过pip命令安装所需依赖库:

# 安装Matplotlib(基础绘图库)、Seaborn(美化版Matplotlib)、Pandas(数据处理)
pip install matplotlib seaborn pandas numpy

安装完成后,可通过以下代码验证是否成功导入:

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np

print("Matplotlib版本:", plt.__version__)
print("Seaborn版本:", sns.__version__)
# 若无报错信息,则表示安装成功

三、核心工具:Matplotlib基础用法

Matplotlib是Python中最基础且功能强大的绘图库,几乎所有高级可视化工具都基于它构建。其基本流程包括:创建画布(Figure)、添加子图(Axes),并设置标题、坐标轴标签、图例等元素以增强可读性。

3.1 第一个图表:折线图(展示趋势)

折线图适用于呈现数据随时间或连续变量变化的趋势,例如每月销售额、气温波动等场景。

import matplotlib.pyplot as plt
import numpy as np

# 1. 准备数据:模拟6个月的销售额
months = ["1月", "2月", "3月", "4月", "5月", "6月"]
sales = [120, 150, 130, 180, 200, 220]

# 2. 创建画布和子图(figsize设置画布大小,单位为英寸)
fig, ax = plt.subplots(figsize=(8, 5))

# 3. 绘制折线图:x轴为月份,y轴为销售额,设定线条颜色、宽度及数据点标记
ax.plot(months, sales, color="#2E86AB", linewidth=2, marker="o", label="销售额")

# 4. 设置图表元素提升可读性
ax.set_title("2024年上半年销售额趋势", fontsize=14, pad=20)   # 标题
ax.set_xlabel("月份", fontsize=12)                             # x轴标签
ax.set_ylabel("销售额(万元)", fontsize=12)                   # y轴标签
ax.legend()                                                  # 显示图例
ax.grid(alpha=0.3)                                           # 添加半透明网格线

# 5. 保存并显示图表(注意:保存应在show之前执行,否则可能导出空白图像)
plt.savefig("sales_trend.png", dpi=300, bbox_inches="tight")
plt.show()

代码说明:

plt.subplots()

:标准方式创建画布与子图对象,是Matplotlib中最常见的初始化方法;

ax.plot()

:核心绘图函数调用;

marker="o"

:在每个数据点上添加圆形标记,便于观察具体数值位置;

bbox_inches="tight"

:保存图像时自动裁剪多余空白区域,防止标题或标签被截断;

dpi=300

:设置输出分辨率为300dpi,满足高质量打印或发布需求。

3.2 柱状图(对比分类数据)

柱状图用于比较不同类别之间的数据差异,适用于产品销量对比、部门人数统计等场景。

import matplotlib.pyplot as plt
import pandas as pd

# 1. 准备数据:模拟不同产品的销量
data = {
    "产品": ["A", "B", "C", "D"],
    "销量": [80, 120, 95, 110]
}
df = pd.DataFrame(data)

# 2. 创建画布
fig, ax = plt.subplots(figsize=(7, 5))

# 3. 绘制柱状图
ax.bar(df["产品"], df["销量"], color="#A23B72", edgecolor="black", alpha=0.7)

# 4. 设置图表元素
ax.set_title("各产品销量对比", fontsize=14)
ax.set_xlabel("产品", fontsize=12)
ax.set_ylabel("销量(件)", fontsize=12)
ax.grid(axis="y", alpha=0.3)

# 5. 显示图表
plt.show()

3.3 饼图(展示占比)

饼图适合表现各部分占总体的比例关系,常用于市场份额、预算分配等场景。

import matplotlib.pyplot as plt

# 准备数据
labels = ["Android", "iOS", "HarmonyOS", "其他"]
market_share = [45, 35, 15, 5]
colors = ["#F18F01", "#C73E1D", "#5C4B51", "#B0B6BA"]

# 创建画布
fig, ax = plt.subplots(figsize=(6, 6))

# 绘制饼图
ax.pie(market_share, labels=labels, autopct="%1.1f%%", startangle=90, colors=colors, shadow=True)

# 设置标题
ax.set_title("智能手机操作系统市场占有率", fontsize=14)

# 确保饼图为正圆
ax.axis("equal")

# 显示图表
plt.show()

四、进阶美化:Seaborn快速做出专业图表

Seaborn是在Matplotlib基础上封装的高级可视化库,内置美观的主题和配色方案,能够用更少代码绘制更具美感的专业图表。

4.1 散点图(分析变量相关性)

散点图用于探索两个连续变量之间的潜在关系,比如广告投入与销售额之间是否存在正相关。

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# 模拟广告投入与销售额数据
np.random.seed(42)
data = pd.DataFrame({
    "广告投入(万元)": np.random.normal(50, 15, 100),
    "销售额(万元)": np.random.normal(200, 30, 100)
})

# 使用Seaborn绘制散点图
sns.set_style("whitegrid")  # 设置背景风格
plt.figure(figsize=(8, 6))
sns.scatterplot(data=data, x="广告投入(万元)", y="销售额(万元)", color="#2E86AB")

# 添加标题
plt.title("广告投入与销售额关系散点图", fontsize=14)
plt.show()

4.2 箱线图(分析数据分布/异常值)

箱线图可以清晰展示数据的分布范围、中位数、四分位距以及识别异常值,广泛应用于质量控制、用户行为分析等领域。

import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# 模拟不同地区销售额数据
np.random.seed(42)
data = pd.DataFrame({
    "地区": np.repeat(["华东", "华北", "华南", "西部"], 25),
    "日均销售额(万元)": np.concatenate([
        np.random.normal(60, 10, 25),
        np.random.normal(50, 8, 25),
        np.random.normal(70, 12, 25),
        np.random.normal(40, 15, 25)
    ])
})

# 绘制箱线图
plt.figure(figsize=(8, 6))
sns.boxplot(data=data, x="地区", y="日均销售额(万元)", palette="Set2")

# 设置标题
plt.title("各地区日均销售额分布", fontsize=14)
plt.xlabel("地区")
plt.ylabel("日均销售额(万元)")
plt.show()

五、实战案例:整合Pandas与可视化

结合Pandas的数据处理能力和可视化库,可以实现端到端的数据分析流程。

步骤1:准备数据(模拟销售数据,保存为sales_data.csv)

import pandas as pd
import numpy as np

# 设置随机种子保证结果可复现
np.random.seed(42)

# 生成模拟数据
dates = pd.date_range("2024-01-01", periods=100)
products = np.random.choice(["手机", "平板", "笔记本"], size=100)
regions = np.random.choice(["华东", "华南", "华北"], size=100)
sales = np.round(np.random.uniform(1000, 5000, size=100), 2)

# 构建DataFrame
sales_df = pd.DataFrame({
    "日期": dates,
    "产品": products,
    "地区": regions,
    "销售额": sales
})

# 保存为CSV文件
sales_df.to_csv("sales_data.csv", index=False)
print("销售数据已保存至sales_data.csv")

步骤2:读取数据并可视化

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# 读取数据
df = pd.read_csv("sales_data.csv")

# 转换日期列类型
df["日期"] = pd.to_datetime(df["日期"])

# 按月汇总总销售额
monthly_sales = df.resample("M", on="日期").sum()

# 绘图
plt.figure(figsize=(10, 6))
plt.plot(monthly_sales.index.strftime("%Y-%m"), monthly_sales["销售额"], marker="s", color="#2E86AB")
plt.title("月度销售额趋势图")
plt.xlabel("月份")
plt.ylabel("销售额(元)")
plt.xticks(rotation=45)
plt.grid(alpha=0.3)
plt.tight_layout()
plt.show()

六、新手常见问题与解决方法

  • 图表无法显示:检查是否遗漏了plt.show()语句,或Jupyter环境中内联绘图未启用(可运行%matplotlib inline)。
  • 中文乱码:Matplotlib默认不支持中文,需手动设置字体,例如:
    plt.rcParams['font.sans-serif'] = ['SimHei'] # 支持中文显示
    plt.rcParams['axes.unicode_minus'] = False # 正常显示负号
  • 图表保存为空白:确保plt.savefig()plt.show()之前调用,因为show()会清空当前图像缓冲区。
  • 颜色/样式不满意:可通过修改color参数、使用Seaborn预设主题(如sns.set_style())来快速优化视觉效果。

fig, ax = plt.subplots(figsize=(8, 5))
colors = ["#E63946", "#457B9D", "#F1FAEE", "#1D3557"]
ax.bar(df["产品"], df["销量"], color=colors, width=0.6)

for i, value in enumerate(df["销量"]):
    ax.text(i, value + 2, str(value), ha="center", fontsize=10)

ax.set_title("2024年Q2各产品销量对比", fontsize=14)
ax.set_xlabel("产品类型", fontsize=12)
ax.set_ylabel("销量(件)", fontsize=12)
ax.set_ylim(0, 130)
plt.show()

ax.text()
该标记用于在图表的指定位置添加文字说明,提升信息传达效率。
ha="center"
表示文本在对应柱子上方实现水平居中对齐,视觉更协调。
value + 2
通过将标签向上偏移2个单位,有效避免与柱状图本身发生重叠。

3.3 饼图:呈现数据占比关系

适用于展示组成部分在整体中的比例分布,如市场占有率、用户性别结构或年龄分层情况等。 import matplotlib.pyplot as plt age_groups = ["18-25", "26-35", "36-45", "45+"] percentages = [35, 40, 15, 10] colors = ["#FF9999", "#66B2FF", "#99FF99", "#FFCC99"] explode = (0, 0.1, 0, 0) fig, ax = plt.subplots(figsize=(7, 7)) ax.pie( percentages, explode=explode, labels=age_groups, colors=colors, autopct="%1.1f%%", shadow=True, startangle=90 ) ax.axis("equal") ax.set_title("用户年龄段分布", fontsize=14) plt.show()

注意事项:饼图建议仅用于类别数量不超过5项的数据集。当分类过多时,图形会显得拥挤混乱,此时推荐改用柱状图以增强可读性。

四、进阶图表美化:使用 Seaborn 快速生成专业级可视化

Seaborn 是构建在 Matplotlib 基础之上的高级绘图工具库,具备丰富的内置样式和统计图表类型,能够与 Pandas 数据框无缝对接,显著减少样式配置工作量,快速输出具有出版质量的图表。

4.1 散点图:探索变量间的相关性模式

散点图常用于分析两个连续型变量之间的潜在关系,例如广告投入与销售额、身高与体重之间的关联趋势。 import seaborn as sns import pandas as pd import matplotlib.pyplot as plt tips = sns.load_dataset("tips") sns.set_style("whitegrid") plt.figure(figsize=(10, 6)) sns.scatterplot( data=tips, x="total_bill", y="tip", hue="sex", size="total_bill", sizes=(50, 200), palette="Set2" ) plt.title("餐厅总消费与小费金额关系", fontsize=14) plt.xlabel("总消费(美元)", fontsize=12) plt.ylabel("小费(美元)", fontsize=12) plt.legend(title="性别", bbox_to_anchor=(1.05, 1), loc="upper left") plt.show()

plt.tight_layout() # 自动调整布局
plt.show()

核心优势

Seaborn 的显著优点在于其能够直接接收 Pandas 数据框作为输入数据源,

scatterplot
这一特性极大地简化了数据可视化流程。通过设置简单的参数即可实现按类别分组的图形展示,避免了传统方式中需要手动编写循环来分别绘制各组数据的繁琐操作。
hue

4.2 箱线图:用于分析数据分布与异常值检测

箱线图是一种有效的统计图表,可用于清晰呈现数据的四分位数范围、中位数位置以及潜在的离群点。它特别适用于比较不同类别的数据分布情况,例如不同城市的房价水平或多个班级学生的考试成绩差异。

import seaborn as sns
import matplotlib.pyplot as plt

# 1. 加载示例数据集
tips = sns.load_dataset("tips")

# 2. 配置绘图风格与中文显示支持
sns.set_style("ticks")
plt.rcParams["font.sans-serif"] = ["SimHei"]  # 解决中文无法显示的问题
plt.rcParams["axes.unicode_minus"] = False  # 正确显示负号

# 3. 绘制箱线图:以用餐时间作为横轴,小费金额为纵轴
plt.figure(figsize=(8, 6))
sns.boxplot(
    data=tips,
    x="time",
    y="tip",
    hue="day",      # 按星期几进行分组着色
    palette="husl"
)

# 4. 添加图表标题和坐标轴标签
plt.title("不同用餐时间/星期的小费金额分布", fontsize=14)
plt.xlabel("用餐时间", fontsize=12)
plt.ylabel("小费(美元)", fontsize=12)
plt.show()

关键说明:

在箱线图中,箱子的上边界代表第三四分位数(即75%分位),下边界对应第一四分位数(25%分位),箱内中线表示中位数(50%分位)。上下延伸的“须”通常定义为1.5倍四分位距,超出该范围的数据点被视为异常值并单独标出。

五、实战案例:结合 Pandas 与可视化工具进行数据分析

在实际项目中,原始数据多以 CSV 或 Excel 文件形式存储。以下流程完整演示如何从读取外部数据开始,经过清洗处理,最终完成可视化分析。

步骤1:构建模拟数据(保存为 sales_data.csv)

假设我们有一份销售记录表,包含日期、地区、销售额和利润等字段。

日期,销售额,利润,地区
2024-01-01,15000,3000,华北
2024-01-02,12000,2400,华东
2024-01-03,18000,3600,华南
2024-01-04,16000,3200,华北
2024-01-05,20000,4000,华东
2024-01-06,19000,3800,华南

步骤2:加载数据并执行可视化分析

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# 1. 读取CSV文件
df = pd.read_csv("sales_data.csv")

# 数据预处理:将字符串类型的日期转换为 datetime 格式
df["日期"] = pd.to_datetime(df["日期"])

# 2. 设置图表风格及中文字体支持
sns.set_style("darkgrid")
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

# 3. 创建并排双子图,分别展示销售额与利润趋势
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))

# 子图1:绘制各地区销售额随时间的变化趋势
sns.lineplot(data=df, x="日期", y="销售额", hue="地区", ax=ax1, marker="o")
ax1.set_title("各地区销售额趋势", fontsize=14)
ax1.set_xlabel("日期", fontsize=12)
ax1.set_ylabel("销售额(元)", fontsize=12)
ax1.legend(loc="upper left")

# 子图2:绘制各地区利润变化趋势
sns.lineplot(data=df, x="日期", y="利润", hue="地区", ax=ax2, marker="s")
ax2.set_title("各地区利润趋势", fontsize=14)
ax2.set_xlabel("日期", fontsize=12)
ax2.set_ylabel("利润(元)", fontsize=12)
ax2.legend(loc="upper left")

# 调整整体布局并导出图像
plt.tight_layout()
plt.savefig("sales_profit_analysis.png", dpi=300)
plt.show()

# 4. 补充分析:计算各地区总销售额
region_sales = df.groupby("地区")["销售额"].sum().reset_index()

# 绘制柱状图展示汇总结果
plt.figure(figsize=(8, 5))
sns.barplot(data=region_sales, x="地区", y="销售额", palette="viridis")
plt.title("各地区总销售额", fontsize=14)
plt.xlabel("地区", fontsize=12)
plt.ylabel("销售额(元)", fontsize=12)
plt.show()
六、新手常见问题与解决方法

中文显示乱码
在绘制图表时若出现中文无法正常显示的情况,可通过设置字体来解决。根据操作系统选择合适的中文字体:
- Windows系统:使用 SimHei(黑体)
- Mac系统:推荐 PingFang SC
- Linux系统:可选用 WenQuanYi Micro Hei

添加如下代码以启用中文显示:
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False  # 解决负号显示为方框的问题

图表元素重叠
当图表中的标签、标题或其他元素出现重叠现象时,可以采用以下两种方式优化布局:
1. 使用自动布局调整功能,避免内容被截断或堆叠;
plt.tight_layout()
2. 增大画布尺寸,为图表元素提供更充裕的显示空间。
figsize
保存图片为空白 在调用 `plt.savefig()` 保存图像时,若输出文件为空白页面,请注意保存命令的执行顺序: 必须将
plt.savefig()
置于
plt.show()
之前调用。因为
plt.show()
会清空当前画布,导致后续保存无内容可渲染。 Seaborn配色报错 使用 Seaborn 绘图时,若自定义颜色方案后出现错误,请确认所指定的调色板名称正确且存在。常用有效的配色方案包括: - Set2 - husl - viridis - pastel 确保拼写无误,并优先使用这些广泛支持的内置配色,以提升兼容性与可视化效果。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Matplotlib matplot python 数据可视化 Born

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-22 05:13