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 值,反正基本上是一样的?请注意,我想要绘制 3 个 y 值,而不是 x 轴上仅显示一个值?

编辑:我现在做的只是绘制所有对值。看起来像这样: 在此处输入图像描述

我需要的是用值和空白替换 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

而不是重复标签,您希望每组有一个居中的标签?

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 中绘制所有这些平均值,每个组都有一个点(平均值)。除此之外,还可以绘制误差线或箱线图等,以了解每个组内的分布等。

于 2012-07-04T22:12:54.667 回答