来自非均匀分布数据的虚线样式

时间:2013-11-22 11:12:48

标签: matplotlib styles line

我是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()

1 个答案:

答案 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...