Python 用numpy连接相邻的x-TIC

Python 用numpy连接相邻的x-TIC,python,numpy,matplotlib,Python,Numpy,Matplotlib,我想做的是: 我有很多属于x值的值。像这样: A 12 A 13 A 15 A 29 B 23 B 23 B 23 C 90 C 83 因此,每个x值的y值数量不同。我基本上想要的是这样一个情节: A 12 A 13 A 15 A 29 B 23 B 23 B 23 C 90 C 83 如何使用numpy和matplotlib实现这一点?我如何防止matplotlib重复x值,这基本上是相同的?请注意,我希望绘制3个y值,而不是仅在x轴上显示一个值 编辑: 我现在所做的只是

我想做的是: 我有很多属于x值的值。像这样:

A 12
A 13 
A 15 
A 29
B 23 
B 23
B 23
C 90 
C 83
因此,每个x值的y值数量不同。我基本上想要的是这样一个情节:

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

如何使用numpy和matplotlib实现这一点?我如何防止matplotlib重复x值,这基本上是相同的?请注意,我希望绘制3个y值,而不是仅在x轴上显示一个值

编辑: 我现在所做的只是绘制所有对值。看起来像这样:


我需要的是用值和空白值替换x轴上的重复值。

通常在这种情况下,您可以将每组的平均值绘制为单个点


也就是说,首先使用numpy计算每个组的平均值(我指的是A、B等组),然后在matplotlib中绘制所有这些平均值,每个组有一个点(平均值)。除此之外,还可以绘制误差条或方框图等,以了解各组内的分布情况等。

通常在这种情况下,您可以将各组的平均值绘制为单个点


也就是说,首先使用numpy计算每个组的平均值(我指的是A、B等组),然后在matplotlib中绘制所有这些平均值,每个组有一个点(平均值)。除此之外,还可以绘制误差条或方框图等,以了解各组内的分布情况等。

我认为您想要的更像

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)
导致


我想你想要的更像

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)
导致


您能发布一些代码吗?这样更容易发现错误。我不明白你的问题。您显示了一个示例图,但随后表示希望绘制多个y值。你是指多条线,其中A的第一个值连接到B的第一个值,等等。?或者,您的意思是要在同一个x上绘制所有三个y值的点?或者你的情节应该是平均值还是什么?你能发布一些代码吗?这样更容易发现错误。我不明白你的问题。您显示了一个示例图,但随后表示希望绘制多个y值。你是指多条线,其中A的第一个值连接到B的第一个值,等等。?或者,您的意思是要在同一个x上绘制所有三个y值的点?或者你的情节应该是平均的还是其他的?