简体中文 繁體中文 English Deutsch 한국 사람 بالعربية TÜRKÇE português คนไทย Français Japanese

站内搜索

搜索
AI 风月

活动公告

03-01 22:34
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,资源失效请在帖子内回复要求补档,会尽快处理!
10-23 09:31

Python pandas数据可视化教程如何将数据分析结果输出为精美图片

3万

主题

640

科技点

3万

积分

白金月票

碾压王

积分
32704

立华奏

发表于 2025-9-8 13:20:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
引言

在数据分析领域,可视化是不可或缺的一环。通过图表,我们可以更直观地展示数据中的模式、趋势和关系。Python的pandas库作为数据分析的强大工具,提供了丰富的数据可视化功能。本教程将详细介绍如何使用pandas进行数据可视化,并将分析结果输出为精美图片,使你的数据分析报告更加专业和吸引人。

准备工作

在开始之前,我们需要确保安装了必要的Python库。除了pandas,我们还需要matplotlib和seaborn这两个常用的可视化库。
  1. # 安装必要的库
  2. !pip install pandas matplotlib seaborn
  3. # 导入库
  4. import pandas as pd
  5. import matplotlib.pyplot as plt
  6. import seaborn as sns
  7. import numpy as np
  8. # 设置中文字体显示
  9. plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
  10. plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
复制代码

Pandas内置的可视化功能

Pandas内置了基于matplotlib的可视化功能,可以直接对Series和DataFrame对象调用plot()方法进行绘图。

基本绘图方法
  1. # 创建示例数据
  2. np.random.seed(0)
  3. df = pd.DataFrame({
  4.     'A': np.random.randn(100).cumsum(),
  5.     'B': np.random.randn(100).cumsum(),
  6.     'C': np.random.randn(100).cumsum()
  7. }, index=pd.date_range('2020-01-01', periods=100))
  8. # 使用pandas内置的plot方法
  9. df.plot(figsize=(10, 6))
  10. plt.title('随机累积和趋势图')
  11. plt.xlabel('日期')
  12. plt.ylabel('值')
  13. plt.grid(True)
  14. plt.show()
复制代码

这段代码创建了一个包含三列随机累积和的DataFrame,并使用plot()方法绘制了折线图。figsize参数用于设置图表大小,title、xlabel和ylabel分别设置图表标题和坐标轴标签,grid(True)添加网格线。

不同类型的图表

Pandas支持多种类型的图表,通过kind参数指定:
  1. # 创建示例数据
  2. df_sales = pd.DataFrame({
  3.     '产品': ['A', 'B', 'C', 'D', 'E'],
  4.     '销量': [120, 150, 180, 200, 90],
  5.     '利润': [30, 45, 60, 70, 25]
  6. })
  7. # 柱状图
  8. df_sales.plot(x='产品', y='销量', kind='bar', figsize=(10, 6))
  9. plt.title('产品销量柱状图')
  10. plt.xlabel('产品')
  11. plt.ylabel('销量')
  12. plt.xticks(rotation=0)  # 旋转x轴标签
  13. plt.show()
  14. # 饼图
  15. df_sales.set_index('产品')['销量'].plot(kind='pie', figsize=(8, 8), autopct='%1.1f%%')
  16. plt.title('产品销量占比')
  17. plt.ylabel('')  # 移除y轴标签
  18. plt.show()
  19. # 散点图
  20. df_sales.plot(x='销量', y='利润', kind='scatter', figsize=(8, 6))
  21. plt.title('销量与利润关系')
  22. plt.xlabel('销量')
  23. plt.ylabel('利润')
  24. for i, txt in enumerate(df_sales['产品']):
  25.     plt.annotate(txt, (df_sales['销量'][i], df_sales['利润'][i]))
  26. plt.grid(True)
  27. plt.show()
复制代码

这段代码展示了三种不同类型的图表:柱状图、饼图和散点图。柱状图适合比较不同类别的数值,饼图适合展示占比关系,散点图适合展示两个变量之间的关系。

使用Seaborn增强可视化效果

