Python数据分析实战:用Matplotlib绘制5种常见图形的保姆级教程 Python数据分析实战用Matplotlib绘制5种常见图形的保姆级教程在数据分析领域可视化是理解数据、发现模式和传达见解的关键手段。Matplotlib作为Python生态系统中最基础也最强大的绘图库其灵活性和丰富的功能使其成为数据科学家的必备工具。本文将带您从零开始通过五个典型场景掌握Matplotlib的核心绘图技巧。1. 环境准备与基础配置在开始绘图之前我们需要确保环境配置正确。推荐使用Jupyter Notebook进行交互式开发但常规Python脚本同样适用。首先安装必要的库pip install matplotlib numpy pandas基础导入语句是每次使用Matplotlib的标准开头import matplotlib.pyplot as plt import numpy as np # 用于生成示例数据Matplotlib有两种主要接口风格MATLAB风格的pyplot接口和面向对象接口。对于初学者pyplot接口更易上手但随着项目复杂度的增加面向对象的方式更具优势。以下是一个简单的配置示例# 设置全局参数 plt.rcParams[figure.figsize] (8, 6) # 默认图形大小 plt.rcParams[font.size] 12 # 字体大小 plt.style.use(seaborn) # 使用更美观的样式提示在Jupyter Notebook中添加%matplotlib inline魔法命令可以让图形直接显示在单元格下方。2. 折线图展示趋势变化折线图是展示数据随时间或有序类别变化的理想选择。下面我们创建一个模拟股票价格变化的折线图# 生成示例数据 days np.arange(1, 31) price np.cumsum(np.random.randn(30) * 0.5 0.1) 100 # 创建图形 plt.figure(figsize(10, 6)) plt.plot(days, price, color#2c7fb8, linewidth2, linestyle-, markero, markersize8, labelDaily Price) # 添加装饰元素 plt.title(Stock Price Trend (30 Days), pad20) plt.xlabel(Day) plt.ylabel(Price ($)) plt.grid(True, alpha0.3) plt.legend() # 调整坐标轴范围 plt.xlim(0, 31) plt.ylim(price.min()*0.95, price.max()*1.05) plt.tight_layout() # 自动调整子图参数 plt.show()关键参数说明linewidth: 控制线条粗细linestyle: 可设置为-, --, -., :等marker: 数据点标记样式如o, s, ^等alpha: 控制透明度(0-1)注意保存图形时plt.savefig()应在plt.show()之前调用因为show()会清空图形缓冲区。3. 散点图探索变量关系散点图是研究两个连续变量关系的利器。以下示例展示如何创建带有颜色和大小维度的气泡图# 生成随机数据 np.random.seed(42) x np.random.rand(50) * 100 y np.random.rand(50) * 100 sizes np.random.randint(10, 300, 50) colors np.random.rand(50) categories np.random.choice([A, B, C], 50) # 创建散点图 fig, ax plt.subplots(figsize(10, 8)) scatter ax.scatter(x, y, ssizes, ccolors, cmapviridis, alpha0.7, edgecolorsgrey) # 添加颜色条 cbar plt.colorbar(scatter) cbar.set_label(Color Value) # 添加图例按大小 for size in [50, 150, 250]: ax.scatter([], [], ssize, ck, alpha0.5, labelfSize {size}) ax.legend(titleBubble Size) # 添加标题和标签 ax.set_title(Multidimensional Scatter Plot, pad20) ax.set_xlabel(X Variable) ax.set_ylabel(Y Variable) plt.show()高级技巧使用cmap参数指定颜色映射方案edgecolors控制数据点边缘颜色通过alpha调整透明度避免重叠点被遮挡气泡大小应与数据值成比例而非直接使用原始值4. 直方图与密度图分布可视化理解数据分布是分析的基础。下面展示如何组合直方图和核密度估计图from scipy.stats import gaussian_kde # 生成两种分布的数据 data1 np.random.normal(0, 1, 1000) data2 np.random.normal(5, 2, 1000) # 创建图形 fig, ax plt.subplots(figsize(10, 6)) # 绘制直方图 hist1 ax.hist(data1, bins30, alpha0.5, colorskyblue, densityTrue, labelGroup 1) hist2 ax.hist(data2, bins30, alpha0.5, colorsalmon, densityTrue, labelGroup 2) # 添加密度曲线 kde1 gaussian_kde(data1) kde2 gaussian_kde(data2) x_range np.linspace(min(data1.min(), data2.min()), max(data1.max(), data2.max()), 1000) ax.plot(x_range, kde1(x_range), colorblue, linewidth2) ax.plot(x_range, kde2(x_range), colorred, linewidth2) # 添加装饰 ax.set_title(Comparative Distribution Analysis) ax.set_xlabel(Value) ax.set_ylabel(Density) ax.legend() plt.show()实用参数bins: 控制柱体数量可传入整数或边界值列表density: 设为True时y轴显示密度而非计数histtype: 可设置为bar, barstacked, step, stepfilledorientation: 控制方向(vertical或horizontal)5. 饼图与环形图比例展示虽然饼图常被滥用但在展示明确比例关系时仍有用武之地。以下是改进版的环形图示例# 数据准备 categories [Housing, Food, Transport, Entertainment, Healthcare, Others] percentages [35, 15, 12, 8, 10, 20] explode [0.1 if x max(percentages) else 0 for x in percentages] colors [#ff9999,#66b3ff,#99ff99, #ffcc99,#c2c2f0,#ffb3e6] # 创建环形图 fig, ax plt.subplots(figsize(8, 8)) wedges, texts, autotexts ax.pie( percentages, explodeexplode, labelscategories, colorscolors, autopct%1.1f%%, startangle90, pctdistance0.85, wedgepropsdict(width0.4, edgecolorw)) # 美化百分比文本 for autotext in autotexts: autotext.set_color(black) autotext.set_fontsize(10) # 添加中心圆 centre_circle plt.Circle((0,0), 0.3, fcwhite) fig.gca().add_artist(centre_circle) # 添加标题 ax.set_title(Monthly Expense Distribution, pad20) plt.show()饼图设计原则类别数量不宜过多(5-7个为佳)按大小排序展示更清晰使用爆炸效果(explode)突出关键部分避免使用3D效果它会导致比例失真环形图(donut chart)通常比传统饼图更美观6. 组合图形与高级布局实际项目中我们常需要将多个图形组合展示。Matplotlib提供了强大的子图系统# 创建数据 x np.linspace(0, 10, 100) y1 np.sin(x) y2 np.cos(x) y3 np.exp(-x/5) * np.sin(x) y4 np.random.normal(0, 0.1, 100).cumsum() # 创建2x2的子图网格 fig, axes plt.subplots(2, 2, figsize(12, 10)) # 子图1: 正弦曲线 axes[0,0].plot(x, y1, colortab:blue) axes[0,0].set_title(Sine Wave) axes[0,0].grid(True) # 子图2: 余弦曲线 axes[0,1].plot(x, y2, colortab:orange) axes[0,1].set_title(Cosine Wave) axes[0,1].grid(True) # 子图3: 阻尼振荡 axes[1,0].plot(x, y3, colortab:green) axes[1,0].set_title(Damped Oscillation) axes[1,0].grid(True) # 子图4: 随机游走 axes[1,1].plot(x, y4, colortab:red) axes[1,1].set_title(Random Walk) axes[1,1].grid(True) # 调整布局 plt.suptitle(Multiple Plot Demonstration, y1.02, fontsize16) plt.tight_layout() plt.show()高级布局技巧使用plt.subplots()创建网格布局GridSpec允许创建更复杂的非均匀布局subplot2grid()提供更灵活的定位方式plt.tight_layout()自动解决标签重叠问题constrained_layoutTrue是另一种自动调整选项