Python + matplotlib 数据可视化入门教程:折线图、柱状图、饼图与 Excel 绘图

Python + matplotlib 数据可视化入门教程:从折线图、柱状图到 Excel 绘图

对于刚开始学习 Python 数据分析的同学来说,数据可视化是非常重要的一步。很多时候,表格中的数字并不直观,但只要画成图表,就能快速看出趋势、对比关系和占比结构。

本文将以 matplotlib 为核心,带你完成常见图表绘制,包括折线图、柱状图、饼图、中文乱码解决、标题和坐标轴设置,以及从 Excel 中读取数据并绘图。文章中的代码都适合初学者直接运行和修改。

一、matplotlib 库介绍

matplotlib 是 Python 中最常用的数据可视化库之一,尤其适合绘制二维图表。它可以绘制折线图、柱状图、散点图、饼图、直方图等常见统计图,也可以对图表标题、坐标轴、图例、颜色、字体、网格线等进行细致控制。

在 Python 数据分析中,matplotlib 经常和下面这些库一起使用:

  • numpy:用于数值计算
  • pandas:用于读取和处理表格数据
  • matplotlib:用于把数据绘制成图表

安装方式如下:

bash 复制代码
pip install matplotlib pandas openpyxl

其中:

  • matplotlib 用来绘图
  • pandas 用来读取 Excel 或 CSV 数据
  • openpyxl 用来支持 pandas 读取 .xlsx 文件

在代码中,一般这样导入:

python 复制代码
import matplotlib.pyplot as plt

pyplotmatplotlib 中最常用的绘图接口,初学阶段重点掌握它即可。

二、解决 matplotlib 中文乱码问题

很多初学者第一次使用 matplotlib 绘图时,会遇到中文标题显示为方块、乱码,或者负号显示异常的问题。

可以在代码开头统一添加下面两行配置:

python 复制代码
import matplotlib.pyplot as plt

plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

说明:

  • SimHei 是 Windows 系统中常见的黑体字体
  • axes.unicode_minus = False 用来解决负号显示异常的问题

如果你使用 macOS,可以尝试:

python 复制代码
plt.rcParams["font.sans-serif"] = ["Arial Unicode MS"]

如果你使用 Linux,可以安装中文字体后再配置对应字体名称,例如 Noto Sans CJK SC

三、绘制折线图

折线图适合展示数据随时间或顺序变化的趋势,例如每天销售额、每月用户数、温度变化等。

下面的例子绘制一组"每月销售额"数据:

python 复制代码
import matplotlib.pyplot as plt

plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

months = ["1月", "2月", "3月", "4月", "5月", "6月"]
sales = [12000, 15000, 18000, 16000, 21000, 26000]

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

常用参数说明:

  • marker="o":给每个数据点添加圆点标记
  • color="blue":设置折线颜色
  • linewidth=2:设置线条宽度
  • label="销售额":设置图例文字
  • plt.legend():显示图例
  • plt.grid():显示网格线

四、绘制柱状图

柱状图适合比较不同类别之间的数值大小,例如不同产品销量、不同城市订单数、不同部门收入等。

下面的例子绘制"不同产品销量"柱状图:

python 复制代码
import matplotlib.pyplot as plt

plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

products = ["手机", "电脑", "耳机", "平板", "手表"]
sales = [320, 210, 560, 180, 260]

plt.figure(figsize=(8, 5))
plt.bar(products, sales, color="orange", width=0.6)

plt.title("不同产品销量对比")
plt.xlabel("产品")
plt.ylabel("销量")

for index, value in enumerate(sales):
    plt.text(index, value + 10, str(value), ha="center")

plt.show()

这里使用了 plt.text() 给柱子顶部添加数值标签,让图表更容易阅读。

参数说明:

  • plt.bar(x, height):绘制柱状图
  • width=0.6:设置柱子的宽度
  • ha="center":让文字水平居中

五、绘制饼图

饼图适合展示各部分在整体中的占比,例如销售渠道占比、用户来源占比、支出结构等。

下面的例子绘制"用户来源占比"饼图:

python 复制代码
import matplotlib.pyplot as plt

plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

channels = ["搜索引擎", "短视频", "社交媒体", "直接访问", "邮件"]
users = [35, 25, 20, 15, 5]