Seaborn是基于matplotlib的高级可视化库,提供了更美观的默认样式和更丰富的图表类型。

Seaborn基础用法
  1. # 设置Seaborn样式
  2. sns.set_style("whitegrid")
  3. sns.set_context("notebook", font_scale=1.2)
  4. # 创建示例数据
  5. tips = sns.load_dataset("tips")
  6. # 使用Seaborn绘制散点图
  7. plt.figure(figsize=(10, 6))
  8. sns.scatterplot(x="total_bill", y="tip", hue="sex", size="size", data=tips)
  9. plt.title('账单金额与小费关系')
  10. plt.xlabel('账单金额')
  11. plt.ylabel('小费')
  12. plt.show()
复制代码

这段代码使用Seaborn的scatterplot函数绘制了一个散点图,通过hue参数按性别着色,通过size参数按聚会人数调整点的大小,展示了账单金额与小费之间的关系。

Seaborn高级图表
  1. # 箱线图
  2. plt.figure(figsize=(10, 6))
  3. sns.boxplot(x="day", y="total_bill", hue="smoker", data=tips)
  4. plt.title('不同日期和吸烟状态的账单金额分布')
  5. plt.xlabel('星期')
  6. plt.ylabel('账单金额')
  7. plt.show()
  8. # 热力图
  9. # 计算相关系数矩阵
  10. corr = tips.corr()
  11. plt.figure(figsize=(8, 6))
  12. sns.heatmap(corr, annot=True, cmap='coolwarm', vmin=-1, vmax=1)
  13. plt.title('变量相关性热力图')
  14. plt.show()
  15. # 成对关系图
  16. sns.pairplot(tips, hue="sex")
  17. plt.suptitle('变量成对关系图', y=1.02)
  18. plt.show()
复制代码

这段代码展示了三种Seaborn的高级图表:箱线图、热力图和成对关系图。箱线图展示了数据的分布情况,热力图展示了变量间的相关性,成对关系图则同时展示了多个变量两两之间的关系。

美化图表

要让图表更加精美,我们需要对图表的各个方面进行调整,包括颜色、字体、标签等。

调整颜色和样式
  1. # 创建示例数据
  2. df_colors = pd.DataFrame({
  3.     '类别': ['A', 'B', 'C', 'D', 'E'],
  4.     '值': [23, 45, 56, 78, 32]
  5. })
  6. # 自定义颜色
  7. colors = ['#FF6B6B', '#4ECDC4', '#FFD166', '#6A0572', '#1A535C']
  8. # 绘制带有自定义颜色的柱状图
  9. plt.figure(figsize=(10, 6))
  10. bars = plt.bar(df_colors['类别'], df_colors['值'], color=colors)
  11. # 添加数据标签
  12. for bar in bars:
  13.     height = bar.get_height()
  14.     plt.text(bar.get_x() + bar.get_width()/2., height,
  15.              f'{height}',
  16.              ha='center', va='bottom')
  17. # 设置标题和标签
  18. plt.title('自定义颜色的柱状图', fontsize=16, fontweight='bold')
  19. plt.xlabel('类别', fontsize=12)
  20. plt.ylabel('值', fontsize=12)
  21. # 设置刻度标签大小
  22. plt.xticks(fontsize=10)
  23. plt.yticks(fontsize=10)
  24. # 移除边框
  25. for spine in plt.gca().spines.values():
  26.     spine.set_visible(False)
  27. # 添加水平网格线
  28. plt.grid(axis='y', alpha=0.3)
  29. plt.show()
复制代码

这段代码展示了如何自定义柱状图的颜色、添加数据标签、调整字体大小、移除边框和添加网格线等美化操作。

