基于python条件的绘图颜色填充

基于python条件的绘图颜色填充,python,pandas,matplotlib,plotly,Python,Pandas,Matplotlib,Plotly,我用数据集df绘制了一个图,其中时间戳是索引: df: 和代码 df.plot( y='Temperature', figsize=(16, 10),) plt.axhline(y=40, color='r', linestyle='-') plt.axhline(y=25, color='b', linestyle='-') plt.show() 图表如下所示: 我想为温度在25°C和40°C之间的三角形区域填充颜色。我可以通过调整代码来做到这一点吗?如果不是,那么什么是好的方法?谢谢 注

我用数据集df绘制了一个图,其中时间戳是索引:

df:

和代码

df.plot( y='Temperature', figsize=(16, 10),) 
plt.axhline(y=40, color='r', linestyle='-')
plt.axhline(y=25, color='b', linestyle='-')
plt.show()
图表如下所示:

我想为温度在25°C和40°C之间的三角形区域填充颜色。我可以通过调整代码来做到这一点吗?如果不是,那么什么是好的方法?谢谢


注:数据不是连续的,但已向前填充,具有1秒的恒定间隔。此外,峰值温度高于40°C,时间戳中相应的垂直部分不应着色

我可以建议在使用where参数之间使用fill_:

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()

我可以建议在使用where参数之间使用fill_:

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()

如果你可以发布你的整个数据集,这将帮助人们提供一个完整的例子:Hi@CDJB谢谢你的评论,但我担心整个数据集太大,无法在这里发布..这与plotly有什么关系?如果你可以发布你的整个数据集,这将帮助人们提供一个完整的例子:Hi@CDJB谢谢你的评论,但我很抱歉恐怕完整的数据集太大,无法在此发布..这与plotly有什么关系?嗨,Andrea,谢谢你的解决方案。是否可以排除曲线超过40的部分?因为我想计算温度在25到40之间的累积时间,我不确定我是否得到了你的要求。编辑回答了你的问题吗?是的,这正是我想要的!只有一个问题,有没有办法取代.diff?由于列时间戳是索引格式,因此它返回AttributeError:“DatetimeIndex”对象没有属性“diff”。答案:嗨,Andrea,谢谢您的解决方案。是否可以排除曲线超过40的部分?因为我想计算温度在25到40之间的累积时间,我不确定我是否得到了你的要求。编辑回答了你的问题吗?是的,这正是我想要的!只有一个问题,有没有办法取代.diff?由于列时间戳是索引格式,它返回AttributeError:“DatetimeIndex”对象没有属性“diff”。答案是: