【问题标题】:How to skip data points in bokeh plot?如何跳过散景图中的数据点?
【发布时间】:2018-07-27 18:06:45
【问题描述】:

考虑以下代码:

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 元素的行/列或多或少轻松完成,但我不能使用它。

【问题讨论】:

    标签: python plot bokeh skip


    【解决方案1】:

    根据您的意思,您可以使用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 或过滤器给出的中断,那么答案是“否”。您将需要预先过滤您的数据。

    【讨论】:

    • 已投票,但未显示。这正是我想要的,谢谢!
    【解决方案2】:

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

    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 数组后进行掩码会是一种更简洁的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多