Python数据分析(十四):Pandas 数据可视化

📅 2026/8/6 17:26:04
Python数据分析(十四):Pandas 数据可视化
目录一、为什么 Pandas 能画图1. 底层机制2. 为什么优先使用 Pandas 绘图二、单变量图表绘制1. 折线图2. 柱状图3. 直方图4. 饼图5. 面积图三、双变量与多列数据可视化1. 散点图2. 蜂巢图3. 堆叠图四、综合案例1. 模拟数据准备2. 步骤一总体大盘分析3. 步骤二品类结构拆解4. 步骤三归因与相关性探查五、Pandas、Matplotlib、Seaborn 对比总结一、为什么 Pandas 能画图在数据分析流程中数据通常以 DataFrame 或 Series 的结构存储于 Pandas 中。在探索数据时最顺手的绘图方式并不是直接写 plt.plot()而是直接在数据对象后加上 .plot()Pandas 之所以具备内置的绘图能力并非因为它自己开发了一套独立的渲染引擎而是因为它在底层集成了 Matplotlib1. 底层机制Pandas 的 .plot() 方法本质上是对 Matplotlib 接口的高阶封装当你执行 df.plot() 时Pandas 在后台完成了以下自动化工作提取坐标与标签将 DataFrame 的索引自动映射为 X 轴将数据列映射为 Y 轴或不同的数据序列构建图表根据列名自动生成图例、根据索引类型自动格式化坐标轴刻度调用 Matplotlib 渲染将处理好的数据与样式参数打包传递给 Matplotlib 进行底层的画布绘制与图形渲染返回 Axes 对象.plot() 方法的返回值正是 Matplotlib 的 Axes 对象2. 为什么优先使用 Pandas 绘图直接使用 Pandas 绘图相比直接调用底层 Matplotlib 具有明显的效率优势零数据转换成本无需手动通过 .values 提取 NumPy 数组也不必写循环去遍历多列数据支持时间序列Pandas 对时间索引有极佳的适配能自动进行时间轴缩放与日期格式化接轨底层扩展由于返回的是 Axes 对象若内置参数无法满足美化需求可随时用标准的 ax.set_title() 或 plt.show() 接管后续定制# 简单的极速绘图示例 df pd.DataFrame({Sales: [100, 120, 140]}, index[Jan, Feb, Mar]) # 仅需一步自动将 index 作为 X 轴Sales 作为 Y 轴 ax df.plot(figsize(6, 3.5)) # 随时用 Matplotlib 原生方法叠加微调 ax.set_ylabel(USD) plt.show()二、单变量图表绘制在 Pandas 中绘制单变量图表有两种等价的调用语法函数参数模式series.plot(kind图表类型)方法链模式series.plot.kind()更加推荐代码提示友好本章介绍五种最常用的单变量图表及其适用场景1. 折线图折线图是 plot() 的默认图表类型即不传 kind 时默认绘制折线图最常用于展示随时间变化的趋势import pandas as pd import matplotlib.pyplot as plt # 构建带时间索引的单列数据 dates pd.date_range(2026-01-01, periods6, freqME) sales pd.Series([120, 135, 125, 145, 160, 175], indexdates) # 绘制折线图 ax sales.plot.line(figsize(7, 3.5), color#1f77b4, markero) ax.set_ylabel(Sales Volume) plt.grid(True, linestyle:, alpha0.6) plt.show()输出结果2. 柱状图柱状图用于展示不同类别之间的大小比较。处理离散文本分类或对频数统计结果绘图时非常高效垂直柱状图series.plot.bar()水平条形图series.plot.barh()当分类名称较长时使用category_sales pd.Series([450, 320, 280, 410], index[East, West, South, North]) # 绘制水平柱状图 ax category_sales.plot.bar(figsize(7, 3.5), color#4c8be2, width0.6) ax.set_xlabel(Revenue (k USD)) plt.show()输出结果3. 直方图直方图用于展示连续数值型变量的频数分布形态与聚集区间。关键参数bins分箱数量默认 10# 绘制服从正态分布的数据 np.random.seed(42) scores pd.Series(np.random.normal(loc75, scale10, size200)) # 绘制直方图 ax scores.plot.hist(bins15, figsize(7, 3.5), color#2b5c8f, edgecolorblack) ax.set_xlabel(Score) plt.show()输出结果4. 饼图饼图用于呈现离散分类占总体的比例关系关键参数autopct数值百分比格式、legend是否显示图例market_share pd.Series([35, 25, 20, 20], index[Brand A, Brand B, Brand C, Others]) # 绘制饼图 ax market_share.plot.pie( figsize(5, 5), autopct%.1f%%, startangle90, colors[#5b9bd5, #ed7d31, #a5a5a5, #ffc000] ) ax.set_ylabel() # 隐藏默认生成的 Series 列名标签 plt.show()输出结果5. 面积图面积图在折线图的基础上填充了下方的区域用于突出显示总体累积规模与量级关键参数alpha透明度避免遮挡 grid 线traffic pd.Series([100, 250, 400, 300, 500, 700], indexrange(1, 7)) # 绘制面积图 ax traffic.plot.area(figsize(7, 3.5), color#5b9bd5, alpha0.4) ax.set_xlabel(Hour) ax.set_ylabel(Active Users) plt.show()输出结果方法适用于关注点常用调参plot.line()时间序列 / 连续数值趋势变化marker, linestyleplot.bar() / .barh()离散分类与对应数值类别间数值对比width, colorplot.hist()单个连续数值变量数据分布与聚集区binsplot.pie()离散分类及其占比构成比例autopct, startangleplot.area()连续数值序列体积与累计规模alpha三、双变量与多列数据可视化在数据分析中双变量与多列数据的比较能够揭示特征之间的相关性、组合结构及趋势差异。DataFrame 支持直接将多列数据映射至坐标轴或堆叠组中无需复杂的数据重构即可完成双变量可视化1. 散点图散点图用于展示两个连续数值变量之间的分布关系与相关趋势。与单变量绘图不同调用 DataFrame.plot.scatter() 时必须显式指定 x 和 y 的列名关键参数说明x, y必需参数分别指定映射到 X 轴和 Y 轴的列名字符串c可传入第三个列名用颜色深浅映射数值大小实现三维数据展示s指定散点大小标量或数组/列名cmap当指定 c 为连续数值列时指定颜色渐变表如 viridis代码示例# 构建示例数据 np.random.seed(42) df pd.DataFrame({ Ad_Budget: np.random.uniform(10, 100, 50), Sales: np.random.uniform(20, 150, 50), ROI: np.random.uniform(1, 5, 50) }) # 绘制 X广告预算, Y销售额, 颜色ROI 的散点图 ax df.plot.scatter( xAd_Budget, ySales, cROI, cmapviridis, s50, figsize(7, 4) ) ax.set_xlabel(Ad Budget (k USD)) ax.set_ylabel(Sales Volume) plt.show()输出结果2. 蜂巢图当数据量过大如数万条记录时普通散点图会由于点位过度重叠而失去可读性。plot.hexbin() 将二维空间切分为六边形网格通过颜色深浅表达落入网格内的点数频数关键参数说明x, y必需参数二元连续变量列名gridsize指定 X 轴方向的六边形网格数量。数值越大网格越细致cmap映射密度的颜色表如 Blues代码示例# 生成大样本正态分布数据 np.random.seed(42) x_data np.random.randn(5000) y_data x_data * 0.8 np.random.randn(5000) * 0.5 df_large pd.DataFrame({Feature_X: x_data, Feature_Y: y_data}) # 绘制蜂巢图 ax df_large.plot.hexbin( xFeature_X, yFeature_Y, gridsize25, cmapBlues, figsize(7, 4) ) plt.show()输出结果3. 堆叠图当需要展示多个分类在总总量中的构成比例变化时可在柱状图或面积图中传入 stackedTrue 参数Pandas 会自动将 DataFrame 的每一列作为一个堆叠层按照列顺序逐层向上累加关键参数说明stacked布尔值设为 True 时开启堆叠模式默认为 False 彼此并排alpha透明度控制在堆叠面积图中尤为重要建议设为 0.5 - 0.8代码示例# 创建多列季度数据 quarterly_sales pd.DataFrame({ Product_A: [120, 150, 170, 190], Product_B: [90, 110, 130, 140], Product_C: [50, 60, 55, 70] }, index[Q1, Q2, Q3, Q4]) # 绘制堆叠柱状图与堆叠面积图 fig, (ax1, ax2) plt.subplots(1, 2, figsize(12, 4.5)) # 1. 堆叠柱状图展现各季度总营收及产品构成 quarterly_sales.plot.bar(stackedTrue, axax1) ax1.set_ylabel(Sales Volume) ax1.tick_params(axisx, rotation0) # 2. 堆叠面积图展现趋势及累积体量 quarterly_sales.plot.area(stackedTrue, alpha0.7, axax2) ax2.set_ylabel(Cumulative Volume) plt.show()输出结果图表类型调用 API适用场景核心优势散点图df.plot.scatter(x, y)双连续数值相关性分析支持用 c 和 s 额外扩展颜色与大小维度蜂巢图df.plot.hexbin(x, y)海量数据点相关性分析解决数据点严重重叠遮挡的问题堆叠柱状图df.plot.bar(stackedTrue)离散组别下的总量及结构占比直观展示分类总量与内部构成关系堆叠面积图df.plot.area(stackedTrue)连续序列下的总量与构成变化强调时间推移下的累积规模与趋势四、综合案例在实际工程项目中数据可视化很少是单独绘制一张孤立的图表而是需要遵循“全貌 - 结构 - 关联”的探索逻辑针对业务问题输出一套完整的分析仪表盘。本章通过一个电商业务销售数据分析案例使用 Pandas 内置的绘图 API一步步完成从数据准备到多图联合呈现场景的完整落地1. 模拟数据准备假设我们获得了某电商平台 2025 年全年的订单数据包含交易日期、商品品类、销售额以及折扣率等维度。我们首先构建包含这几项核心特征的 DataFrameimport pandas as pd import numpy as np import matplotlib.pyplot as plt # 1. 模拟 2025 全年每日订单数据 np.random.seed(42) date_range pd.date_range(start2025-01-01, end2025-12-31, freqD) n len(date_range) categories [Electronics, Clothing, Home Kitchen, Beauty] # 构建 DataFrame df pd.DataFrame({ Date: np.random.choice(date_range, size1000), Category: np.random.choice(categories, size1000, p[0.4, 0.3, 0.2, 0.1]), Sales: np.random.exponential(scale150, size1000) 20, Discount: np.random.uniform(0.05, 0.35, size1000) }).sort_values(Date).reset_index(dropTrue) # 设置日期索引以支持时间序列操作 df.set_index(Date, inplaceTrue)2. 步骤一总体大盘分析第一步的目标是查看全局2025 年的总体销售趋势如何是否存在明显的季节性波动# 1. 按月聚合计算总销售额 monthly_sales df[Sales].resample(ME).sum() # 2. 绘制月度销售趋势图 ax1 monthly_sales.plot.line( figsize(8, 4), color#1f77b4, markero, linewidth2, title2025 Monthly Total Sales Trend ) ax1.set_ylabel(Sales ($)) ax1.grid(True, linestyle--, alpha0.5) plt.show()输出结果为什么这么做使用 df[Sales].resample(ME).sum() 将日频订单数据重采样为月度聚合指标调用 .plot.line() 直接绘制时间序列折线图有什么好处平滑噪声日频数据波动极大直接看日线会有极多尖刺重采样到月频能够滤除日常噪声精准捕捉季度或月度趋势日期格式化Pandas 能够自动识别 DatetimeIndexX 轴的月份标签由 Matplotlib 自动格式化呈现无需手动配置日期刻度3. 步骤二品类结构拆解在了解了大盘趋势后第二步需要回答哪些品类贡献了主要的 sales各类别的销售占比随时间如何变化# 1. 构建月度-品类透视表 category_pivot df.pivot_table( indexpd.Grouper(freqME), columnsCategory, valuesSales, aggfuncsum ) # 2. 绘制品类堆叠柱状图 ax2 category_pivot.plot.bar( stackedTrue, figsize(9, 4.5), colormapSet2, titleMonthly Sales Contribution by Category ) ax2.set_ylabel(Sales ($)) ax2.set_xticklabels([d.strftime(%Y-%m) for d in category_pivot.index], rotation45) ax2.grid(axisy, linestyle--, alpha0.5) plt.legend(titleCategory, bbox_to_anchor(1.02, 1), locupper left) plt.tight_layout() plt.show()输出结果为什么这么做通过 df.pivot_table() 将数据塑形为 行月份、列品类 的矩阵传入 stackedTrue 开启堆叠模式有什么好处兼顾总量与构成柱子的总高度代表该月总营收柱子内部各色块的高度代表对应品类的贡献能快速识别出主力品类代码效率通过 Pandas 的透视表与 stackedTrue 结合仅需两行代码就完成了多维数据拆解与堆叠图渲染免去了手动循环画柱子的繁琐步骤4.步骤三归因与相关性探查第三步分析业务归因促销折扣Discount是否真正拉动了高客单价商品Sales的成交# 绘制折扣率与销售额的散点图 ax3 df.plot.scatter( xDiscount, ySales, cDiscount, cmapReds, s30, alpha0.7, figsize(8, 4), titleDiscount Rate vs. Order Sales Amount ) ax3.set_xlabel(Discount Rate) ax3.set_ylabel(Order Sales ($)) ax3.grid(True, linestyle:, alpha0.6) plt.show()输出结果为什么这么做使用 df.plot.scatter() 指定 xDiscount 与 ySales利用 cDiscount 与 cmapReds 让数据点的颜色与折扣力度绑定有什么好处验证业务假设能够直观观察高 Sales 订单是否集中在高折扣区X 轴右侧方便评估促销政策发现异常值散点图能一眼找出低折扣但高销售额的爆款订单或者高折扣但销售额依然低迷的亏损订单五、Pandas、Matplotlib、Seaborn 对比在 Python 数据分析与可视化生态中Matplotlib、Seaborn和Pandas 内置绘图构成了最核心的三要素。三者并非替代关系而是层层递进、互为补充的关系Matplotlib是底层基石提供了像素级的图形控制力Seaborn是高阶统计可视化工具封装了复杂的统计算法与现代色彩主题Pandas 绘图是数据探索阶段的极速工具与 DataFrame 结构无缝集成操作效率极高库名称特点优势局限适合使用场景Matplotlib最底层 API自由度极高支持任意细节的像素级自定义代码量大且冗长复杂多图排版、特殊定制图表、出版级学术图表Seaborn美观统计图内置高级统计逻辑美学风格调和对单独图形元素的微调仍需依赖 Matplotlib探索性统计分析、交叉特征对比Pandas简单快速分析极简语法直接绑定 DataFrame 的索引与列名样式定制与高阶统计功能较弱数据清洗与快速验证数据分布最佳实践在实际的 Python 数据分析工作流中并不需要孤立地只选择某一个库推荐的搭配流程为快速探索数据Pandas拿到原始 DataFrame 后直接调用 df.plot() 或 df.plot.hist()用最少的代码快速观察趋势、离群值与分布特征深入挖掘关系Seaborn需要按多维度分组、查看变量间相关性时切换为 Seaborn 进行高效的统计表达输出成品图表Matplotlib当需要将图表放入 PPT、报告或论文时使用 Matplotlib 调整 figsize、修改字体、设置图例位置以及去除无用边框输出精细美化的成品总结本章学习了 Pandas 内置的数据可视化功能掌握了柱状图、折线图、面积图、直方图、饼图、散点图、蜂窝图和堆叠图等常见图表的绘制方法进一步体会了 Pandas 在快速探索性数据分析中的优势。通过对 Pandas、Matplotlib 和 Seaborn 三种可视化方式的学习我们已经能够根据不同的数据分析需求选择合适的工具完成数据展示与结果表达至此《Python 数据分析从入门到实战》系列正式完结。从数据分析基础、NumPy 数值计算、Pandas 数据处理到 Matplotlib、Seaborn 和 Pandas 数据可视化我们系统学习了 Python 数据分析的核心知识体系掌握了数据读取、清洗、转换、统计分析以及可视化展示等完整的数据分析流程为后续学习机器学习、深度学习以及人工智能等更高级的内容奠定了坚实的基础希望本系列能够帮助大家建立完整的数据分析思维不仅学会各类库和函数的使用更能够运用这些工具解决实际问题在实践中不断提升自己的数据分析能力