plt.figure(figsize=(7, 7))
plt.pie(
    users,
    labels=channels,
    autopct="%.1f%%",
    startangle=90,
    counterclock=False
)

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

常用参数说明:

  • labels:设置每个扇区的名称
  • autopct="%.1f%%":显示百分比,并保留 1 位小数
  • startangle=90:设置饼图起始角度
  • counterclock=False:按顺时针方向绘制

六、设置图表标题和坐标轴

一张完整的图表通常需要包含标题、横坐标名称、纵坐标名称和图例。否则读者很难理解图表表达的含义。

常用设置如下:

python 复制代码
plt.title("图表标题")
plt.xlabel("横坐标名称")
plt.ylabel("纵坐标名称")
plt.legend()

如果想设置标题字体大小,可以这样写:

python 复制代码
plt.title("图表标题", fontsize=16)
plt.xlabel("横坐标名称", fontsize=12)
plt.ylabel("纵坐标名称", fontsize=12)

如果横坐标文字较长,可以旋转一定角度:

python 复制代码
plt.xticks(rotation=45)

如果图表元素显示得比较挤,可以使用:

python 复制代码
plt.tight_layout()

它会自动调整图表边距,减少文字被遮挡的情况。

七、从 Excel 中读取数据绘图

实际工作中,数据通常不是直接写在代码里,而是保存在 Excel 表格中。我们可以使用 pandas 读取 Excel,再用 matplotlib 绘图。

假设有一个 Excel 文件 sales_data.xlsx,内容如下:

月份 销售额
1月 12000
2月 15000
3月 18000
4月 16000
5月 21000
6月 26000

读取并绘制折线图:

python 复制代码
import pandas as pd
import matplotlib.pyplot as plt

plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

df = pd.read_excel("sales_data.xlsx")

months = df["月份"]
sales = df["销售额"]

plt.figure(figsize=(8, 5))
plt.plot(months, sales, marker="o", color="green", linewidth=2)

plt.title("从 Excel 读取数据绘制销售额趋势图")
plt.xlabel("月份")
plt.ylabel("销售额(元)")
plt.grid(True, linestyle="--", alpha=0.5)
plt.tight_layout()

plt.show()

如果你的 Excel 文件不在当前 Python 文件所在目录,需要写完整路径,例如:

python 复制代码
df = pd.read_excel(r"D:\data\sales_data.xlsx")

注意路径前面的 r,它可以避免 Windows 路径中的反斜杠被转义。

八、完整演示代码

下面是一份完整示例代码,会自动创建一个 Excel 文件,然后依次绘制折线图、柱状图、饼图,并演示如何从 Excel 中读取数据绘图。

你可以把它保存为 matplotlib_demo.py 后直接运行。

python 复制代码
import pandas as pd
import matplotlib.pyplot as plt


def set_chinese_font():
    """设置中文字体,解决中文乱码和负号显示问题。"""
    plt.rcParams["font.sans-serif"] = ["SimHei"]
    plt.rcParams["axes.unicode_minus"] = False


def draw_line_chart():
    months = ["1月", "2月", "3月", "4月", "5月", "6月"]
    sales = [12000, 15000, 18000, 16000, 21000, 26000]

    plt.figure(figsize=(8, 5))
    plt.plot(months, sales, marker="o", color="blue", linewidth=2, label="销售额")

    plt.title("上半年销售额趋势", fontsize=16)
    plt.xlabel("月份")
    plt.ylabel("销售额(元)")
    plt.legend()
    plt.grid(True, linestyle="--", alpha=0.5)
    plt.tight_layout()
    plt.show()


def draw_bar_chart():
    products = ["手机", "电脑", "耳机", "平板", "手表"]
    sales = [320, 210, 560, 180, 260]

    plt.figure(figsize=(8, 5))
    plt.bar(products, sales, color="orange", width=0.6)

    plt.title("不同产品销量对比", fontsize=16)
    plt.xlabel("产品")
    plt.ylabel("销量")

    for index, value in enumerate(sales):
        plt.text(index, value + 10, str(value), ha="center")

    plt.tight_layout()
    plt.show()


def draw_pie_chart():
    channels = ["搜索引擎", "短视频", "社交媒体", "直接访问", "邮件"]
    users = [35, 25, 20, 15, 5]

    plt.figure(figsize=(7, 7))
    plt.pie(
        users,
        labels=channels,
        autopct="%.1f%%",
        startangle=90,
        counterclock=False
    )

    plt.title("用户来源占比", fontsize=16)
    plt.tight_layout()
    plt.show()


