我是Python和MatPlotlib的新手。这是我第一次在Stackoverflow上发帖——我在其他地方找不到答案,非常感谢你的帮助。
我使用的是Windows XP,Enthought Canopy v1.1.1(32位)。
我想通过数据的散点图绘制一条点状线性回归线,其中x和y数组都包含随机浮点数据。
结果虚线中的点没有沿着回归线均匀分布,而是在红线中间"涂抹在一起",使其看起来很混乱(请参见所附的最小示例代码的上图)。
如果x值数组中的项目均匀分布(下图),则似乎不会发生这种情况。
因此,我猜测这是MatplotLib如何渲染虚线的问题,或者Canopy如何将Python与MatplotLib接口的问题。
请告诉我一个变通方法,使虚线类型上的点看起来均匀分布;即使x和y数据都是非均匀分布的;同时仍然使用Canopy和Matplotlib?
(总的来说,我一直热衷于提高我的编码技能——如果我的示例中的任何代码都能写得更整洁或简洁,我将感谢您的专业知识)。
非常感谢
Dave(英国)
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()
欢迎使用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...