如何基于Pandas DataFrame绘制指定规则的散点图?
问题
我有一个包含多列的Pandas DataFrame,希望绘制一张散点图:X轴为所有列名,Y轴为DataFrame的索引,散点的大小对应每个单元格的值。实现时遇到了困难,我的DataFrame结构如下:
| Column A | Column B | Column C | ColumnD |
|---|---|---|---|
| 1 | Cell 2 | Cell 1 | Cell 2 |
| 2 | Cell 4 | Cell 1 | Cell 2 |
我尝试了以下代码:
df.plot.scatter(x=df.columns, y=df.index, s=lambda x,y)
但没有成功。请问有什么解决思路?
我期望得到的图表是:列名作为X值,索引作为Y值,散点大小为对应单元格的值。
解决思路
你用的df.plot.scatter方法不适合这种场景——它要求x和y是DataFrame中的单列,没法直接把所有列名作为X轴、索引作为Y轴来映射多单元格的值。正确的做法是先把DataFrame转换成长格式(long format),再用绘图库实现:
转换数据格式
先把索引转为列,再用pd.melt将宽表转成包含三列的长表:索引(Y轴)、列名(X轴)、单元格值(散点大小):# 将索引转为列,命名为'y' df_reset = df.reset_index().rename(columns={'index': 'y'}) # 转换为长格式 df_long = pd.melt(df_reset, id_vars='y', var_name='x', value_name='size')转换后的数据结构示例:
y x size 0 Column A 1 1 Column A 2 0 Column B Cell 2 ... ... ... 提取数值用于散点大小
你的单元格值包含Cell 2这类字符串,需要先提取其中的数字作为散点大小的依据:# 提取字符串中的数字并转为整数 df_long['size_num'] = df_long['size'].str.extract('(\d+)').astype(int)绘制散点图
可以用Matplotlib或Seaborn实现,两种方式示例如下:- Matplotlib实现:
import matplotlib.pyplot as plt plt.figure(figsize=(10,6)) # 遍历每个数据点绘制散点 for idx, row in df_long.iterrows(): plt.scatter(row['x'], row['y'], s=row['size_num']*50) # 乘以50放大散点,方便观察 plt.xlabel('列名') plt.ylabel('索引') plt.title('列名-索引散点图(大小对应单元格值)') plt.show() - Seaborn实现:
import seaborn as sns plt.figure(figsize=(10,6)) sns.scatterplot(data=df_long, x='x', y='y', size='size_num', sizes=(50, 300)) plt.xlabel('列名') plt.ylabel('索引') plt.title('列名-索引散点图(大小对应单元格值)') plt.show()
- Matplotlib实现:
核心原因是:Pandas原生的plot.scatter仅支持单列x与单列y的散点映射,而你的需求是把每一列作为x的类别、每一行作为y的类别,本质是展示二维数值矩阵,必须先转成长表才能让绘图库正确识别每个点的x、y和大小映射关系。
内容的提问来源于stack exchange,提问作者Jeesh Daram
相关产品推荐
相关产品推荐

