Цветная заливка на графике в зависимости от условий python - PullRequest
1 голос
/ 06 февраля 2020

Я построил график с набором данных df, где Timestamp - индекс:

df:

      Timestamp     Temperature     
2020-02-06 08:23:04 18.5    
2020-02-06 08:23:05 18.5    
2020-02-06 08:23:06 18.5    
2020-02-06 08:23:07 18.5    
2020-02-06 08:23:08 18.5    
... ... ...
2020-02-06 20:14:36 21.0    

и код

df.plot( y='Temperature', figsize=(16, 10),) 
plt.axhline(y=40, color='r', linestyle='-')
plt.axhline(y=25, color='b', linestyle='-')
plt.show()

График выглядит следующим образом:

enter image description here

Я хотел бы заполнить цвет для области, где температура составляет между 25 ° C и 40 ° C (внутри треугольника) . Могу ли я сделать это, настроив мой код? Если нет, каков хороший способ сделать это? Спасибо!

Примечание. Данные не являются непрерывными, но были заполнены вперед с постоянным интервалом в 1 секунду. Кроме того, температура на пике выше 40 ° C, и соответствующий вертикальный участок в Timestamp не должен быть окрашен.

1 Ответ

2 голосов
/ 06 февраля 2020

Я могу предложить этот подход, используя fill_between, используя аргумент where:

Timestamp = pd.date_range('2020-02-06 08:23:04', periods=1000, freq='s')
df = pd.DataFrame({'Timestamp': Timestamp,
                   'Temperature': 30+15*np.cos(np.linspace(0,10,Timestamp.size))})

df['top_lim'] = 40.
df['bottom_lim'] = 25.

plt.plot_date(df['Timestamp'], df['Temperature'], '-')
plt.plot_date(df['Timestamp'], df['top_lim'], '-', color='r')
plt.plot_date(df['Timestamp'], df['bottom_lim'], '-', color='blue')

plt.fill_between(df['Timestamp'], df['bottom_lim'], df['Temperature'],
                where=(df['Temperature'] >= df['bottom_lim'])&(df['Temperature'] <= df['top_lim']),
                facecolor='orange', alpha=0.3)

########### EDIT ################

# plt.fill_between(df['Timestamp'], df['bottom_lim'], df['top_lim'],
#                 where=(df['Temperature'] >= df['top_lim']),
#                 facecolor='orange', alpha=0.3)


mask = (df['Temperature'] <= df['top_lim'])&(df['Temperature'] >= df['bottom_lim'])
plt.scatter(df['Timestamp'][mask], df['Temperature'][mask], marker='.', color='black')
cumulated_time = df['Timestamp'][mask].diff().sum()
plt.title(f'Cumulated time in range = {cumulated_time}')
plt.show()

enter image description here

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