2015-03-02 4 views
0

Я пытаюсь сделать простой разброс, а также наложить простой регресс. Все x, y указывают на график в форме рассеяния, как и ожидалось, независимо от того, что. Отлично. Моя проблема в том, что если N> 127, то все точки (x, y) построены, но линия регрессии не простирается от min (x) до max (x). Линия регрессии должна полностью простираться от левой стороны (до min (x)) вплоть до max (x). Что здесь происходит и как я могу это исправить?python Как построить линию разброса и регрессии с более чем 127 или 128?

fig1, ax1 = plt.subplots(1,1) 
N=128 
x=np.random.rand(N) 
y=np.random.rand(N) 
fit = np.polyfit(x,y,1) 
fit_fn = np.poly1d(fit) 
ya=fit_fn(x) 
ax1.plot(x,y, 'bo',x, ya,'-k') 

Я заметил, что если я изменю последнюю строку на

ax1.plot(x,y, 'bo',x, ya,'-ko') 

тогда все сюжетные, но это не то, что я хочу, так как это дает мне график рассеяния для х, я вместо того, чтобы линии.

enter image description here

+0

Я не кажется, чтобы получить то, что вопрос здесь, линия по-прежнему существует (из-за '-', но и все точки накладываются друг на друга по линии (из-за 'ko') .Если вам нужен правильный график рассеяния, попробуйте' plt.scatter', хотя это, по-моему, 'plt.plot' по умолчанию, когда вы не указываете обозначение строки. – ljetibo

+0

добавил (а) фотографию. – user2015487

ответ

1

я получаю сейчас. Я не совсем уверен, почему так происходит, но вокруг есть способ. Получает ли это тот же результат? (См шахта ржали)

import matplotlib.pyplot as plt 
import numpy as np 
fig1, ax1 = plt.subplots(1,1) 

#distribute N random points in interval [0,1> 
N=300 
x=np.random.rand(N) 
y=np.random.rand(N) 

#get fit information 
fit = np.polyfit(x,y,1) 
fit_fn = np.poly1d(fit) 

#extend fitted line interval to make sure you 
#get min and max on x axis 
current = np.arange(min(x), max(x), 0.01) 
current_fit = np.polyval(fit_fn, current) 

#you can extend it even, default is color blue 
future = np.arange(min(x)-0.5, max(x)+0.5, 0.01) 
future_fit = np.polyval(fit_fn, future) 

#plot 
ax1.plot(x,y, 'bo') 
ax1.plot(current, current_fit, "-ko") 
ax1.plot(future, future_fit) 

plt.show() 

enter image description here

+0

Да, это действительно сработало. Спасибо. Было бы неплохо узнать, как это сделать. – user2015487

+0

@ user2015487 Возможно, вы путаете, как работает «случайный». «Случайный» просто извергает числа между 0 и 1, и возможно, что вы иногда не получаете n более высокие, чем некоторые ограничения (потому что они случайные это случается). Но на вашем графике я четко вижу числа, проходящие за конец вашей линии, но даже линия выглядит странно. В моем примере. Я не знаю. Я использовал 'np.arange (bot, top, step)', который не выводит случайные числа. Он берет 'bot', а затем добавляет' step' и повторяет, пока не достигнет 'top'. Поскольку у вас есть функция, все, что я делаю, вычисляет значения в этих точках и замышляет их. – ljetibo