Как не допустить, чтобы на графике matplotlib опустилась линия тренда ниже 0 - PullRequest
0 голосов
/ 22 мая 2019

Я создаю несколько графиков рассеяния в matplotlib. Для этого я хочу построить линии тренда для диаграмм рассеяния. Я использую методы numpy polyfit и poly1d для создания линии тренда.

Моя проблема заключается в следующем: в моем наборе данных есть только положительные значения y (я также удалил все 0 значений), но мои линии тренда опускаются ниже 0. Причина, по которой я думаю, что она опускается ниже 0, заключается в том, что у меня есть некоторые очень большие значения выбросов, которые искажают линию тренда.

Есть ли способ, которым я могу предотвратить, чтобы линии тренда моего графика опустились ниже 0, не удаляя точки данных? Возможно использование метода или параметра для метода в библиотеках numpy или matplotlib?

Удаление выпадающих значений помогает некоторым линиям тренда, но не совсем для нескольких графиков, которые я делаю.

Пример графика с точками рассеяния: https://imgur.com/a/bwIFJw7 Пример графика без точек рассеяния (те же данные, что и на графике выше): https://imgur.com/a/k5TyNjt

Изменение степени линии тренда не решает проблему

код для воспроизведения способности:

import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd
import numpy as np


plt.figure(figsize=(20,150))
loc = mdates.AutoDateLocator()
dataset = {'time':['4/5/2014','4/10/2014','4/21/2014','5/3/2014','5/8/2014','5/19/2014','6/7/2014','6/12/2014','6/16/2014','12/6/2014','12/11/2014','12/15/2014','2/7/2015','2/12/2015','2/16/2015','7/20/2015','8/1/2015','8/13/2015','8/17/2015,'9/5/2015','9/10/2015','9/21/2015','10/3/2015','12/10/2015','1/18/2016','8/6/2016','8/11/2016','8/15/2016','9/3/2016','9/8/2016','9/19/2016','10/1/2016','10/13/2016','10/17/2016','11/10/2016','11/5/2016','8/10/2017','9/14/2017','9/18/2017','10/7/2017','2/8/2018','2/19/2018','3/3/2018','3/8/2018','3/19/2018','4/12/2018','4/7/2018','4/16/2018','5/5/2018','5/10/2018','5/21/2018','11/3/2018','11/8/2018','11/19/2018','12/1/2018','12/13/2018','12/17/2018','1/5/2019','1/10/2019','1/21/2019','2/2/2019','2/14/2019','2/18/2019','3/2/2019','3/14/2019','3/18/2019','4/6/2019','4/11/2019','4/15/2019'],'yval':[1714.6,996.32,1638.4,1293.47,744.73,1843.2,1009.97,2168.47,819.2,2949.12,2730.67,2106.51,14745.6,3880.42,73728,792.77,538.16,585.14,571.53,580.54,933.27,460.8,646.74,4336.94,36864,190.51,206.89,199.02,197.54,219.84,210.27,223.75,201.96,212.23,223.6,211.48,1568.68,418.91,837.82,5671.38,217.18,189.74,192.59,192.04,196.74,197.8,196.47,200.69,193.69,210.79,349.42,222.5,209.17,191.37,192.91,197.57,207.23,192.48,189.7,199.44,187.57,186.85,187.99,189.19,196.34,196.11,192.61,196.39,190.05,]}

dataset['time'] = pd.to_datetime(dataset['time'])
dataset['yval'] = pd.to_numeric(dataset['yval'])


x = mdates.date2num(dataset['time'])
y = dataset['yval']

z = np.polyfit(x,y,3)

p = np.poly1d(z)
plt.plot(x,p(x),'#00FFFF', label = type)
plt.title(type)
plt.xlabel('Time')
plt.ylabel('Weight')
#comment out the next line to see plot without scatter points
plt.scatter(x,y)
plt.gca().xaxis.set_major_locator(loc)
plt.gca().xaxis.set_major_formatter(mdates.AutoDateFormatter(loc))
plt.grid(which='major',axis='both')
plt.show()

График с линией тренда, не идущей ниже горизонтальной оси 0, является желаемым результатом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...