创建子图
  1. # 创建示例数据
  2. np.random.seed(0)
  3. df_subplots = pd.DataFrame({
  4.     'A': np.random.randn(100),
  5.     'B': np.random.randn(100),
  6.     'C': np.random.randn(100),
  7.     'D': np.random.randn(100)
  8. })
  9. # 创建2x2的子图
  10. fig, axes = plt.subplots(2, 2, figsize=(12, 10))
  11. fig.suptitle('多子图示例', fontsize=16, fontweight='bold')
  12. # 绘制第一个子图:直方图
  13. df_subplots['A'].plot(kind='hist', ax=axes[0, 0], bins=20, color='skyblue')
  14. axes[0, 0].set_title('A列直方图')
  15. axes[0, 0].set_xlabel('值')
  16. axes[0, 0].set_ylabel('频数')
  17. # 绘制第二个子图:箱线图
  18. df_subplots[['B', 'C']].plot(kind='box', ax=axes[0, 1])
  19. axes[0, 1].set_title('B和C列箱线图')
  20. axes[0, 1].set_xlabel('列')
  21. axes[0, 1].set_ylabel('值')
  22. # 绘制第三个子图:散点图
  23. df_subplots.plot(kind='scatter', x='A', y='B', ax=axes[1, 0], color='coral')
  24. axes[1, 0].set_title('A和B列散点图')
  25. axes[1, 0].set_xlabel('A列值')
  26. axes[1, 0].set_ylabel('B列值')
  27. # 绘制第四个子图:折线图
  28. df_subplots['D'].cumsum().plot(kind='line', ax=axes[1, 1], color='green')
  29. axes[1, 1].set_title('D列累积和折线图')
  30. axes[1, 1].set_xlabel('索引')
  31. axes[1, 1].set_ylabel('累积值')
  32. # 调整子图间距
  33. plt.tight_layout()
  34. plt.subplots_adjust(top=0.9)
  35. plt.show()
复制代码

这段代码展示了如何创建包含四个子图的图表,每个子图展示不同类型的可视化效果,并通过tight_layout()和subplots_adjust()调整子图间距,使整体布局更加美观。

将可视化结果保存为图片

完成数据可视化后,我们需要将结果保存为图片,以便在报告、演示文稿或网页中使用。

基本保存方法
  1. # 创建示例图表
  2. plt.figure(figsize=(10, 6))
  3. x = np.linspace(0, 10, 100)
  4. y = np.sin(x)
  5. plt.plot(x, y, 'b-', linewidth=2, label='sin(x)')
  6. plt.fill_between(x, y, alpha=0.2)
  7. plt.title('正弦函数图像', fontsize=16)
  8. plt.xlabel('x', fontsize=12)
  9. plt.ylabel('sin(x)', fontsize=12)
  10. plt.legend(fontsize=12)
  11. plt.grid(True, alpha=0.3)
  12. # 保存图表为PNG格式
  13. plt.savefig('sine_function.png', dpi=300, bbox_inches='tight')
  14. # 保存图表为PDF格式
  15. plt.savefig('sine_function.pdf', bbox_inches='tight')
  16. # 保存图表为SVG格式
  17. plt.savefig('sine_function.svg', bbox_inches='tight')
  18. plt.show()
复制代码

这段代码展示了如何将图表保存为不同的格式,包括PNG、PDF和SVG。dpi参数设置图片的分辨率(每英寸点数),bbox_inches='tight'参数确保保存的图片包含所有标签和标题。

高级保存选项
  1. # 创建示例图表
  2. fig, ax = plt.subplots(figsize=(10, 6))
  3. categories = ['A', 'B', 'C', 'D', 'E']
  4. values = [23, 45, 56, 78, 32]
  5. bars = ax.bar(categories, values, color=plt.cm.viridis(np.linspace(0, 1, len(categories))))
  6. # 添加数据标签
  7. for bar in bars:
  8.     height = bar.get_height()
  9.     ax.text(bar.get_x() + bar.get_width()/2., height,
  10.             f'{height}',
  11.             ha='center', va='bottom', fontsize=12)
  12. # 设置标题和标签
  13. ax.set_title('高级保存选项示例', fontsize=16, fontweight='bold', pad=20)
  14. ax.set_xlabel('类别', fontsize=12, labelpad=10)
  15. ax.set_ylabel('值', fontsize=12, labelpad=10)
  16. # 设置刻度标签
  17. ax.tick_params(axis='both', which='major', labelsize=10)
  18. # 设置边框
  19. for spine in ax.spines.values():
  20.     spine.set_visible(False)
  21. # 添加水平网格线
  22. ax.grid(axis='y', alpha=0.3)
  23. # 添加水印
  24. fig.text(0.95, 0.05, 'Confidential',
  25.          fontsize=40, color='gray',
  26.          ha='right', va='bottom', alpha=0.3, rotation=15)
  27. # 设置透明背景
  28. fig.patch.set_alpha(0)
  29. # 保存图表为PNG,设置透明背景和高质量
  30. plt.savefig('advanced_save.png',
  31.             dpi=300,
  32.             bbox_inches='tight',
  33.             transparent=True,
  34.             quality=95)
  35. plt.show()
