Matplotlib入门:5分钟学会Python画图,告别Excel图表
上次领导让我做一个数据汇报,我用 Excel 做了一堆图表。
领导看完说:「这图太丑了,能不能专业一点?」
我花了一晚上用 Matplotlib 重做,第二天领导看了问:「这是用什么工具做的?」
Python,10 行代码。
为什么用 Matplotlib?
Python 画图的库有好几个,我直接说结论:
- • Matplotlib:最基础、最灵活、什么图都能画。缺点是默认样式丑,需要调参数
- • Seaborn:基于 Matplotlib,默认样式好看,适合统计图表
新手先学 Matplotlib,其他库都是基于它封装的。
安装:
pip install matplotlib
导入习惯用别名:
import matplotlib.pyplot as plt
折线图:最常用的图表
展示数据趋势,比如股价、温度变化:
import matplotlib.pyplot as pltx = [1, 2, 3, 4, 5, 6, 7]y = [10, 15, 13, 18, 22, 20, 25]plt.plot(x, y, marker='o', linewidth=2, color='#1f77b4')plt.title('一周销售趋势')plt.xlabel('日期')plt.ylabel('销售额(万)')plt.grid(True, alpha=0.3)plt.show()
marker='o' 是数据点标记,linewidth 是线宽,alpha 是透明度。
柱状图:对比数据
对比不同类别的数据:
categories = ['北京', '上海', '广州', '深圳', '杭州']values = [120, 100, 80, 90, 70]plt.bar(categories, values, color=['#2ecc71', '#3498db', '#e74c3c', '#f39c12', '#9b59b6'])plt.title('各城市销售额')plt.xlabel('城市')plt.ylabel('销售额(万)')plt.show()
水平柱状图:
plt.barh(categories, values)plt.title('各城市销售额')plt.show()
饼图:展示占比
展示各部分占总体的比例:
labels = ['直接访问', '搜索引擎', '社交媒体', '广告']sizes = [30, 40, 20, 10]explode = (0, 0.1, 0, 0) # 突出显示搜索引擎plt.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%', shadow=True, startangle=90)plt.title('流量来源分布')plt.show()
autopct='%1.1f%%' 显示百分比,explode 是突出某一块,shadow 是阴影效果。
散点图:展示相关性
展示两个变量之间的关系:
import numpy as npx = np.random.randn(100)y = x * 2 + np.random.randn(100) * 0.5plt.scatter(x, y, alpha=0.6, c='#e74c3c', edgecolors='white', s=50)plt.title('散点图示例')plt.xlabel('X')plt.ylabel('Y')plt.show()
alpha 是透明度,s 是点的大小,edgecolors 是边框颜色。
子图:一个画布多张图
在一个画布上画多张图:
fig, axes = plt.subplots(2, 2, figsize=(10, 8))# 第一个子图axes[0, 0].plot([1, 2, 3], [1, 4, 9])axes[0, 0].set_title('折线图')# 第二个子图axes[0, 1].bar(['A', 'B', 'C'], [3, 7, 5])axes[0, 1].set_title('柱状图')# 第三个子图axes[1, 0].scatter([1, 2, 3], [3, 1, 5])axes[1, 0].set_title('散点图')# 第四个子图axes[1, 1].pie([30, 40, 30], labels=['X', 'Y', 'Z'])axes[1, 1].set_title('饼图')plt.tight_layout()plt.show()
figsize 是画布大小,tight_layout 自动调整间距避免重叠。
样式美化:让图表更专业
Matplotlib 默认样式确实丑,但可以调整:
# 使用内置样式plt.style.use('seaborn-v0_8')# 或者自定义样式plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文plt.rcParams['axes.unicode_minus'] = False # 显示负号plt.rcParams['figure.dpi'] = 100 # 分辨率
常用内置样式:seaborn-v0_8、ggplot、fivethirtyeight、dark_background
保存图表
保存为图片文件:
plt.savefig('chart.png', dpi=300, bbox_inches='tight')
dpi 是分辨率,bbox_inches='tight' 去掉多余空白。支持 PNG、PDF、SVG 格式。
完整实战:销售数据可视化
一个完整的例子:
import matplotlib.pyplot as pltimport pandas as pd# 准备数据months = ['1月', '2月', '3月', '4月', '5月', '6月']sales_a = [120, 135, 148, 160, 155, 170]sales_b = [90, 100, 110, 105, 115, 125]# 创建画布fig, ax = plt.subplots(figsize=(10, 6))# 画两条折线ax.plot(months, sales_a, marker='o', label='产品A', linewidth=2)ax.plot(months, sales_b, marker='s', label='产品B', linewidth=2)# 设置标题和标签ax.set_title('上半年销售趋势对比', fontsize=16)ax.set_xlabel('月份')ax.set_ylabel('销售额(万)')ax.legend()ax.grid(True, alpha=0.3)plt.tight_layout()plt.savefig('sales_report.png', dpi=300)plt.show()
写在最后
Matplotlib 的 API 很多,但掌握了折线图、柱状图、饼图、散点图、子图这五个核心,90% 的需求都能搞定。
建议收藏官方示例库:https://matplotlib.org/stable/gallery/index/