Matplotlib基础绘图实战指南

📅 发布时间:2026/7/15 18:09:42
Matplotlib基础绘图实战指南 1. 为什么选择Matplotlib进行数据可视化当你第一次接触数据分析时可能会被各种图表类型和工具搞得眼花缭乱。作为一个用了Matplotlib近十年的老手我可以负责任地告诉你这个库绝对是Python数据可视化的不二之选。它就像瑞士军刀一样简单但功能强大能满足你90%以上的绘图需求。Matplotlib最大的优势在于它的灵活性。无论是简单的折线图还是复杂的三维曲面图它都能轻松应对。我记得刚开始工作时老板临时要求我分析一组销售数据并制作可视化报告。当时我只用了不到20行代码就生成了包含折线图、柱状图和饼图的多页PDF报告成功在会议上惊艳了所有人。安装Matplotlib非常简单只需要一行命令pip install matplotlib如果你使用的是Anaconda环境也可以通过conda来安装conda install matplotlib2. 准备你的第一张图表让我们从一个真实的销售数据场景开始。假设你有一家电商公司记录了2023年每个月的销售额数据months [1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月, 9月, 10月, 11月, 12月] sales [120, 150, 180, 135, 210, 250, 300, 280, 320, 350, 420, 500]要绘制这些数据的折线图只需要几行代码import matplotlib.pyplot as plt plt.plot(months, sales) plt.title(2023年月度销售额) plt.xlabel(月份) plt.ylabel(销售额(万元)) plt.show()这段代码会生成一张清晰的折线图显示销售额随月份的变化趋势。plot()函数是Matplotlib最基础的绘图函数它接受x轴和y轴的数据自动帮你完成绘图。3. 美化你的图表默认生成的图表虽然能用但离好看还有一定距离。让我们来优化一下plt.figure(figsize(10, 6)) # 设置图表大小 plt.plot(months, sales, colorroyalblue, # 线条颜色 linewidth2, # 线条粗细 markero, # 数据点标记 markersize8) # 标记大小 # 添加网格和样式 plt.grid(True, linestyle--, alpha0.7) plt.title(2023年月度销售额趋势, fontsize16) plt.xlabel(月份, fontsize12) plt.ylabel(销售额(万元), fontsize12) # 旋转x轴标签 plt.xticks(rotation45) plt.tight_layout() # 自动调整布局 plt.show()现在这张图看起来专业多了figsize参数控制图表大小color和linewidth让线条更醒目marker突出了每个数据点。grid()添加了虚线网格提高了可读性。4. 创建多图表对比分析在实际工作中我们经常需要比较不同年份或不同产品的数据。Matplotlib可以轻松创建子图来实现这个需求。假设我们现在有2022年和2023年的销售数据sales_2022 [100, 120, 150, 110, 180, 200, 250, 230, 270, 300, 350, 400] sales_2023 [120, 150, 180, 135, 210, 250, 300, 280, 320, 350, 420, 500]我们可以这样绘制对比图fig, (ax1, ax2) plt.subplots(1, 2, figsize(14, 5)) # 2022年图表 ax1.plot(months, sales_2022, colorgreen) ax1.set_title(2022年销售额) ax1.set_ylabel(销售额(万元)) ax1.grid(True) # 2023年图表 ax2.plot(months, sales_2023, colorblue) ax2.set_title(2023年销售额) ax2.grid(True) plt.tight_layout() plt.show()subplots()函数创建了一个包含两个子图的画布。通过ax1和ax2我们可以分别控制每个子图的属性。这种对比方式能清晰展示年度增长情况。5. 制作专业的柱状图和饼图除了折线图柱状图和饼图也是常用的图表类型。让我们看看如何用Matplotlib创建它们。5.1 产品类别销售柱状图假设我们有以下产品类别的季度销售数据categories [电子产品, 家居用品, 服装, 食品] q1_sales [120, 85, 90, 110] q2_sales [150, 70, 100, 95]绘制分组柱状图的代码如下import numpy as np x np.arange(len(categories)) # 类别位置 width 0.35 # 柱状图宽度 fig, ax plt.subplots(figsize(10, 6)) rects1 ax.bar(x - width/2, q1_sales, width, label第一季度) rects2 ax.bar(x width/2, q2_sales, width, label第二季度) # 添加标签和标题 ax.set_ylabel(销售额(万元)) ax.set_title(产品类别季度销售对比) ax.set_xticks(x) ax.set_xticklabels(categories) ax.legend() # 自动添加数据标签 def autolabel(rects): for rect in rects: height rect.get_height() ax.annotate(f{height}, xy(rect.get_x() rect.get_width() / 2, height), xytext(0, 3), # 3点垂直偏移 textcoordsoffset points, hacenter, vabottom) autolabel(rects1) autolabel(rects2) plt.tight_layout() plt.show()这段代码创建了一个专业的对比柱状图清晰地展示了不同产品类别在两个季度的销售情况。autolabel函数自动在每个柱子上方添加了具体数值使图表更加直观。5.2 市场份额饼图饼图适合展示比例关系。假设我们要展示公司各产品线的市场份额product_lines [智能手机, 笔记本电脑, 平板电脑, 智能手表] market_share [45, 30, 15, 10] colors [#ff9999,#66b3ff,#99ff99,#ffcc99] plt.figure(figsize(8, 8)) plt.pie(market_share, labelsproduct_lines, colorscolors, autopct%1.1f%%, # 显示百分比 startangle90, # 起始角度 explode(0.1, 0, 0, 0)) # 突出显示第一块 # 添加标题 plt.title(产品线市场份额, fontsize16) # 确保饼图是正圆 plt.axis(equal) plt.show()这段代码生成的饼图不仅美观而且通过explode参数突出了智能手机这一主要产品线。autopct参数自动计算并显示了每个部分的百分比。6. 高级技巧自定义样式和保存图表6.1 使用样式表Matplotlib提供了多种内置样式可以一键改变图表外观print(plt.style.available) # 查看可用样式 plt.style.use(ggplot) # 使用ggplot样式 # 重新绘制之前的折线图 plt.figure(figsize(10, 6)) plt.plot(months, sales_2023, markero) plt.title(2023年销售额(ggplot样式)) plt.xlabel(月份) plt.ylabel(销售额(万元)) plt.grid(True) plt.show()ggplot样式模仿了R语言中著名的ggplot2库的风格让你的图表瞬间变得高大上。其他常用样式还有seaborn、fivethirtyeight等。6.2 保存高质量图表在完成图表制作后你可能需要将其保存为图片用于报告或演示plt.figure(figsize(10, 6)) plt.plot(months, sales_2023, markero) plt.title(2023年销售额) plt.xlabel(月份) plt.ylabel(销售额(万元)) # 保存为PNG(默认格式) plt.savefig(sales_2023.png, dpi300, bbox_inchestight) # 保存为PDF(矢量图无限放大不失真) plt.savefig(sales_2023.pdf, bbox_inchestight)dpi参数控制图片分辨率bbox_inchestight可以自动裁剪多余的空白边缘。PDF格式是矢量图适合印刷和高质量展示。7. 实战完整的销售数据分析报告让我们综合运用所学知识创建一个完整的销售数据分析可视化报告# 准备数据 months [1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月, 9月, 10月, 11月, 12月] sales_2022 [100, 120, 150, 110, 180, 200, 250, 230, 270, 300, 350, 400] sales_2023 [120, 150, 180, 135, 210, 250, 300, 280, 320, 350, 420, 500] categories [电子产品, 家居用品, 服装, 食品] q_sales { Q1: [120, 85, 90, 110], Q2: [150, 70, 100, 95], Q3: [180, 75, 110, 105], Q4: [200, 80, 120, 115] } # 创建画布 plt.figure(figsize(15, 10)) # 1. 年度对比折线图 plt.subplot(2, 2, 1) plt.plot(months, sales_2022, label2022年, markero) plt.plot(months, sales_2023, label2023年, markers) plt.title(年度销售额对比) plt.ylabel(销售额(万元)) plt.grid(True, linestyle--, alpha0.7) plt.legend() plt.xticks(rotation45) # 2. 2023年增长率 growth_rate [(s2023-s2022)/s2022*100 for s2022, s2023 in zip(sales_2022, sales_2023)] plt.subplot(2, 2, 2) plt.bar(months, growth_rate, colororange) plt.title(2023年月度增长率(%)) plt.grid(True, axisy, linestyle--, alpha0.7) plt.xticks(rotation45) # 3. 季度销售柱状图 plt.subplot(2, 2, 3) x np.arange(len(categories)) width 0.2 for i, (quarter, sales) in enumerate(q_sales.items()): plt.bar(x i*width, sales, width, labelquarter) plt.setp(plt.gca(), xticksx width*1.5, xticklabelscategories) plt.title(各产品类别季度销售) plt.ylabel(销售额(万元)) plt.legend() # 4. 2023年销售构成饼图 plt.subplot(2, 2, 4) total_2023 sum(sales_2023) q_sales_sum [sum(q) for q in zip(*q_sales.values())] plt.pie(q_sales_sum, labelscategories, autopct%1.1f%%) plt.title(2023年销售构成) plt.tight_layout() plt.savefig(sales_report.png, dpi300) plt.show()这个报告包含了四种不同类型的图表清晰地展示了销售数据的多个维度。通过subplot()函数我们将它们整齐地排列在一个画布上非常适合在商业报告中使用。