Python 如何在MatPlotLib中绘制散点/a图的平均线?

Python 如何在MatPlotLib中绘制散点/a图的平均线?,python,matplotlib,Python,Matplotlib,我的数据如下: x = [3,4,5,6,7,8,9,9] y = [6,5,4,3,2,1,1,2] 我可以得到下面两张图 及 然而,我想要的是(沿途所有点的平均值): 在matplotlib中是否可能?或者我必须手动更改列表并以某种方式创建: x = [3,4,5,6,7,8,9] y = [6,5,4,3,2,1,1.5] 相关代码 ax.plot(x, y, 'o-', label='curPerform') x1,x2,y1,y2 = ax.axis() x1 = min(x

我的数据如下:

x = [3,4,5,6,7,8,9,9]
y = [6,5,4,3,2,1,1,2]
我可以得到下面两张图

然而,我想要的是(沿途所有点的平均值):

在matplotlib中是否可能?或者我必须手动更改列表并以某种方式创建:

x = [3,4,5,6,7,8,9]
y = [6,5,4,3,2,1,1.5]
相关代码

ax.plot(x, y, 'o-', label='curPerform')
x1,x2,y1,y2 = ax.axis()
x1 = min(x) - 1 
x2 = max(x) + 1
ax.axis((x1,x2,(y1-1),(y2+1)))

是的,你必须自己计算<代码>绘图绘制您提供的数据。如果要绘制其他数据,则需要自己计算该数据,然后绘制该数据

编辑:执行计算的快速方法:

>>> x, y = zip(*sorted((xVal, np.mean([yVal for a, yVal in zip(x, y) if xVal==a])) for xVal in set(x)))
>>> x
(3, 4, 5, 6, 7, 8, 9)
>>> y
(6.0, 5.0, 4.0, 3.0, 2.0, 1.0, 1.5)

我认为这可以通过做
y_-mean=[np.mean(y)for I in x]

示例

import matplotlib.pyplot as plt
import random
import numpy as np


# Create some random data
x = np.arange(0,10,1)
y = np.zeros_like(x)    
y = [random.random()*5 for i in x]

# Calculate the simple average of the data
y_mean = [np.mean(y)]*len(x)

fig,ax = plt.subplots()

# Plot the data
data_line = ax.plot(x,y, label='Data', marker='o')

# Plot the average line
mean_line = ax.plot(x,y_mean, label='Mean', linestyle='--')

# Make a legend
legend = ax.legend(loc='upper right')

plt.show()
结果图

我认为您必须手动创建数据。作为一般规则,matplotlib只打印您已有的数据,在打印之前它不会对数据执行任何计算。@heltonbiker是的,我担心这就是答案=/Ugh,我担心这一点。对我该怎么做有什么建议吗?我在想最好的办法是浏览我的x列表,找到所有的重复项(可能很多),得到所有重复项的索引,并对y列表中的索引进行平均。你可以用一个装饰器来做,这样它就“相当”不可见了。@BrenBarn我在打印x或y时遇到语法错误(虽然zip线本身没有给出任何错误)。我假设np是numpy?-对不起,我还是一个初学者=/是的,np是numpy。如果你有其他问题,你需要回溯(可能会问一个单独的问题)。有可能您正在使用Python 3吗?在Python 3中,
print
成为一个函数,因此您将从
print x
中得到一个语法错误;您需要使用
print(x)
。@BrenBarn等等,我找到了。我缺少一个括号:)。非常感谢DMinor thing,但我认为将它表述为
y\u mean=[np.mean(y)for I in y]
(而不是不相关的变量'x')会更清楚。我想
y的一个值(或其平均值)对应于
x
,这就是我为什么这样写的原因。它们都有相同的长度,所以两者都可以很好地工作,就像你提到的。有没有一种方法可以将平均值添加为文本?在图例中?您可以简单地执行
label=str(y_意思是[0])
如果您希望它在某个地方出现,您可以使用。