如何在bokeh图中跳过数据点?

4

考虑以下代码:

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个回答

5
根据你的意思,你可以使用 NaN 值而不是 None。但是你需要使用 NumPy,既要用到np.nan,也要确保数组被正确编码以便将 NaN 值传输到浏览器中。

另外,你需要更多的数据点。当线性数据中有 NaN 值时,两侧的线段都会被跳过,因此只有三个数据点时,就什么也画不出来,因为没有完整的线段。如果有五个数据点,则可以看到:
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)

这里输入图片描述

编辑:这也可以通过使用CDSView来实现,而不需要放置任何NaN值:

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

从你的问题中并不清楚你所说的“跳过”是什么意思。如果你的意思是是否有一种方法可以简单地绘制这条线,就好像这个点根本不存在一样,即没有上面那个NaN或者过滤器给出的中断,那么答案是“否”。你需要预先过滤你的数据。


点赞了,但没有显示出来。这正是我想要的,谢谢! - user10141108

-1

为什么不直接删除您不需要的数据?这不需要任何软件包。

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

这个答案有两个问题:(1) 这正是 OP 正在试图避免的;(2) 即使在这种情况下,删除该点也只是一种非常粗略的方法,将其转换为 Numpy 数组后进行屏蔽会是一种更清晰的方法。 - norok2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接