本文将通过 完整代码分解说明 的方式,手把手教你用Python的Matplotlib库绘制商业级气泡图。每个代码块都包含详细的功能解析,即使零基础也能轻松掌握!
一、环境配置与库导入
1.1 为什么要用这些库?
import matplotlib.pyplot as plt # 绘图核心库
import numpy as np # 数值计算支持
import pandas as pd # 数据结构处理
-
Matplotlib:Python最基础的绘图库,类似Excel的图表功能但更强大
-
NumPy:生成模拟数据,进行数值计算
-
Pandas:结构化数据处理,类似Excel表格操作
-
二、数据生成详解
-
2.1 创建模拟数据
-
np.random.seed(2023) # 固定随机种子,保证每次生成数据一致 data_size = 30 # 生成30个样本点 # 生成正态分布的销售额数据(均值50万,标准差15万) x = np.random.normal(50, 15, data_size) # 生成与销售额相关的利润数据(加入随机波动) y = x * np.random.uniform(0.8, 1.2, data_size) + np.random.randn(data_size)*10 # 生成市场规模数据(绝对值避免负数) bubble_size = np.abs(np.random.randn(data_size) * 50) + 10 # 随机生成产品类别标签 categories = np.random.choice(['电子产品', '食品饮料', '服装服饰'], data_size)
参数解析表
参数 作用说明 商业意义 np.random.normal
生成正态分布数据 模拟自然分布的销售额数据 np.random.uniform
生成均匀分布随机数 模拟利润率波动 np.random.randn
生成标准正态分布噪声 模拟市场不确定性因素
三、数据结构化处理
3.1 创建DataFrame
df = pd.DataFrame({
'销售额(万)': x, # X轴数据
'利润(万)': y, # Y轴数据
'市场规模': bubble_size, # 气泡大小数据
'产品类别': categories # 分类标签数据
})
3.2 颜色编码映射
# 创建类别到数字的映射字典
color_mapping = {'电子产品': 0, '食品饮料': 1, '服装服饰': 2}
# 新增颜色编码列
df['颜色编码'] = df['产品类别'].map(color_mapping)
-
作用:将文字分类转换为数字,便于颜色映射
-
原理:
map()
方法根据字典进行值替换
四、核心绘图代码解析
4.1 创建画布
plt.figure(figsize=(12, 8), dpi=100) # 创建12英寸宽、8英寸高的画布
-
figsize
:控制图表物理尺寸(单位:英寸) -
dpi
:每英寸像素点数,控制图像精细度
4.2 绘制气泡图
scatter = plt.scatter(
x='销售额(万)', # X轴数据列
y='利润(万)', # Y轴数据列
s=df['市场规模']*5, # 气泡大小(原始数据乘以缩放系数)
c='颜色编码', # 颜色数据列
cmap='tab20c', # 颜色映射方案
alpha=0.8, # 透明度(0-1)
edgecolors='white', # 气泡边缘颜色
linewidths=0.5, # 边缘线宽
data=df # 数据来源
)
关键参数详解表
参数 | 作用说明 | 推荐调整范围 |
---|---|---|
s | 气泡尺寸基数,需根据数据量级调整 | 通常取数据值的1-10倍 |
cmap | 颜色映射方案 | 推荐使用tab20/tab20c |
alpha | 透明度,解决重叠问题 | 0.5-0.8 |
edgecolors | 边缘线颜色,增强气泡辨识度 | 常用white/black |
五、图表优化技巧
5.1 添加标题与标签
plt.title('产品分类气泡图(销售额 vs 利润)\n气泡大小代表市场规模',
fontsize=14, # 标题字体大小
pad=20) # 标题与图表的间距
plt.xlabel('销售额(万元)',
fontsize=12, # 标签字体大小
labelpad=10) # 标签与坐标轴的间距
plt.ylabel('利润(万元)',
fontsize=12,
labelpad=10)
5.2 坐标轴范围控制
plt.xlim(df['销售额(万)'].min()-5, df['销售额(万)'].max()+5) # X轴留5单位边距
plt.ylim(df['利润(万)'].min()-10, df['利润(万)'].max()+10) # Y轴留10单位边距
-
作用:避免气泡紧贴图表边缘
-
技巧:使用
min()/max()
自动计算边界
5.3 高级图例定制
# 创建自定义图例句柄
legend_labels = [
plt.Line2D([0], [0],
marker='o', # 圆形标记
color='w', # 标记填充色(白色)
markerfacecolor=plt.cm.tab20c(color_mapping[cat]/3), # 取对应颜色
markersize=8, # 标记大小
label=cat) # 显示文本
for cat in color_mapping.keys()
]
# 添加图例
plt.legend(handles=legend_labels,
title='产品类别', # 图例标题
bbox_to_anchor=(1.25, 1), # 图例位置(右侧外部)
borderaxespad=0.) # 图例与轴的距离
定位参数说明
参数 | 作用说明 | 常用值 |
---|---|---|
bbox_to_anchor | 图例框定位坐标 | (横坐标, 纵坐标) |
borderaxespad | 图例与轴区域的空白间距 | 0-1之间的浮点数 |
六、输出与保存设置
6.1 自动布局调整
plt.tight_layout() # 自动调整子图参数,避免元素重叠
6.2 高清图片保存
plt.savefig('bubble_chart.png', # 文件名
dpi=300, # 打印级分辨率(300dpi适合印刷)
bbox_inches='tight',# 自动裁剪多余白边
transparent=False # 背景是否透明
)
保存格式对比表
格式 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
PNG | 无损压缩/支持透明 | 文件较大 | 网络发布/演示文档 |
SVG | 矢量图/无限缩放 | 不适合复杂图表 | 印刷出版 |
跨平台兼容性好 | 编辑困难 | 学术论文 |
七、完整代码执行流程
graph TD
A[导入库] --> B[生成模拟数据]
B --> C[创建DataFrame]
C --> D[颜色编码映射]
D --> E[创建画布]
E --> F[绘制气泡图]
F --> G[添加标题标签]
G --> H[设置坐标范围]
H --> I[添加网格线]
I --> J[配置颜色条]
J --> K[定制图例]
K --> L[保存图片]
L --> M[显示图表]
八、常见问题解决方案
8.1 中文显示异常
# 在代码开头添加字体配置(Windows系统)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置黑体
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
8.2 气泡尺寸失控
问题现象:气泡过大或过小
解决方法:调整缩放系数
# 原始代码中的尺寸设置
s=df['市场规模']*5 # 将5改为适合的系数
# 推荐公式:标准化缩放
s = (df['市场规模'] / df['市场规模'].max()) * 1000 # 将最大值设为1000像素
通过以上逐行解析,您不仅能够直接使用现成代码生成专业气泡图,更能深度理解每个参数的作用,从而根据实际需求进行灵活调整。建议将代码复制到Jupyter Notebook中边运行边观察效果,实践是掌握可视化的最佳途径!
看到这给作者点个赞吧,码字不易