考虑以下代码:
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)
Run Code Online (Sandbox Code Playgroud)
这将显示一条正确的线。如果现在我想跳过一个点,例如我希望在其中dates或其中values(或两者中)设置元素的第二个点,将导致跳过一个点。不幸的是,情况并非如此,而是None显示为“0”,就日期而言,它转换为 1970-01-01。是否有一种简单的方法来跳过数据,或者必须手动完成(或通过单独的库)?
我知道这可以或多或少轻松地用于pandas过滤包含None元素的行/列,但我不能使用它。
根据您的意思,您可以使用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)
Run Code Online (Sandbox Code Playgroud)
编辑:这也可以通过 a 来完成,CDSView无需NaN在其中输入任何值:
view = CDSView(source=source, filters=[IndexFilter([0, 1, 3, 4])])
p.line('dates', 'values', source=source, view=view)
Run Code Online (Sandbox Code Playgroud)
不过,从您的问题中尚不清楚“跳过”的含义。如果您的意思是有没有一种方法可以简单地画线,就好像该点根本不存在一样,即没有上面的中断NaN或过滤器给出,那么答案是“否”。您需要预先过滤您的数据。