如何用Python为12×17 DataFrame绘制指定样式的分类气泡图?
解决分类气泡图绘制问题
我来帮你搞定这个分类气泡图的需求!你遇到的问题其实很常见,咱们可以用两种简单的方法实现,完全不需要复杂的虚拟值操作。先从最简洁的Seaborn方法开始:
方法一:使用Seaborn Scatterplot(推荐)
Seaborn的scatterplot原生支持分类变量作为坐标轴,而且可以直接用数值控制气泡大小,非常适合你的场景。步骤如下:
1. 构造并转换数据
首先把你的宽格式DataFrame转换成长格式(Seaborn更偏好这种结构):
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 构造你提供的DataFrame df = pd.DataFrame({ 'A': [0.3, 0.1], 'B': [0.2, 0.4], 'C': [0.4, 0.1] }, index=['X', 'Y']) # 转换为长格式,方便Seaborn处理 df_long = df.reset_index().melt(id_vars='index', var_name='Column', value_name='Value') df_long.rename(columns={'index': 'Row'}, inplace=True)
2. 绘制气泡图
直接用scatterplot指定分类轴和大小参数:
# 设置绘图风格 sns.set_style("whitegrid") plt.figure(figsize=(8, 5)) # 核心绘图代码 sns.scatterplot( data=df_long, x='Column', # x轴为列分类(A/B/C) y='Row', # y轴为行分类(X/Y) size='Value', # 用Value控制气泡大小 sizes=(100, 1000),# 气泡大小的范围,可根据你的数据调整 alpha=0.7, # 气泡透明度,避免重叠遮挡 edgecolor='black',# 气泡边框,提升辨识度 palette='viridis' # 颜色调色板,可选 ) # 添加标题和标签 plt.title('Categorical Bubble Plot') plt.xlabel('Columns') plt.ylabel('Rows') # 调整图例位置,避免遮挡图表 plt.legend(title='Value', bbox_to_anchor=(1.05, 1), loc='upper left') plt.tight_layout() plt.show()
这个方法的优势是代码简洁,自动处理分类轴的刻度和标签,还能轻松调整样式。
方法二:使用Matplotlib手动绘制(更灵活)
如果你需要更精细的控制,可以用Matplotlib手动绘制,核心思路是把分类转换成数值位置,然后逐个绘制气泡:
import pandas as pd import matplotlib.pyplot as plt # 还是用之前的DataFrame df = pd.DataFrame({ 'A': [0.3, 0.1], 'B': [0.2, 0.4], 'C': [0.4, 0.1] }, index=['X', 'Y']) # 获取分类对应的数值位置 x_categories = df.columns # ['A', 'B', 'C'] y_categories = df.index # ['X', 'Y'] x_positions = range(len(x_categories)) y_positions = range(len(y_categories)) plt.figure(figsize=(8, 5)) # 循环每个单元格绘制气泡 for y_idx, row in enumerate(y_categories): for x_idx, col in enumerate(x_categories): value = df.loc[row, col] # 注意:scatter的`s`参数是气泡面积,所以要乘以系数调整大小 plt.scatter( x_positions[x_idx], y_positions[y_idx], s=value * 2000, # 系数可根据需求调整 alpha=0.7, edgecolor='black', color='teal' ) # 设置轴刻度和标签 plt.xticks(x_positions, x_categories) plt.yticks(y_positions, y_categories) plt.xlabel('Columns') plt.ylabel('Rows') plt.title('Categorical Bubble Plot (Matplotlib)') # 手动创建图例(可选) from matplotlib.lines import Line2D legend_elements = [ Line2D([0], [0], marker='o', color='w', markerfacecolor='teal', markersize=10, label='0.1'), Line2D([0], [0], marker='o', color='w', markerfacecolor='teal', markersize=15, label='0.3'), Line2D([0], [0], marker='o', color='w', markerfacecolor='teal', markersize=20, label='0.4') ] plt.legend(handles=legend_elements, title='Value', bbox_to_anchor=(1.05, 1), loc='upper left') plt.tight_layout() plt.show()
这个方法适合需要自定义每个气泡样式的场景,比如不同分类用不同颜色等。
内容的提问来源于stack exchange,提问作者Andreas Kaineder
相关产品推荐
相关产品推荐