复制代码

这段代码展示了更高级的保存选项,包括设置透明背景、添加水印、调整图片质量等。transparent=True参数使背景透明,quality参数设置JPEG格式图片的质量(0-100)。

批量保存图表
  1. # 创建示例数据
  2. np.random.seed(0)
  3. data = {
  4.     f'系列{i}': np.random.randn(50).cumsum() for i in range(1, 6)
  5. }
  6. df_batch = pd.DataFrame(data)
  7. # 为每个系列创建并保存图表
  8. for column in df_batch.columns:
  9.     plt.figure(figsize=(8, 5))
  10.     plt.plot(df_batch.index, df_batch[column], linewidth=2)
  11.     plt.title(f'{column}趋势图', fontsize=14, fontweight='bold')
  12.     plt.xlabel('索引', fontsize=12)
  13.     plt.ylabel('值', fontsize=12)
  14.     plt.grid(True, alpha=0.3)
  15.    
  16.     # 保存图表
  17.     filename = f'trend_{column.lower()}.png'
  18.     plt.savefig(filename, dpi=300, bbox_inches='tight')
  19.     plt.close()  # 关闭当前图表,避免内存泄漏
  20. # 创建组合图表并保存
  21. fig, axes = plt.subplots(2, 3, figsize=(15, 10))
  22. fig.suptitle('所有系列趋势组合图', fontsize=16, fontweight='bold')
  23. axes = axes.flatten()  # 将2D数组转换为1D数组以便迭代
  24. for i, column in enumerate(df_batch.columns):
  25.     if i < len(axes):  # 确保不超出子图数量
  26.         axes[i].plot(df_batch.index, df_batch[column], linewidth=2)
  27.         axes[i].set_title(f'{column}趋势')
  28.         axes[i].set_xlabel('索引')
  29.         axes[i].set_ylabel('值')
  30.         axes[i].grid(True, alpha=0.3)
  31. # 移除多余的子图
  32. for i in range(len(df_batch.columns), len(axes)):
  33.     fig.delaxes(axes[i])
  34. plt.tight_layout()
  35. plt.subplots_adjust(top=0.9)
  36. plt.savefig('combined_trends.png', dpi=300, bbox_inches='tight')
  37. plt.close()
  38. print("所有图表已保存完成")
复制代码

这段代码展示了如何批量创建和保存图表,包括为每个数据系列单独创建图表并保存,以及创建包含所有系列的组合图表。使用plt.close()可以关闭当前图表,避免内存泄漏。

实际案例:销售数据可视化

让我们通过一个实际的销售数据可视化案例,综合运用前面介绍的各种技巧。
  1. # 创建示例销售数据
  2. np.random.seed(42)
  3. dates = pd.date_range('2022-01-01', '2022-12-31')
  4. products = ['产品A', '产品B', '产品C', '产品D']
  5. regions = ['华北', '华东', '华南', '西部']
  6. # 生成随机销售数据
  7. sales_data = []
  8. for date in dates:
  9.     for product in products:
  10.         for region in regions:
  11.             # 基础销量加上季节性和随机波动
  12.             base_sales = np.random.randint(50, 200)
  13.             seasonal_factor = 1 + 0.3 * np.sin(2 * np.pi * date.dayofyear / 365)
  14.             random_factor = np.random.normal(1, 0.1)
  15.             sales = int(base_sales * seasonal_factor * random_factor)
  16.             
  17.             sales_data.append({
  18.                 '日期': date,
  19.                 '产品': product,
  20.                 '地区': region,
  21.                 '销量': sales,
  22.                 '收入': sales * np.random.randint(100, 300)
  23.             })
  24. df_sales = pd.DataFrame(sales_data)
  25. # 添加月份和季度列
  26. df_sales['月份'] = df_sales['日期'].dt.month
  27. df_sales['季度'] = df_sales['日期'].dt.quarter
  28. df_sales['星期几'] = df_sales['日期'].dt.day_name()
  29. # 查看数据结构
  30. print(df_sales.head())
