繁体   English   中英

如何在 Python 中使用 SCATTER fill_between plot 散点图?

[英]How to plot scatter graph with SCATTER fill_between in Python?

我是一名制造工程师,对 Python 和 Matplotlib 非常陌生。 目前,我正在尝试 plot 散点时间图,其中对于每条记录,我都有数据(从传感器读取)以及该数据的上限和下限,如果数据不在它们之间,则该数据将停止工具。

所以对于这样一组简单的数据:

   time = [1, 2, 3, 7, 8, 9, 10]*
   data = [5, 6, 5, 5, 6, 7, 8]
   lower_limit = [4, 4, 5, 5, 5, 5, 5]
   upper_limit = [6, 6, 6, 7, 7, 7, 7]
  • 当该工具不工作时,将不会记录任何内容,因此时间记录中有 b/w 3 和 7 的间隙。

所需的图表如下所示:

在此处输入图像描述

我试图坚持的一些规则:

  1. 所有三个图(数据、上限和下限)都需要是散点而不是线,它们之间共享 x 轴(时间)。 - 必需的。
  2. 在上限和下限之间填充的绿色高光,仅考虑每个高光具有相同时间的两个点。 - 强烈推荐。 (我尝试了 matplotlib.fill_between,但它在趋势线之间创建了一个多边形,而不是在匹配的 LL 和 UL 点对之间创建垂直线。因此,它不准确,它会填补空白 b/w 次3s 和 7s,这是不希望的。此外,我尝试使用 matplot.bar 沿散布 plot 的“数据”进行限制,但我无法为条形设置最小值 = lower_limit。)
  3. 当数据的值不等于或介于限制之间时,表示点应显示为红色,而不是原来的颜色。 -强烈推荐。

因此,考虑到所有这些,并且每天有数千条记录,一个 24 小时时间跨度的常规图表应该如下所示:(请注意由于时间跨度内可能缺少记录,以及垂直的绿线,用于限制。)

在此处输入图像描述

感谢您的时间和帮助!

像这样的东西应该可以工作,分别绘制每个组件:

time = [1, 2, 3, 7, 8, 9, 10]
data = [5, 6, 5, 5, 6, 7, 8]
lower_limit = [4, 4, 5, 5, 5, 5, 5]
upper_limit = [6, 6, 6, 7, 7, 7, 7]

# put data into dataframe and identify which points are out of range (not between the lower and upper limit)
df = pd.DataFrame({'time': time, 'data': data, 'll': lower_limit, 'ul': upper_limit})
df.loc[:, 'in_range'] = 0
df.loc[((df['data'] >= df['ll']) & (df['data'] <= df['ul'])), 'in_range'] = 1

# make the plot
fig, ax = plt.subplots()

# plot lower-limit and upper-limit points
plt.scatter(df['time'], df['ll'], c='green')
plt.scatter(df['time'], df['ul'], c='green')

# plot data points in range
plt.scatter(df.loc[df['in_range']==1, :]['time'], df.loc[df['in_range']==1, :]['data'], c='black')

# plot data points out of range (in red)
plt.scatter(df.loc[df['in_range']==0, :]['time'], df.loc[df['in_range']==0, :]['data'], c='red')

# plot lines between lower limit and upper limit
plt.plot((df['time'],df['time']),([i for i in df['ll']], [j for j in df['ul']]), c='lightgreen')

这是使用numpy的掩码和matplotliberrorbar栏的版本

import matplotlib.pyplot as plt
import numpy as np

time = np.array( [0, 1, 2, 3, 7, 8, 9, 10] )
data = np.array([2, 5, 6, 5, 5, 6, 7, 8] )
lower = np.array([4, 4, 4, 5, 5, 5, 5, 5] )
upper = np.array([6, 6, 6, 6, 7, 7, 7, 7] )

nn = len( lower )
delta = upper - lower

### creating masks
inside = ( ( upper - data ) >= 0 ) & ( ( data - lower ) >= 0 )
outside = np.logical_not( inside )


fig = plt.figure()
ax = fig.add_subplot( 1, 1, 1 )

ax.errorbar(  time, lower, yerr=( nn*[0], delta), ls='', ecolor="#00C023"  )
ax.scatter( time[ inside ], data[ inside ], c='k' )
ax.scatter( time[ outside ], data[ outside ], c='r' )
plt.show()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM