【问题标题】:Put a gap/break in a line plot在折线图中放置一个间隙/中断
【发布时间】:2013-03-27 05:32:05
【问题描述】:

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

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

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

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

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

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

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

编辑:下面是一个演示该行为的最小工作示例。第一个情节是我试图避免的连接线。第二个图显示添加 None 值似乎有效,但是如果您平移该图的视图,您会看到第三个图中显示的内容,一条线跳转到图的较早部分。

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

【问题讨论】:

  • 是否可以制作一个可重现的示例,尤其是显示您当前用于绘图的 matplotlib 代码?
  • 好主意。添加示例。
  • 如果两次调用 plot() 会怎样? IE。 ax.plot(t1,c1) 和 ax.plot(t2,c2)。您必须手动设置颜色: ax.plot(t1, c1, c = "b")
  • 我试过你的代码(python 3.3,matplotlib 1.2.1),在第三个图中没有看到你的“奇怪的跳线”……顺便说一句,你可以写 c = np.sin (t)。
  • PhML,感谢您的尝试。看起来下面的 tom10 也没有在他的机器上体验过,所以也许这只是我的设置。

标签: python matplotlib


【解决方案1】:

屏蔽数组很适合这个。您只需要掩盖您不想连接的第一个点:

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)上,平移等方面没有任何问题。

【讨论】:

  • 感谢您的建议。在我的机器(Python 2.7.3,matplotlib 1.1.1)上,如果我平移绘图,我仍然会得到不需要的线。
  • 效果很好,也可以与pandas.DataFrame相关联
  • 有没有一种方法可以轻松地做到这一点,而不会丢失被屏蔽的数据点?您可以轻松地在 len(t1) 和下一个点之间插入一个点,然后将其屏蔽吗?我想对要插入多个中断的数据执行此操作。如果我可以保留所有数据,这看起来是一个有用的解决方案。
  • @Shawn:当然,你可以在任何你想要的地方插入一个点,然后屏蔽它(我认为你不需要插入“下一个点”,但我可能不明白你的意思'再去)。或者,当然,您可以单独绘制曲线。否则,我建议您提出一个单独的问题,因为您要查找的内容与原始问题不同。
猜你喜欢
  • 1970-01-01
  • 2020-08-11
  • 1970-01-01
  • 2018-08-08
  • 2016-08-23
  • 2020-04-24
  • 1970-01-01
  • 2022-06-12
  • 2012-04-25
相关资源
最近更新 更多