2017-08-23 13 views
2

私は非常に特有の問題があります。私は2つの配列があり、各配列の対応する要素は2次元の点を表します。散布図のマーカーサイズ計算

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

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

マーカーのサイズがポイントの発生回数に基づいている散布図をプロットする必要があります。

ある:

1,5 : 2 

2,0 : 1 

1,3 : 1 

6,1 : 1 

だからサイズ・アレイのサイズ= [2,1,1,1]と他の二つの配列私は

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

することができなければなりません

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

答えて

2

質問に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() 

enter image description here

+0

をプロットするためのいくつかのポイントサイズにカウントを正規化するために使用することができる場合のようにプロットすることができますそれが私の問題を解決しました。しかし、一つのことは、パラメータ '軸'は私がPython 2.7でそれを試しても動作しません。どうしてこんなことに? –

+0

私は自分でPython 2.7を使用していますので、これはPythonのバージョンとは関係ありませんが、使用しているnumpyのバージョンがあります。 'axis'引数がnumpyバージョン1.13.0で追加されました。 – ImportanceOfBeingErnest

1

Thに電話することができる必要がありますあなたがやりたいだろうです。

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が入力配列と同じサイズである必要があるためです。これは問題ではありません。同じ点を2回プロットするだけです。

重複を実際に削除したい場合は、同じことをすることができますが、追加のステップを追加して、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)]