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
pyplot 是 matplotlib 中最常用的绘图接口,初学阶段重点掌握它即可。
二、解决 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 做数据清洗和分组统计,就可以完成很多实用的数据分析可视化任务。