0

私がやりたいことは次のとおりです。x値に属する値がいくつかあります。このような:

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

したがって、各x値のy値の数は異なります。私が基本的に欲しいのは、次のようなプロットです。

私が欲しいプロット

numpyとmatplotlibを使用してそれを達成するにはどうすればよいですか?matplotlibがx値を繰り返さないようにするにはどうすればよいですか?それはとにかくほとんど同じです?x軸に1つの値だけが表示されるのではなく、3つのy値がプロットされることに注意してください。

編集:私が現在行っていることは、単にすべてのペア値をプロットすることです。このように見えます: ここに画像の説明を入力してください

必要なのは、x軸の繰り返し値を、基本的に値と空白に置き換えることです。

4

2 に答える 2

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

ラベルを繰り返す代わりに、グループごとに1つの中央に配置されたラベルが必要ですか?

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)

結果は

ここに画像の説明を入力してください

于 2012-07-04T23:33:17.477 に答える
1

通常、この状況では、各グループの平均値を単一のポイントとして プロットできます。

つまり、最初にnumpyを使用して各グループの平均を計算し(グループごとにA、Bなどを意味します)、次にこれらの平均をすべてmatplotlibにプロットし、各グループについて1ポイント(平均)を使用します。これ以外にも、エラーバーや箱ひげ図などをプロットして、各グループ内の分布などを把握することもできます。

于 2012-07-04T22:12:54.667 に答える