заполнение matplotlib под кривой LOWESS - PullRequest
0 голосов
/ 18 октября 2019

У меня есть график, для которого я хотел бы заполнить область под линией LOWESS, используемой для сглаживания гистограммы. В matplotlib я считаю, что plt.fill_between() должен быть подходящим способом, но по какой-то причине пример кода, который я имею, не делает то, что я ожидал;он заполняет некоторые биты, но они в шахматном порядке и не начинаются с y=0. Любые идеи о том, как сделать эту работу?

import numpy as np
import statsmodels.api as sm
import matplotlib.pyplot as plt

a = np.loadtxt('numbers.tt')
a = a[~np.isnan(a)]
a[:20]
# array([ 0.04184204,  0.07509347, -0.00443857, -0.03590184, -0.0294351 ,
#       -0.02969616, -0.02780433, -0.02362442, -0.04242367, -0.01171937,
#       -0.0208392 , -0.02976209, -0.03771409, -0.0261862 , -0.04404418,
#        0.00259364, -0.01267109, -0.01128568, -0.00380218, -0.03742523])
fig, ax = plt.subplots()
y, bins, _ = ax.hist(a, bins=100, color='w')
x = 0.5 * (bins[1:] + bins[:-1])
lowess = sm.nonparametric.lowess(y, x, frac=0.1)
_ = ax.plot(lowess[:, 0], lowess[:, 1])  # draw line
_ = ax.fill_between(lowess[:, 0], 0, lowess[:, 1])  # draw fill from y=0 to y value in lowess

enter image description here

Ответы [ 2 ]

1 голос
/ 18 октября 2019

Вызов y, bins, _ = ax.hist(a, bins=100, color='w') x на самом деле рисует вашу гистограмму белым цветом на графике. Гистограммы - это гистограммы, которые сделаны из прямоугольных пятен. Эти патчи имеют более высокий приоритет, чем заливка кривой, которая рисуется позади патчей. Обратите внимание, что линейный график самой кривой отрезает столбцы, потому что на самом деле он имеет более высокий приоритет.

Вы можете визуализировать то, что я говорю лучше, изменив цвет гистограммы с 'w' на 'r' или аналогичный. Однако, похоже, что вы вообще не хотите рисовать гистограмму. В этом случае используйте numpy.histogram вместо matplotlib.hist. Функция numpy - это то, что matplotlib использует для генерации данных в любом случае:

y, bins = np.histogram(a, bins=100)
0 голосов
/ 18 октября 2019

Если вам не нужно / не нужно импортировать Numpy и использовать массивы из ax.hist напрямую, тогда установка visible=False в вызове ax.hist() должна решить эту проблему:

y, bins, _ = ax.hist(a, bins=100, color='w', visible=False)
x = 0.5 * (bins[1:] + bins[:-1])
lowess = sm.nonparametric.lowess(y, x, frac=0.1)
_ = ax.plot(lowess[:, 0], lowess[:, 1])  # draw line
p = ax.fill_between(lowess[:, 0], 0, lowess[:, 1])

enter image description here

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