2017-07-08 7 views
1

matplotlibに垂直散布をプロットする必要がありますが、matplotlib.org/examplesまたはStackOverflowで何も見つかりませんでした。matplotlibのみを使用して垂直散布をプロットする方法

私は自分で何かしようとしましたが、私はジッタがありません。ジッターは、同じ(または非常に似通った)Y成分を持つ点のX成分をわずかに変化させるので、重なり合わない。私が使用できるものはありますか、または手動でxコンポーネントを変更する必要がありますか?

私は Seaborn上でこれを見つけた

enter image description here

以下くれた

import numpy as np 
from matplotlib import pyplot as plt 

x = np.array([1,2,3]) 
l = ['A','B','C'] 
a = np.array([2,2,3]) 
b = np.array([3,3,4]) 
c = np.array([7,7,5]) 
d = (np.array(a) + np.array(b) + np.array(c))/3 

plt.subplot(111) 
plt.margins(0.2) 
plt.xticks(x,l) 
plt.plot(x, a, 'ro', label='a') 
plt.plot(x, b, 'ro', label='b') 
plt.plot(x, c, 'ro', label='c') 
plt.plot(x, d, 'k_', markersize=15, label='avg') 
plt.tight_layout() 
plt.savefig('vertical_scatter') 
plt.close() 

。私が欲しいものですが、唯一のmatplotlibのを使用して

enter image description here

+0

私はあなたがあなたの質問に「唯一のmatplotlibのためにそれを維持」したい言及を提案したいと思います。 –

+0

あなたのMatplotlibの例は意図したプロットと同じことをしていませんか? –

+0

人々はしばしば海兵隊員を必要としない場合に使用しますが、この場合は絶対的に適切であると思われます。@ YLuoの削除された答えは実際にうまくいきます。それが立てば、これは質問に答えて、私は実際にその答えを取り消すように誘惑されるでしょう。シーボーンを使用したくない場合は、使用する内容とその理由について、具体的に質問してください。 「ジッタ」が意味することを明確に述べてください。 – ImportanceOfBeingErnest

答えて

3

matplotlibのみを使用したジッタの例は、次のようになります。基本的な考え方は、x値にランダムノイズを追加することです。

import numpy as np 
import matplotlib.pyplot as plt 

data = np.random.rayleigh(scale=1, size=(30,4)) 
labels = list("ABCD") 
colors = ["crimson", "purple", "limegreen", "gold"] 

width=0.4 
fig, ax = plt.subplots() 
for i, l in enumerate(labels): 
    x = np.ones(data.shape[0])*i + (np.random.rand(data.shape[0])*width-width/2.) 
    ax.scatter(x, data[:,i], color=colors[i], s=25) 
    mean = data[:,i].mean() 
    ax.plot([i-width/2., i+width/2.],[mean,mean], color="k") 

ax.set_xticks(range(len(labels))) 
ax.set_xticklabels(labels) 

plt.show() 

enter image description here

1

私は私のコメントで述べたように、あなたは、隣接のyの点の距離に応じてx値をシフトすることができます。より小さい距離は、より大きなxシフトにマッピングされるべきである。これは対数やそれを行う別の関数で行うことができます。

import numpy as np 
import matplotlib.pyplot as plt 

n = 100 
y = np.random.random(n) 
x = np.ones(n) 
x0 = x[0] 

y = np.sort(y) 
dist = np.diff(y) # has one entry less than y 
dist = np.hstack([dist, np.median(dist)]) # add random value to match shapes 
x = np.log(dist) 
x = (x - np.min(x))/(np.max(x) - np.min(x)) # mapped to range from 0 to 1 
x = x0 + 0.5*(x - 0.5) # mapped to range from x0-1/4 to x0+1/4 

plt.scatter(x,y) 
plt.scatter(x+1,y) 
plt.scatter(x+2,y) 

plt.show() 

enter image description here

関連する問題