用Python绘制专业气泡图:逐行代码详解(学画图第一天)

本文将通过 完整代码分解说明 的方式,手把手教你用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矢量图/无限缩放不适合复杂图表印刷出版
PDF跨平台兼容性好编辑困难学术论文

七、完整代码执行流程

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中边运行边观察效果,实践是掌握可视化的最佳途径!

看到这给作者点个赞吧,码字不易

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值