如何跳过散景图中的数据点?
How to skip data points in bokeh plot?
考虑以下代码:
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)
这显示行正确。
如果现在我想跳过一点,例如第二个我希望在 dates
或 values
(或两者)中设置一个元素会导致跳过一个点。
不幸的是,情况并非如此,但 None
显示为“0”,在日期的情况下转换为 1970-01-01。是否有一种简单的方法来跳过数据,或者必须手动完成(或通过单独的库)?
我知道使用 pandas
过滤掉包含 None
元素的 rows/columns 可以或多或少地轻松完成此操作,但我不能使用它。
为什么不直接删除不需要的数据?它不需要任何包
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
根据您的意思,您可以使用 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)
虽然从你的问题中并不清楚你所说的 "skip" 是什么意思。如果您的意思是有没有一种方法可以简单地画线,就好像该点根本不存在一样,即没有 NaN
或过滤器给出的中断,那么答案是 "no"。您将需要预先过滤您的数据。
考虑以下代码:
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)
这显示行正确。
如果现在我想跳过一点,例如第二个我希望在 dates
或 values
(或两者)中设置一个元素会导致跳过一个点。
不幸的是,情况并非如此,但 None
显示为“0”,在日期的情况下转换为 1970-01-01。是否有一种简单的方法来跳过数据,或者必须手动完成(或通过单独的库)?
我知道使用 pandas
过滤掉包含 None
元素的 rows/columns 可以或多或少地轻松完成此操作,但我不能使用它。
为什么不直接删除不需要的数据?它不需要任何包
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
根据您的意思,您可以使用 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)
虽然从你的问题中并不清楚你所说的 "skip" 是什么意思。如果您的意思是有没有一种方法可以简单地画线,就好像该点根本不存在一样,即没有 NaN
或过滤器给出的中断,那么答案是 "no"。您将需要预先过滤您的数据。