复制代码

这段代码创建了一个包含日期、产品、地区、销量和收入等信息的销售数据集,并添加了月份、季度和星期几等辅助列。

月度销售趋势分析
  1. # 按月份汇总销售数据
  2. monthly_sales = df_sales.groupby(['月份', '产品'])['销量'].sum().unstack()
  3. # 创建月度销售趋势图
  4. plt.figure(figsize=(12, 8))
  5. # 为每个产品绘制折线图
  6. for i, product in enumerate(monthly_sales.columns):
  7.     plt.plot(monthly_sales.index, monthly_sales[product],
  8.              linewidth=2.5,
  9.              label=product,
  10.              marker='o',
  11.              markersize=6)
  12. # 添加标题和标签
  13. plt.title('2022年各产品月度销售趋势', fontsize=16, fontweight='bold', pad=20)
  14. plt.xlabel('月份', fontsize=12, labelpad=10)
  15. plt.ylabel('销量', fontsize=12, labelpad=10)
  16. # 设置x轴刻度
  17. plt.xticks(range(1, 13),
  18.            ['1月', '2月', '3月', '4月', '5月', '6月',
  19.             '7月', '8月', '9月', '10月', '11月', '12月'],
  20.            fontsize=10)
  21. # 添加图例
  22. plt.legend(fontsize=12, frameon=True, fancybox=True, shadow=True)
  23. # 添加网格线
  24. plt.grid(True, linestyle='--', alpha=0.7)
  25. # 突出显示销量最高的月份
  26. max_month = monthly_sales.sum(axis=1).idxmax()
  27. plt.axvline(x=max_month, color='r', linestyle='--', alpha=0.3)
  28. plt.text(max_month, monthly_sales.sum(axis=1).max() * 0.95,
  29.          '销量最高月份',
  30.          ha='center', va='center',
  31.          bbox=dict(facecolor='white', alpha=0.7))
  32. # 调整边距
  33. plt.tight_layout()
  34. # 保存图表
  35. plt.savefig('monthly_sales_trend.png', dpi=300, bbox_inches='tight')
  36. plt.show()
复制代码

这段代码创建了各产品月度销售趋势图,包括折线图、标记点、标题、标签、图例、网格线等元素,并突出显示了销量最高的月份。

地区销售分布分析
  1. # 按地区和产品汇总销售数据
  2. region_product_sales = df_sales.groupby(['地区', '产品'])['销量'].sum().unstack()
  3. # 创建地区销售分布图
  4. fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(16, 8))
  5. # 第一个子图:堆叠柱状图
  6. region_product_sales.plot(kind='bar', stacked=True, ax=ax1,
  7.                          colormap='viridis', width=0.7)
  8. ax1.set_title('各地区不同产品销量分布', fontsize=14, fontweight='bold')
  9. ax1.set_xlabel('地区', fontsize=12)
  10. ax1.set_ylabel('销量', fontsize=12)
  11. ax1.legend(title='产品', fontsize=10)
  12. ax1.grid(True, axis='y', linestyle='--', alpha=0.7)
  13. # 添加数据标签
  14. for i, total in enumerate(region_product_sales.sum(axis=1)):
  15.     ax1.text(i, total + 50, f'{total:,}',
  16.              ha='center', va='bottom', fontweight='bold')
  17. # 第二个子图:饼图
  18. region_total = region_product_sales.sum(axis=1)
  19. explode = [0.05 if region == region_total.idxmax() else 0 for region in region_total.index]
  20. wedges, texts, autotexts = ax2.pie(region_total,
  21.                                    labels=region_total.index,
  22.                                    autopct='%1.1f%%',
  23.                                    startangle=90,
  24.                                    explode=explode,
  25.                                    shadow=True,
  26.                                    colors=plt.cm.viridis(np.linspace(0, 1, len(region_total))))
  27. ax2.set_title('各地区销量占比', fontsize=14, fontweight='bold')
  28. # 美化饼图标签
  29. for autotext in autotexts:
  30.     autotext.set_color('white')
  31.     autotext.set_fontweight('bold')
  32. # 添加总销量标签
  33. total_sales = region_total.sum()
  34. ax2.text(0, -1.2, f'总销量: {total_sales:,}',
  35.          ha='center', va='center', fontsize=12, fontweight='bold')
  36. plt.tight_layout()
  37. plt.savefig('region_sales_distribution.png', dpi=300, bbox_inches='tight')
  38. plt.show()
