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

Python实现:获取点图坐标,解决重复数据的散点绘制问题

问题描述

我的数据为 [0.1, 0.2, 0.2, 0.2, 0.4, 0.3],目标是用matplotlib的scatter绘制点图,所需坐标为(0.1,1)、(0.2,1)、(0.2,2)、(0.2,3)、(0.4,1)、(0.3,1)(其中0.2出现3次,对应3个递增的y值)。

我尝试用Counter类,但只能得到各值的出现次数,无法生成完整坐标,请问有没有简洁的实现方法?

我的尝试代码:

import pandas as pd
from collections import Counter
import matplotlib.pyplot as plt

x = pd.DataFrame({"X":[0.1, 0.2, 0.2, 0.2, 0.4, 0.3]}).X

counter=Counter(x)  # 想要得到 {0.1: 1,0.2: 1, 0.2: 2, 0.2: 3, 0.4: 1, 0.3: 1} 而不是 {0.1: 1, 0.2: 3, 0.4: 1, 0.3: 1}

df=pd.DataFrame.from_dict(counter, orient='index').reset_index().rename(columns={'index':'event', 0:'count'})

plt.scatter(x=df['event'], y=df['count'],alpha=0.3)  # 这个点图不完整,缺少(0.2,1)和(0.2,2)这两个点
解决方案

方法一:使用Pandas的groupby+cumcount

这是最简洁的实现方式,直接对原数据分组后生成每组内的递增序号(从1开始):

import pandas as pd
import matplotlib.pyplot as plt

# 原始数据
x = pd.DataFrame({"X":[0.1, 0.2, 0.2, 0.2, 0.4, 0.3]}).X

# 生成每组内的递增y值(从1开始计数)
df = x.to_frame().assign(y=lambda d: d.groupby('X').cumcount() + 1)

# 绘制散点图
plt.scatter(x=df['X'], y=df['y'], alpha=0.3)
plt.show()

cumcount()会对每个分组内的元素从0开始计数,加1后正好得到你需要的1、2、3这样的递增y值。

方法二:纯Python实现(不依赖Pandas)

如果不想用Pandas,可以用字典记录每个x值当前的计数,遍历原始数据生成坐标对:

from collections import defaultdict
import matplotlib.pyplot as plt

data = [0.1, 0.2, 0.2, 0.2, 0.4, 0.3]
counts = defaultdict(int)
coords = []

for num in data:
    counts[num] += 1
    coords.append((num, counts[num]))

# 拆分x和y坐标
x_coords, y_coords = zip(*coords)

plt.scatter(x=x_coords, y=y_coords, alpha=0.3)
plt.show()

这个方法通过defaultdict追踪每个x值的出现次数,每遇到一次就递增计数,直接生成所有需要的坐标对。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 20:50:26