2012-07-04 18 views
0

我想要做的是以下幾點: 我有很多屬於一個x值的值。像這樣:加入相鄰的X-抽搐與numpy的

A 12 
A 13 
A 15 
A 29 
B 23 
B 23 
B 23 
C 90 
C 83 

所以每個x值的y值的數目不同。我基本上想要的是一個陰謀,看起來像這樣:

plot i want

我怎樣才能做到這一點使用numpy的和matplotlib?我怎能matplotlib從重複的x值,即大致相同反正?需要注意的是,我想3 y值作圖,相對於在x軸上示出只有一個值?

編輯: 我目前做的,現在僅僅是繪製所有pairvalues。看起來像這樣: enter image description here

我需要的是用值和空白本質上取代x軸重複的值。

+0

你能發佈一些代碼嗎?使它更容易找到錯誤。 – Mizipzor

+0

我不明白你的問題。你顯示一個示例圖,但是表明你想要繪製多個y值。你的意思是多條線路,其中A的第一個值被連接到B的第一個值,等等?或者你的意思是你想要在同一個x上繪製所有三個y值的點?或者你的情節應該是一個平均的或某種東西? – catchmeifyoutry

回答

2

我想你想要的東西更像是

x y label 
1 12 A 
2 13 A 
3 15 A 
4 29 A 
5 23 B 
6 23 B 
7 23 B 
8 90 C 
9 83 C 

和而不是重複標籤,您希望每個組都有一箇中心標籤?

from itertools import groupby 
import matplotlib.pyplot as plt 

data = [ 
    ('A', 12), 
    ('A', 13), 
    ('A', 15), 
    ('A', 29), 
    ('B', 23), 
    ('B', 23), 
    ('B', 23), 
    ('C', 90), 
    ('C', 83) 
] 

labels,ys = zip(*data) 
xs = range(len(ys)) 

def centered(val, ln, empty=''): 
    half = (ln - 1) // 2 
    return (val if i==half else empty for i in xrange(ln)) 

def centered_labels(labels): 
    return [v for val,grp in groupby(labels) for v in centered(val, len(list(grp)))] 

fig = plt.figure() 
ax = fig.add_subplot(111) 
ax.set_xticklabels(centered_labels(labels)) 
ax.plot(xs, ys, 'b-', linewidth=3) 

結果

enter image description here

1

通常在這種情況下,你可以繪製各組的平均作爲一個單一的點。

也就是說,首先使用numpy來計算每個組的平均值(通過組I的平均值A,B等),然後在matplotlib中繪製所有這些平均值,每個組對應一個點(平均值) 。除此之外,人們還可以繪製誤差棒,或箱形圖,等等,給每組中的分佈感等