2016-12-27 4 views
0

Для меня имеет смысл, что нужно сортировать plt.plot, однако рассеянная диаграмма (plt.scatter), нуждающаяся в сортировке, кажется странной. Я столкнулся с этой проблемой с этим скриптом. Сам сценарий не имеет значения и служит лишь минимальным рабочим примером. Важно то, что поведение scatter, а именно plt.scatter(sorted(l2), Y) даст отличный результат от plt.scatter(l2, Y). Почему это? Не имеет смысла для меня.Сортированный график рассеяния отличается от несортированного

import matplotlib.pyplot as plt 
import numpy as np 
from math import log, exp, isnan 
from sys import argv 
from random import randint 

def generate_linear_regression_line(X, Y): 
    X_ = np.mean(X) 
    XX_ = np.mean(map(lambda x:x*x,X)) 
    Y_ = np.mean(Y) 
    XY_ = map(lambda x,y:x*y,X,Y) 
    m = np.mean((X_ * Y_ - XY_)/(X_**2 - XX_)) 
    b = Y_ - m * X_ 
    print m 
    print b 
    return lambda x : m * x + b 

max = int(argv[1]) 

l1 = [randint(1, max) for i in range(max)] 
# l2 = range(0,max) 
l2 = [] 
maxentry = 0 
while len(l2) != max: 
    n = randint(max, 2*max) 
    if n not in l2: 
     if n > maxentry: 
      maxentry = n 
     l2.append(n) 
assert(maxentry >= len(l1)) 

assert(len(l2) == len(l1)) 


regl = generate_linear_regression_line(l2, l1) 

X = [] 
Y = [] 
for i in range(len(l2)): 
    X.append(i) 
    Y.append(regl(i)) 

print sum(l1) 
print sum(Y) 

assert(len(Y) == len(l1)) 
# assert(sum(Y) > sum(l1)) 

plt.scatter(l2, l1) 
plt.plot(X, Y, c='red') 
plt.scatter(sorted(l2), Y, c='green') 
plt.xlabel('L2') 
plt.ylabel('L1') 
plt.show() 

ответ

1

Порядок значений в Y зависят от порядка значений в L2, например, (L2[0], Y[0]) представляет собой точку. Когда вы сортируете L2, вы переупорядочиваете L2 без переупорядочения Y.

Вы можете заархивировать два массива, отсортировать их и сделать график рассеяния, например:

import itertools 
P = sorted(itertools.izip(L2, Y)) 
L2s, Ys = zip(*P) 
plt.scatter(L2s, Ys, c='green')