复制代码

这段代码创建了两个子图:堆叠柱状图和饼图,分别展示了各地区不同产品的销量分布和各地区销量占比。

产品相关性分析
  1. # 计算产品之间的相关性
  2. product_corr = df_sales.pivot_table(index='日期', columns='产品', values='销量').corr()
  3. # 创建相关性热力图
  4. plt.figure(figsize=(10, 8))
  5. # 使用Seaborn绘制热力图
  6. mask = np.triu(np.ones_like(product_corr, dtype=bool))  # 创建上三角掩码
  7. sns.heatmap(product_corr,
  8.             mask=mask,
  9.             annot=True,
  10.             fmt='.2f',
  11.             cmap='coolwarm',
  12.             vmin=-1,
  13.             vmax=1,
  14.             linewidths=0.5,
  15.             cbar_kws={"shrink": 0.8})
  16. plt.title('产品销量相关性热力图', fontsize=16, fontweight='bold', pad=20)
  17. plt.tight_layout()
  18. # 保存图表
  19. plt.savefig('product_correlation_heatmap.png', dpi=300, bbox_inches='tight')
  20. plt.show()
  21. # 创建产品销量散点图矩阵
  22. from pandas.plotting import scatter_matrix
  23. # 准备数据
  24. scatter_data = df_sales.pivot_table(index='日期', columns='产品', values='销量')
  25. # 创建散点图矩阵
  26. fig, axes = plt.subplots(4, 4, figsize=(16, 16))
  27. fig.suptitle('产品销量散点图矩阵', fontsize=16, fontweight='bold')
  28. # 使用Pandas的scatter_matrix函数
  29. scatter_matrix(scatter_data, alpha=0.5, figsize=(16, 16),
  30.                diagonal='kde', ax=axes,
  31.                color='green', grid=True)
  32. plt.tight_layout()
  33. plt.subplots_adjust(top=0.95)
  34. plt.savefig('product_scatter_matrix.png', dpi=300, bbox_inches='tight')
  35. plt.show()
复制代码

这段代码创建了产品销量相关性热力图和散点图矩阵,用于分析不同产品销量之间的相关性。

销售数据仪表盘

