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
相关产品推荐
相关产品推荐

