LINUX.ORG.RU

Matplotlib раскрасить область под кривой в зависимости от параметра

 , ,


0

2

Вопрос тупой, но в pandas и matplotlib нуб, а гугл пока нормально спросить не получается (подсовывает как раскрашивать сами кривые).

Есть csv file, в котором timestamp, some_value, boolean_parameter.

Надо нарисовать график some_value от времени, при этом как-то наглядно пометив состояние boolean_parameter. Идеально было бы покрасить область где boolean_parameter=1 в какой-нибудь цвет.

Вопрос как это сделать? Решение с другими инструментами - ок, просто показалось что эти наиболее подходящие.

Без пометки цветом сейчас делаю примерно вот так (примерно, потому что это в jupyter notebook)

import matplotlib.pyplot as plt
import pandas as pd

from pylab import rcParams
rcParams['figure.figsize'] = 15, 15

data = pd.read_csv('input.csv', skipinitialspace=True)
info = p_data.set_index('timestamp').T
info.loc['some_value'].plot()

Ответ на: комментарий от thunar

Получилось даже без гимпа, примерно то что хочу, но к сожалению от желаемого слишком отличается, чтобы счесть это приемлимым решением.

import matplotlib.pyplot as plt
import pandas as pd
from datetime import datetime

from pylab import rcParams
rcParams['figure.figsize'] = 15, 15

data = pd.read_csv('input.csv', skipinitialspace=True)
data['# unix_time'] = data['#unix_time'].apply(datetime.fromtimestamp)

info = p_data.set_index('timestamp').T

plot = info.loc['some_value'].plot()
s1 = info.loc['boolean_parameter']
s2 = info.loc['some_value']
s1.mul(s2).plot.area(ax=plot)

Пример тут https://ibb.co/RB6G3Zb

Это примерно показывает что нужно, но из-за того, что закрашенная область это фактически непрерывный график результат отличается от нужного. Хочется получить оранжевые столбцы, реальная ширина которых как вверху, но соединение точек во втором графике все портит.

chuemir ()
Последнее исправление: chuemir (всего исправлений: 1)
Ответ на: комментарий от chuemir

Хотя если делать как тут https://stackoverflow.com/a/16454196/3086763

Результат по форме другой, но наглядно примерно отражает то, что и хотелось https://ibb.co/wMV2H8Z.

Но если у кого будут предложения как сделать лучше, буду рад выслушать. Цель - увидеть на графике наглядно, что в периоды когда bolean_parameter=1 значение some_value заметно растет (ну или что подобной корреляции не наблюдается)

chuemir ()
Ответ на: комментарий от chuemir

Цель - увидеть на графике наглядно, что в периоды когда bolean_parameter=1 значение some_value заметно растет (ну или что подобной корреляции не наблюдается)

Почему для этого статистикой не воспользоваться? Т.е. тупо посчитать сколько точек boolean_parameter=1 соответствуют росту some_value, а сколько нет?

yvv ★★☆ ()
Ответ на: комментарий от chuemir
%pylab

data = pd.DataFrame(dict(timestamp = np.arange(100, dtype=np.float32)))
data["some_value"] = np.cos(data.timestamp * np.pi / 10)
data["flag"] = ((np.arange(100) // 10) & 1).astype(np.bool)

invisible = np.logical_not(data.flag)
masked_x, masked_y = np.ma.masked_where(invisible, data.timestamp), np.ma.masked_where(invisible, data.some_value)

fig, ax = plt.subplots(3,1)

ax[0].plot(data.timestamp, data.some_value, marker='o')
ax[0].plot(masked_x, masked_y, marker='o', c='orange')

dy = np.diff(data.some_value)
dy2 = np.ma.masked_where(invisible[:-1], dy)
ax[1].plot(data.timestamp[:-1], dy)
ax[1].plot(masked_x[:-1], dy2, c='orange')
ax[1].axhline(0.0,c='black')

pd.Series(dy).plot(kind='density', ax=ax[2])
pd.Series(dy2.compressed()).plot(kind='density', ax=ax[2])
ax[2].axvline(0.0,c='black')

plt.show()

третий график корректен только если на втором стационарный вр.ряд

anonymous ()

Можно так попробовать:

figure()

timestamp = range(-50,50)
some_value = [v*v*v for v in timestamp]
some_value_base = [0 for v in timestamp]
boolean_parameter = [(v < -10 and v > -35) or (v > 10 and v < 35) for v in timestamp]

plot(timestamp, some_value, 'r')
fill_between(x=timestamp, y1=some_value_base, y2=some_value, where=boolean_parameter, color='g',alpha=.5)
    
xlabel('timestamp')
ylabel('some_value')
title('some_value graph')
grid()

show()
alx777 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.