如何跳过散景图中的数据点?

时间:2018-07-27 18:06:46

标签: python plot bokeh skip

考虑以下代码:

from datetime import datetime as dt
from bokeh.io import output_file, show
from bokeh.plotting import figure
from bokeh.models import ColumnDataSource

output_file("plot_dates.html")

p = figure(x_axis_type='datetime')

data = dict(
    dates=[dt(2015, 1, 1), dt(2015, 1, 2), dt(2015, 1, 3)],
    values=[1,2,3])
source = ColumnDataSource(data)

p.line('dates', 'values', source=source)

show(p)

这将显示正确的行。 如果现在我想跳过一点,例如第二个我希望在datesvalues(或两者中)中设置元素会导致跳过一点。 不幸的是,情况并非如此,但是None仍显示为“ 0”,如果是日期,则表示为1970-01-01。有没有简单的方法可以跳过数据,或者必须手动完成(或通过单独的库)?

我知道使用pandas来过滤掉包含None元素的行/列可能会或多或少地容易地做到这一点,但是我不能使用它。

2 个答案:

答案 0 :(得分:2)

根据您的意思,可以使用NaN值而不是None来做到这一点。但是,您将必须为np.nan使用NumPy,并且还必须确保对数组进行正确编码,以便能够将NaN值传输到浏览器中。

此外,您将需要更多积分。当行数据中的值为NaN时,两侧上的线段都将被跳过,因此只有3个点,根本不会绘制任何内容,因为任何地方都没有完整的线段。五点,您可以看到:

import numpy as np
from datetime import datetime as dt
from bokeh.io import output_file, show
from bokeh.plotting import figure
from bokeh.models import ColumnDataSource

output_file("plot_dates.html")

p = figure(x_axis_type='datetime')

data = dict(
    dates=[dt(2015, 1, 1), dt(2015, 1, 2), dt(2015, 1, 3), dt(2015, 1, 4), dt(2015, 1, 5)],
    values=np.array([1.0, 3.0, np.nan, 5.0, 4.0]))
source = ColumnDataSource(data)

p.line('dates', 'values', source=source)

show(p)

enter image description here

编辑:这也可以用CDSView完成,而无需在其中放置任何NaN值:

view = CDSView(source=source, filters=[IndexFilter([0, 1, 3, 4])]) 
p.line('dates', 'values', source=source, view=view)

从您的问题中不清楚“跳过”是什么意思。如果您的意思是有一种简单的方法来画线,就好像该点根本就不在那儿一样,即在NaN之上没有中断或没有过滤器给出的情况下,答案是“否”。您将需要预先过滤数据。

答案 1 :(得分:0)

为什么不只是删除您不想要的数据?不需要任何包装

data = dict(dates=[dt(2015, 1, 1), dt(2015, 1, 2), dt(2015, 1, 3)], values=[1,2,3])

# remove the 1st date 
dates2 = data['dates']
values2 = data['values']
del dates2[1]
del values2[1]
data2 = dict(dates=dates2,values=values2) 
# this should be the dict from before without the 1st date and 1st value

您可以编写一个函数删除第n个日期。

def deldate(n,data):

    dates2 = data['dates']
    values2 = data['values']
    del dates2[n]
    del values2[n]
    data2 = dict(dates=dates2,values=values2) 
    return data2