You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于Pandas DataFrame绘制指定规则的散点图?

问题

我有一个包含多列的Pandas DataFrame,希望绘制一张散点图:X轴为所有列名,Y轴为DataFrame的索引,散点的大小对应每个单元格的值。实现时遇到了困难,我的DataFrame结构如下:

Column AColumn BColumn CColumnD
1Cell 2Cell 1Cell 2
2Cell 4Cell 1Cell 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),再用绘图库实现:

  1. 转换数据格式
    先把索引转为列,再用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')
    

    转换后的数据结构示例:

    yxsize
    0Column A1
    1Column A2
    0Column BCell 2
    .........
  2. 提取数值用于散点大小
    你的单元格值包含Cell 2这类字符串,需要先提取其中的数字作为散点大小的依据:

    # 提取字符串中的数字并转为整数
    df_long['size_num'] = df_long['size'].str.extract('(\d+)').astype(int)
    
  3. 绘制散点图
    可以用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()
      

核心原因是:Pandas原生的plot.scatter仅支持单列x与单列y的散点映射,而你的需求是把每一列作为x的类别、每一行作为y的类别,本质是展示二维数值矩阵,必须先转成长表才能让绘图库正确识别每个点的x、y和大小映射关系。

内容的提问来源于stack exchange,提问作者Jeesh Daram

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 03:04:59