2017-02-26 3 views
2

私は以下のような散布図を持っています。この散布図の上に同じ座標を持つ同じ散布図を作成する必要はなく、私のプロットには2重の端があります。二重線を縁として持つ方法を見つけることができませんでした。scatterplot python double edge line

import numpy as np 
import matplotlib.pyplot as plt 


N = 50 
x = np.random.rand(N) 
y = np.random.rand(N) 
colors = np.random.rand(N) 


plt.scatter(x, y, s=400, c=colors,marker='h' alpha=0.5,edgecolors='black',linewidth=1) 
plt.show() 

この質問の主な理由は、私が持っているバグから来ている:私は同じ座標との散布図を重ね合わせたときに、私が作成しています新しいプロットは、わずかにその位置を変更する傾向があり、完全にそれぞれの上で1つにフィットしません。 bad fit

このバグは、背景マーカーがfacecolors=''の場合は表示されませんが、問題があるのはfacecolors='w'の場合のみです。

+0

あなたは問題を与える正確なコードを示すことができましたか? matplotlib 2.0にアップデートしましたか? – f5r5e5d

+0

@ f5r5edうん、更新しました。私がN = 50を削除して次のコードを実行すると、バグが戻ってくる: 'cmap = plt.get_cmap( 'jet_r') colors = cmap(np.linspace(0.1、0.9、cmap.N// 2)) whites = [[1,1,1]] ' – MattnDo

答えて

1

これは本当にバグのようです。

可能な解決策は、白色散乱点をプロットするために引数colorsを使用することです。

import numpy as np 
import matplotlib.pyplot as plt 

N = 50 
x = np.random.rand(N) 
y = np.random.rand(N) 
colors = np.random.rand(N) 
whites = [[1,1,1]]*N 

plt.scatter(x, y, s=400, c=whites, marker='h', alpha=0.5,edgecolors='black',linewidth=1) 
plt.scatter(x, y, s=260, c=colors, marker='h', alpha=0.5,edgecolors='black',linewidth=1) 

plt.show() 

enter image description here


マーカーとして特殊記号を使用して、アプリケーションに応じても選択肢かもしれません。 this questionまたは complete listを参照してください。

import matplotlib.pyplot as plt 

N = 4 
x = [1,1,2,2] 
y = [1,2,1,2] 
symbols = [ur"$\u27C1$", ur"$\u25C8$", ur"$\u229A$", ur"$\u29C8$"] 

for i in range(N): 
    plt.scatter(x[i], y[i], s=400, c=(i/float(N), 0, 1-i/float(N)), marker=symbols[i], alpha=0.5,linewidth=1) 
plt.show() 

enter image description here

+0

なぜか分かりませんが、これはうまくいくようです!どうもありがとう。ちょうど最後のものですが、間違った重複を避けるために新しく作成したマーカーを「グループ化」する方法はありますか? – MattnDo

+0

いいえ、matplotlibはマーカーをグループ化できません。どのマーカが重なっているのかを自分で計算する必要があります。これは、データユニットとポイントの単位でマーカをミックスするためです。 (たとえば、ズームインするとポイントは重なってしまいますか?)もちろんこれは自動化できますが、いくつかのコード行が必要です。そのためにヒストグラムを使うこと( 'np.histogram2d')が役に立ちます。あるいは、matplotlib( 'plt.hist2d'または' plt.hexbin')に直接ヒストグラムをプロットすることもできますが、それはある種のプロットを与えるでしょう。 – ImportanceOfBeingErnest

+0

データフレームに日付と時刻があるので、これを 'zorder'と組み合わせて動作させることができます。素敵な時間を!! – MattnDo