我是Python和MatPlotlib的新手。 这是我第一次发布Stackoverflow - 我一直无法在其他地方找到答案,感谢您的帮助。
我正在使用Windows XP,使用Enthought Canopy v1.1.1(32位)。
我想通过数据的散点图绘制虚线式线性回归线,其中x和y数组都包含随机浮点数据。
得到的虚线中的点不是沿着回归线均匀分布,并且在红线的中间“涂抹在一起”,使其看起来很脏(参见附加的最小示例代码产生的上图)。 / p>
如果x值数组中的项均匀分布(下图),则似乎不会发生这种情况。
我猜测这是MatplotLib如何渲染虚线,或者Canopy如何使用Matplotlib与Python接口的问题。
请告诉我一个解决方法,它会使虚线上的点看起来均匀分布;即使x和y数据都是非均匀分布的;还在使用Canopy和Matplotlib吗?
(总的来说,我总是热衷于提高我的编码技能 - 如果我的例子中的任何代码都可以更整齐或简洁地写出来,我将非常感谢你的专业知识。)
非常感谢期待
戴夫 (UK)
import matplotlib.pyplot as plt
import numpy as np
from scipy import stats
#generate data
x1=10 * np.random.random_sample((40))
x2=np.linspace(0,10,40)
y=5 * np.random.random_sample((40))
slope, intercept, r_value, p_value, std_err = stats.linregress(x1,y)
line = (slope*x1)+intercept
plt.figure(1)
plt.subplot(211)
plt.scatter(x1,y,color='blue', marker='o')
plt.plot(x1,line,'r:',label="Regression Line")
plt.legend(loc='upper right')
slope, intercept, r_value, p_value, std_err = stats.linregress(x2,y)
line = (slope*x2)+intercept
plt.subplot(212)
plt.scatter(x2,y,color='blue', marker='o')
plt.plot(x2,line,'r:',label="Regression Line")
plt.legend(loc='upper right')
plt.show()
答案 0 :(得分:1)
欢迎来到SO。
你已经自己发现了这个问题,但似乎有点惊讶的是随机x阵列导致该行变得“混乱”。但是你在同一个位置重复绘制一条虚线,所以对我来说似乎是正常的行为,它会被涂抹在彼此顶部有多条虚线的地方。
如果您不想这样,您可以对数组进行排序并使用它来计算回归线并绘制它。由于它是线性回归,只需使用最小值和最大值也可以。
x1_sorted = np.sort(x1)
line = (slope * x1_sorted) + intercept
或
x1_extremes = np.array([x1.min(),x1.max()])
line = (slope * x1_extremes) + intercept
如果x1
变得非常大,那么最后一个应该更快。
关于你的上次评论。在您的示例中,您使用称为“状态机”环境的情节进行绘图。这意味着指定的命令将应用于活动图和活动轴(子图)。
您还可以考虑使用图形和轴对象的OO方法。这意味着您可以随时访问任何图形或轴,而不仅仅是活动图形或轴。例如,将轴传递给函数时非常有用。
在你的例子中,两者都同样有效,而且更多的是品味。
一个小例子:
# create a figure with 2 subplots (2 rows, 1 column)
fig, axs = plt.subplots(2,1)
# plot in the first subplots
axs[0].scatter(x1,y,color='blue', marker='o')
axs[0].plot(x1,line,'r:',label="Regression Line")
# plot in the second
axs[1].plot()
etc...