繁体   English   中英

在一行 plot 中放置一个间隙/中断

[英]Put a gap/break in a line plot

我有一个具有有效“连续”传感器读数的数据集,偶尔会有间隙。

然而,有几个时期没有记录数据。 这些差距明显长于采样周期。

默认情况下,pyplot 将每个数据点连接到下一个数据点(如果我设置了线条样式),但是我觉得当它将两个数据点连接到长间隙的任一侧时,这有点误导。

我宁愿那里没有线; 也就是说,我希望线路停止并在间隙后重新开始。

我尝试使用 y 值None在这些间隙部分中添加一个元素,但似乎将该行发送回 plot 的较早部分(尽管奇怪的是这些行并未出现在所有缩放级别)。

我想到的另一个选择是简单地 plot 每个部分单独调用plot ,但这会有点丑陋和麻烦。

有没有更优雅的方法来实现这一点?

编辑:下面是一个演示行为的最小工作示例。 第一个 plot 是我试图避免的加入线。 第二个 plot 显示添加None值似乎可以工作,但是如果您平移 plot 的视图,您会看到第三个图中显示的内容,一条线跳转到 Z32FA6E1B70A5D4028CZ53E 的早期部分。

import numpy as np
import matplotlib.pyplot as plt

t1 = np.arange(0, 8, 0.05)
t2 = np.arange(10, 14, 0.05)
t = np.concatenate([t1, t2])
c = np.cos(t)

fig = plt.figure()
ax = fig.gca()
ax.plot(t, c)
ax.set_title('Undesirable joining line')


t1 = np.arange(0, 8, 0.05)
t2 = np.arange(10, 14, 0.05)
c1 = np.cos(t1)
c2 = np.cos(t2)
t = np.concatenate([t1, t1[-1:], t2])
c = np.concatenate([c1, [None,], c2])

fig = plt.figure()
ax = fig.gca()
ax.plot(t, c)
ax.set_title('Ok if you don\'t pan the plot')

fig = plt.figure()
ax = fig.gca()
ax.plot(t, c)
ax.axis([-1, 12, -0.5, 1.25])
ax.set_title('Strange jumping line')

plt.show()

情节3,“奇怪的跳线”

蒙面阵列适用于此。 您只需要屏蔽您不想连接的第一个点:

import numpy as np
import numpy.ma as ma
import matplotlib.pyplot as plt

t1 = np.arange(0, 8, 0.05)
mask_start = len(t1)
t2 = np.arange(10, 14, 0.05)
t = np.concatenate([t1, t2])
c = np.cos(t)     # an aside, but it's better to use numpy ufuncs than list comps

mc = ma.array(c)
mc[mask_start] = ma.masked
plt.figure()
plt.plot(t, mc)
plt.title('Using masked arrays')

plt.show()

在此输入图像描述

至少在我的系统(OSX,Python 2.7,mpl 1.1.0)上,我没有任何平移等问题。

奇怪的线条是 matplotlib 1.1.1 中的一个错误。

不需要按时间顺序排列虚拟点的t分量,零值也可以。

对于c组件,我使用np.nan而不是None ,它(在从列表转换时)强制dtype'float64'而不是'O' (对象)。

最好在用样本填充数组(或附加到列表)时插入虚拟点,如下所示:

samples = [] # (t,c) data pairs.
# Waiting for samples in a loop.
    if samples and current_sample[0] > samples[-1][0] + GAP_TOLERANCE:
        samples.append((0, np.nan))
    samples.append(current_sample)

t, c = np.array(samples).T

暂无
暂无

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

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