簡體   English   中英

在 Jupyter 中使用 Bokeh RadioGroup 到 plot Pandas DataFrame 的選定子集

[英]Use Bokeh RadioGroup to plot selected subset of Pandas DataFrame within Jupyter

目標

通過選擇列的特定值,Plot Pandas DataFrame 中的行子集。

理想情況下 plot 它在 jupyter 筆記本中。

我做了什么

我對 Javascript 知之甚少,所以我通過運行 Bokeh 服務器並使用 Python 編寫的所有內容來設法達到 plot。

但是,我無法在 Jupyter 筆記本中使用 Javascript 回調。 我的做法聽起來有點愚蠢:通過列的值將 DataFrame 拆分為子集並將它們放入 dict 中,然后我可以通過 RadioGroup 的活動選擇 select 子集。

這是我的代碼示例:


import pandas as pd
import bokeh
from bokeh.io import output_notebook, show
import bokeh.plotting as bp
import bokeh.models as bm
from bokeh.layouts import column, row

data = {
    'Datetime': ['2020-04-09T10:23:38Z', '2020-04-09T22:23:38Z','2020-04-09T23:23:38Z', '2020-01-09T10:23:38Z', '2020-01-09T22:23:38Z', '2020-01-09T23:23:38Z'],
    'Month': ['Apr', 'Apr', 'Apr', 'Jan', 'Jan', 'Jan'],
    'Values': [1.2, 1.3, 1.5, 1.1, 3, 1.3]
}

df = pd.DataFrame.from_dict(data)
month_list = df['Month'].unique().tolist()

plot_height = 600
plot_width = 1000
col2plot = 'Values'

month_dict = {}
for m in month_list:
    subset = df[df['Month'] == m].reset_index(drop=True)
    month_dict[m] = subset[['Datetime', col2plot]].to_dict()

p1 = bp.figure(
    plot_height=plot_height, 
    plot_width=plot_width, 
    title='Values',
    toolbar_location=None,
    tools="hover",
    tooltips=[("DateTime", "@Datetime")]
)

src = bm.ColumnDataSource(df[df['Month'] == 'Jan'].reset_index(drop=True))
p1.line(x='index', y=col2plot, alpha=0.8, source=src)

month_selector = bm.widgets.RadioGroup(labels=month_list, active=1)

jscode = """
var month = cb_obj.labels[cb_obj.active] //selected month
const new_data = source[month]
src.data = new_data
src.change.omit()
"""
callback = bm.CustomJS(args=dict(src=src, source=month_dict), code=jscode)
month_selector.js_on_change('active', callback)
output_notebook()
show(row(p1, month_selector))

代碼運行,但通過選擇某個月份,plot 沒有更新。 這可能是由於 JS 回調處理不當,有什么解決方法嗎? 非常感謝你的幫助!

您的代碼存在問題:

  • p.line中,您正在使用index列。 但是當您調用pd.DataFrame.to_dict()時,該列不存在。 可以通過在.to_dict() .reset_index()來修復
  • to_dict()以字典形式返回數據,但ColumnDataSource需要列表字典。 to_dict('list')替換調用
  • src.change.omit() - 這里有一個錯字,應該是emit 但是由於您要替換整個data屬性而不是僅更改某些數據,因此您可以簡單地完全刪除該行

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM