2013-02-06 61 views
0

我有一个交互式图形,在哪个绘图上增量绘制,其中一个是时间块。在matplotlib中修改填充区域

也就是说,在一个循环中我得到一些采样数据,然后将它们添加到图中现有的曲线并重画图片。为此,我使用get/set_x/ydata函数。东西在这条线:

# Get initial data 
time = [1, 2, 3, 4, 5] 
samples = [0.1, 0.2, 0.3, 0.4, 0.5] 
c = plot_curve(time, samples) 
# Get new data 
time2 = [6, 7, 8] 
samp2 = [0.6, 0.7, 0.8] 
c.set_xdata(append(c.get_xdata(), time2)) 
c.set_ydata(append(c.get_ydata(), samp2)) 

问题是,我也填充曲线附近的一些区域(例如曲线与x轴之间的空间),使用fill_between。目前,我以这种方式创造很多小块的:

# Filling initial chunk 
fill_between(time, samples, [0 for i in time]) 
# Filling next chunk 
fill_between(time[-1] + time2, samples[-1] + samp2, [0 for i in time2] + [0]) 

(我知道这个代码太臭,但它给了一个想法)。

所以,问题是:有一条曲线,但填充区域是2(每个数据块一个)。 这会在图形中产生小的文物,因为每个填充区域都非常靠近下一个区域,其间空间很小。

有没有办法在灌装区域进行这种增量式工作?例如,可以很好地保持2条曲线(一条等于c.get_ydata()和一个零),并让matplotlib自动填充它们之间的区域,而不必显式调用该命令 - 以便填充区域始终与采样点保持一致。

或者,另一个好方法是使用采样点而不是多边形来表示填充区域,以便我可以使用类似于get/set_x/ydata的方法更新区域。

+0

你整理出来了吗? – tacaswell

+0

不幸的是... – AkiRoss

+1

我建议发邮件到邮件列表或在github上创建和发布。 – tacaswell

回答

0

稍微少的hackish办法做到这一点是做

pc = fill_between(time, samples) 

(注意,默认为Y2 = 0,所以你并不需要该列表理解)

然后,当你更新你的身材

time2 = [6, 7, 8] 
samp2 = [0.6, 0.7, 0.8] 
time_update = append(c.get_xdata(), time2) 
samp_update = append(c.get_ydata(), samp2) 
c.set_xdata(time_update) 
c.set_ydata(samp_update) 
pc.remove() 
pc = fill_between(time_update, samp_update) 

而不是使一个新的更小的区域每一次的,刚擦了旧的和充分的所有数据重新创建它。不知道这将如何影响你的速度,但如果它比现在所做的慢,我会感到惊讶。

+0

好吧,我没有尝试性能比较,但你应该知道,采样点可以是很高的数量,如百万(> 1,<100),并且更新频率可以相对较高(每1000个采样或更少) 。 – AkiRoss

+0

@AkiRoss数据是否很流畅?在调用'fill_between'之前,你可能会急于进行下采样(因为你的显示器上只有1k像素,反正它正在下降) – tacaswell

+0

不幸的是我已经考虑过这个选项了......数据一点都不顺利。考虑到绘图以矢量格式保存,允许表示比显示器更宽。 – AkiRoss