def create_excel_file():
    data = {
        "月份": ["1月", "2月", "3月", "4月", "5月", "6月"],
        "销售额": [12000, 15000, 18000, 16000, 21000, 26000]
    }

    df = pd.DataFrame(data)
    df.to_excel("sales_data.xlsx", index=False)


def draw_chart_from_excel():
    df = pd.read_excel("sales_data.xlsx")

    months = df["月份"]
    sales = df["销售额"]

    plt.figure(figsize=(8, 5))
    plt.plot(months, sales, marker="o", color="green", linewidth=2, label="Excel 数据")

    plt.title("从 Excel 读取数据绘制销售额趋势图", fontsize=16)
    plt.xlabel("月份")
    plt.ylabel("销售额(元)")
    plt.legend()
    plt.grid(True, linestyle="--", alpha=0.5)
    plt.tight_layout()
    plt.show()


if __name__ == "__main__":
    set_chinese_font()
    create_excel_file()
    draw_line_chart()
    draw_bar_chart()
    draw_pie_chart()
    draw_chart_from_excel()

运行代码后,你会依次看到四张图表:

  • 上半年销售额折线图
  • 不同产品销量柱状图
  • 用户来源占比饼图
  • 从 Excel 读取数据绘制的销售额趋势图

九、初学者常见问题

1. 为什么运行后没有显示图表?

请确认代码最后调用了:

python 复制代码
plt.show()

如果你在 Jupyter Notebook 中运行,也可以在代码最前面添加:

python 复制代码
%matplotlib inline

2. 为什么中文还是乱码?

可能是系统中没有安装代码中指定的中文字体。可以先查看系统字体,再把字体名称改成可用字体。

Windows 常用:

python 复制代码
plt.rcParams["font.sans-serif"] = ["SimHei"]

macOS 常用:

python 复制代码
plt.rcParams["font.sans-serif"] = ["Arial Unicode MS"]

Linux 可以使用:

python 复制代码
plt.rcParams["font.sans-serif"] = ["Noto Sans CJK SC"]

3. 为什么读取 Excel 报错?

如果报错提示缺少 openpyxl,安装即可:

bash 复制代码
pip install openpyxl

如果报错提示找不到文件,请检查 Excel 文件名和路径是否正确。

十、总结

本文介绍了 Python 数据可视化入门中最常用的 matplotlib 操作,包括:

  • matplotlib 库的基本作用
  • 折线图绘制
  • 柱状图绘制
  • 饼图绘制
  • 中文乱码和负号显示问题解决
  • 图表标题、坐标轴、图例和网格线设置
  • 从 Excel 中读取数据并绘图
  • 一份可直接运行的完整演示代码

对于 Python 数据分析初学者来说,建议先熟练掌握折线图、柱状图和饼图这三类基础图表。后续再结合 pandas 做数据清洗和分组统计,就可以完成很多实用的数据分析可视化任务。

相关推荐
zh1570231 小时前
golang如何生成和验证JWT Token_golang JWT Token生成验证步骤
jvm·数据库·python
ch.ju1 小时前
Java Programming Chapter 2-Recursion of function
java·开发语言
_376271531 小时前
如何利用Bootstrap的Flex工具类快速排版
jvm·数据库·python
m0_740653221 小时前
Go 中通过指针实现变量名的“传入”与原地修改
jvm·数据库·python
Highcharts.js1 小时前
Highcharts 助力医疗与生命科学研究的数据分析|让医学数据轻易呈现
开发语言·信息可视化·highcharts·实战代码·响应式图表
2301_795099741 小时前
如何在MongoDB主从架构中利用Change Stream捕获数据变更_必须在副本集模式下工作
jvm·数据库·python
AC赳赳老秦1 小时前
数据库操作自动化:用 OpenClaw 对接 Navicat/DBeaver,实现数据备份、脱敏、日常操作自动化
java·运维·数据库·python·oracle·自动化·openclaw
程序员小白条1 小时前
AI 编程辅助,从入门到真香
java·开发语言·数据库·人工智能·面试·职场和发展
ErizJ1 小时前
Go|腾讯面经总结
开发语言·后端·golang