最后,让我们创建一个综合的销售数据仪表盘,将多个可视化结果组合在一起:
  1. # 创建销售数据仪表盘
  2. fig = plt.figure(figsize=(20, 16))
  3. gs = fig.add_gridspec(3, 3)
  4. # 添加总标题
  5. fig.suptitle('2022年销售数据仪表盘', fontsize=20, fontweight='bold')
  6. # 1. 月度销售趋势 (左上)
  7. ax1 = fig.add_subplot(gs[0, :2])
  8. monthly_total = df_sales.groupby('月份')['销量'].sum()
  9. ax1.plot(monthly_total.index, monthly_total.values,
  10.          linewidth=3, color='royalblue', marker='o', markersize=8)
  11. ax1.fill_between(monthly_total.index, monthly_total.values, alpha=0.3, color='royalblue')
  12. ax1.set_title('月度销售总趋势', fontsize=14, fontweight='bold')
  13. ax1.set_xlabel('月份')
  14. ax1.set_ylabel('销量')
  15. ax1.set_xticks(range(1, 13))
  16. ax1.grid(True, alpha=0.3)
  17. # 添加最高和最低销量标注
  18. max_month = monthly_total.idxmax()
  19. min_month = monthly_total.idxmin()
  20. ax1.annotate(f'最高: {monthly_total[max_month]:,}',
  21.              xy=(max_month, monthly_total[max_month]),
  22.              xytext=(max_month+1, monthly_total[max_month]*0.9),
  23.              arrowprops=dict(facecolor='green', shrink=0.05, width=1, headwidth=8))
  24. ax1.annotate(f'最低: {monthly_total[min_month]:,}',
  25.              xy=(min_month, monthly_total[min_month]),
  26.              xytext=(min_month+1, monthly_total[min_month]*1.1),
  27.              arrowprops=dict(facecolor='red', shrink=0.05, width=1, headwidth=8))
  28. # 2. 产品销量占比 (右上)
  29. ax2 = fig.add_subplot(gs[0, 2])
  30. product_total = df_sales.groupby('产品')['销量'].sum()
  31. wedges, texts, autotexts = ax2.pie(product_total,
  32.                                   labels=product_total.index,
  33.                                   autopct='%1.1f%%',
  34.                                   startangle=90,
  35.                                   colors=plt.cm.Set3(np.linspace(0, 1, len(product_total))))
  36. ax2.set_title('产品销量占比', fontsize=14, fontweight='bold')
  37. for autotext in autotexts:
  38.     autotext.set_color('black')
  39.     autotext.set_fontweight('bold')
  40. # 3. 地区销量分布 (中左)
  41. ax3 = fig.add_subplot(gs[1, 0])
  42. region_total = df_sales.groupby('地区')['销量'].sum().sort_values(ascending=False)
  43. bars = ax3.bar(region_total.index, region_total.values,
  44.                color=plt.cm.viridis(np.linspace(0, 1, len(region_total))))
  45. ax3.set_title('地区销量分布', fontsize=14, fontweight='bold')
  46. ax3.set_xlabel('地区')
  47. ax3.set_ylabel('销量')
  48. # 添加数据标签
  49. for bar in bars:
  50.     height = bar.get_height()
  51.     ax3.text(bar.get_x() + bar.get_width()/2., height,
  52.              f'{height:,}',
  53.              ha='center', va='bottom')
  54. # 4. 季度销售对比 (中中)
  55. ax4 = fig.add_subplot(gs[1, 1])
  56. quarter_product = df_sales.groupby(['季度', '产品'])['销量'].sum().unstack()
  57. quarter_product.plot(kind='bar', ax=ax4, width=0.7)
  58. ax4.set_title('季度产品销量对比', fontsize=14, fontweight='bold')
  59. ax4.set_xlabel('季度')
  60. ax4.set_ylabel('销量')
  61. ax4.legend(title='产品')
  62. ax4.grid(True, axis='y', alpha=0.3)
  63. # 5. 星期销量分布 (中右)
  64. ax5 = fig.add_subplot(gs[1, 2])
  65. weekday_order = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
  66. weekday_sales = df_sales.groupby('星期几')['销量'].mean().reindex(weekday_order)
  67. ax5.plot(weekday_sales.index, weekday_sales.values,
  68.          linewidth=3, color='crimson', marker='o', markersize=8)
  69. ax5.fill_between(weekday_sales.index, weekday_sales.values, alpha=0.3, color='crimson')
  70. ax5.set_title('星期平均销量分布', fontsize=14, fontweight='bold')
  71. ax5.set_xlabel('星期')
  72. ax5.set_ylabel('平均销量')
  73. ax5.tick_params(axis='x', rotation=45)
  74. ax5.grid(True, alpha=0.3)
  75. # 6. 产品相关性热力图 (下左)
  76. ax6 = fig.add_subplot(gs[2, 0])
  77. product_corr = df_sales.pivot_table(index='日期', columns='产品', values='销量').corr()
  78. mask = np.triu(np.ones_like(product_corr, dtype=bool))
  79. sns.heatmap(product_corr, mask=mask, annot=True, fmt='.2f',
  80.             cmap='coolwarm', vmin=-1, vmax=1, ax=ax6, cbar=False)
  81. ax6.set_title('产品销量相关性', fontsize=14, fontweight='bold')
  82. # 7. 销量与收入关系 (下中)
  83. ax7 = fig.add_subplot(gs[2, 1])
  84. # 聚合数据以减少点数
  85. daily_sales = df_sales.groupby('日期').agg({'销量': 'sum', '收入': 'sum'})
  86. ax7.scatter(daily_sales['销量'], daily_sales['收入'], alpha=0.6, color='green')
  87. # 添加趋势线
  88. z = np.polyfit(daily_sales['销量'], daily_sales['收入'], 1)
  89. p = np.poly1d(z)
  90. ax7.plot(daily_sales['销量'], p(daily_sales['销量']), "r--", linewidth=2)
  91. ax7.set_title('日销量与收入关系', fontsize=14, fontweight='bold')
  92. ax7.set_xlabel('销量')
  93. ax7.set_ylabel('收入')
  94. ax7.grid(True, alpha=0.3)
  95. # 8. 关键指标卡片 (下右)
  96. ax8 = fig.add_subplot(gs[2, 2])
  97. ax8.axis('off')
  98. # 计算关键指标
  99. total_sales = df_sales['销量'].sum()
  100. total_revenue = df_sales['收入'].sum()
  101. avg_daily_sales = df_sales.groupby('日期')['销量'].sum().mean()
  102. best_product = df_sales.groupby('产品')['销量'].sum().idxmax()
  103. best_region = df_sales.groupby('地区')['销量'].sum().idxmax()
  104. # 创建指标卡片
  105. metrics = [
  106.     f"总销量: {total_sales:,}",
  107.     f"总收入: ¥{total_revenue:,.0f}",
  108.     f"日均销量: {avg_daily_sales:,.0f}",
  109.     f"最佳产品: {best_product}",
  110.     f"最佳地区: {best_region}"
  111. ]
  112. for i, metric in enumerate(metrics):
  113.     ax8.text(0.5, 0.9-i*0.15, metric,
  114.              ha='center', va='center', fontsize=12,
  115.              bbox=dict(facecolor='lightblue', alpha=0.5, boxstyle='round'))
  116. ax8.set_title('关键指标', fontsize=14, fontweight='bold', pad=20)
  117. # 调整布局
  118. plt.tight_layout()
  119. plt.subplots_adjust(top=0.95)
  120. # 添加水印
  121. fig.text(0.95, 0.05, '销售数据分析报告',
  122.          fontsize=30, color='gray',
  123.          ha='right', va='bottom', alpha=0.2, rotation=15)
  124. # 保存仪表盘
  125. plt.savefig('sales_dashboard.png', dpi=300, bbox_inches='tight')
  126. plt.show()
复制代码

这段代码创建了一个综合的销售数据仪表盘,包含8个不同的子图,展示了月度销售趋势、产品销量占比、地区销量分布、季度产品销量对比、星期销量分布、产品销量相关性、销量与收入关系以及关键指标。

总结

本教程详细介绍了如何使用Python的pandas库进行数据可视化,并将分析结果输出为精美图片。我们学习了:

1. Pandas内置的可视化功能,包括基本绘图方法和不同类型的图表
2. 使用Seaborn增强可视化效果,创建更美观的图表
3. 美化图表的技巧,包括调整颜色、样式、创建子图等
4. 将可视化结果保存为图片的方法,包括基本保存、高级选项和批量保存
5. 通过实际销售数据可视化案例,综合运用各种技巧创建了完整的仪表盘

通过这些技术和方法,你可以将数据分析结果转化为精美、专业的图片,使你的报告和演示更加生动和有说服力。记住,好的数据可视化不仅要美观,更要准确地传达数据中的信息和洞察。

希望本教程对你在数据可视化方面的学习和实践有所帮助!
「七転び八起き(ななころびやおき)」
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

手机版|联系我们|小黑屋|TG频道|RSS |网站地图

Powered by Pixtech

© 2025-2026 Pixtech Team.

>