繁体   English   中英

散点图标记尺寸计算

[英]Scatter plot marker size calculation

我有一个非常具体的问题。 我有两个numpy数组,每个数组的相应元素代表一个2d点。

a = [1,2,1,6,1]

b = [5,0,3,1,5]

我想绘制散点图,其中标记的大小基于点出现的次数。

那是 :

1,5 : 2

2,0 : 1

1,3 : 1

6,1 : 1

所以size数组必须是size = [2,1,1,1],其他两个数组都可以

a = [1,2,1,6]b = [5,0,3,1]

所以我必须能够调用plt.scatter ,如下所示:

plt.scatter(a,b,s=size)

由于问题标记为numpy,我们可能会使用numpy。 numpy.unique允许计算数组唯一值的计数。

import numpy as np

a = [1,2,1,6,1]
b = [5,0,3,1,5]

u, c = np.unique(np.c_[a,b], return_counts=True, axis=0)

然后

# u=
[[1 3]
 [1 5]
 [2 0]
 [6 1]]
# c= 
[1 2 1 1]

这可以像这样绘制,其中可以使用附加函数来将计数标准化为用于绘图的某些点大小

import matplotlib.pyplot as plt
s = lambda x : (((x-x.min())/float(x.max()-x.min())+1)*8)**2

plt.scatter(u[:,0],u[:,1],s=s(c))

plt.show()

在此输入图像描述

这将做你想要的:

from collections import Counter

a = [1, 2, 1, 6, 1]
b = [5, 0, 3, 1, 5]

counts = Counter([(x, y) for x, y in zip(a, b)])

size = [counts[(x, y)] for x, y in zip(a, b)]

counter将跟踪每个点在阵列中出现的次数。 然后大小从counter获取该数字。

请注意,您实际上需要size = [2, 1, 1, 1, 2]因为您需要s与输入数组的大小相同。 但这并不重要; 你只需要两次绘制相同的点。

如果你真的想删除重复项,你可以做同样的事情,但添加一个额外的步骤,你创建一set点。

from collections import Counter

a = [1, 2, 1, 6, 1]
b = [5, 0, 3, 1, 5]

counts = Counter([(x, y) for x, y in zip(a, b)])

points = set([(x, y) for x, y in zip(a, b)])
a = list()
b = list()
for x, y in points:
    a.append(x)
    b.append(y)

size = [counts[(x, y)] for x, y in zip(a, b)]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM