散点图标记大小计算
Scatter plot marker size calculation
我有一个非常具体的问题。我有两个 numpy 数组,每个数组的对应元素代表一个二维点。
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)
这会做你想做的事:
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
将跟踪每个点在数组中出现的次数。然后 size 从 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)]
由于问题是用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()
我有一个非常具体的问题。我有两个 numpy 数组,每个数组的对应元素代表一个二维点。
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)
这会做你想做的事:
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
将跟踪每个点在数组中出现的次数。然后 size 从 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)]
由于问题是用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()