<p>使用python,<code>matplotlib</code>(pylab)绘制,使用<code>scipy</code>,<code>numpy</code>来拟合数据。<code>numpy</code>的诀窍是创建一个索引或<em>掩码</em>来过滤出您想要的结果。在</p>
<p><strong>编辑</strong>:要选择性地为顶部和底部的异常值着色?这是我们创建的两个面具的简单组合:</p>
<pre><code>import scipy as sci
import numpy as np
import pylab as plt
# Create some data
N = 1000
X = np.random.normal(5,1,size=N)
Y = X + np.random.normal(0,5.5,size=N)/np.random.normal(5,.1)
NAMES = ["foo"]*1000 # Customize names here
# Fit a polynomial
(a,b)=sci.polyfit(X,Y,1)
# Find all points above the line
idx = (X*a + b) < Y
# Scatter according to that index
plt.scatter(X[idx],Y[idx], color='r')
plt.scatter(X[~idx],Y[~idx], color='g')
# Find top 10 outliers
err = ((X*a+b) - Y) ** 2
idx_L = np.argsort(err)[-10:]
for i in idx_L:
plt.text(X[i], Y[i], NAMES[i])
# Color the outliers purple or black
top = idx_L[idx[idx_L]]
bot = idx_L[~idx[idx_L]]
plt.scatter(X[top],Y[top], color='purple')
plt.scatter(X[bot],Y[bot], color='black')
XF = np.linspace(0,10,1000)
plt.plot(XF, XF*a + b, 'k ')
plt.axis('tight')
plt.show()
</code></pre>
<p><img src="https://i.stack.imgur.com/qlMXr.png" alt="enter image description here"/></p>