Python 3.x 为什么bokeh图不会用新数据更新?

Python 3.x 为什么bokeh图不会用新数据更新?,python-3.x,bokeh,Python 3.x,Bokeh,我正在创建一个bokeh应用程序,它从股票价格中提取数据,并根据用户输入的股票符号更改绘图。我用这个例子作为模型 一切正常,除了输入新符号时绘图不会更新 在向ColumnDataSource传递数据帧之前,我曾尝试将新数据作为字典传递,但没有成功 作为pd进口熊猫 将numpy作为np导入 从bokeh.models.widgets导入文本输入,选择 从bokeh.models导入ColumnDataSource 从bokeh.plotting导入图形 从bokeh.layouts导入列、行 从

我正在创建一个bokeh应用程序,它从股票价格中提取数据,并根据用户输入的股票符号更改绘图。我用这个例子作为模型

一切正常,除了输入新符号时绘图不会更新

在向ColumnDataSource传递数据帧之前,我曾尝试将新数据作为字典传递,但没有成功

作为pd进口熊猫 将numpy作为np导入 从bokeh.models.widgets导入文本输入,选择 从bokeh.models导入ColumnDataSource 从bokeh.plotting导入图形 从bokeh.layouts导入列、行 从bokeh.io导入显示,输出 导入quandl 这是获取数据的函数:

def get_数据符号: 字典={} data=quandl.get'WIKI/'+symbol,collapse='annual',returns='numpy' df=pd.DataFramedata 字典['date']=listdf.date.values 字典['high']=listdf.high.values 返回字典 这是绘图的一个函数:

def modify_docdoc: 符号='AAWW' source=ColumnDataSourcedata=get_datasymbol p=figurex\u axis\u type='datetime',title='Stock Price',绘图高度=350,绘图宽度=800 p、 xgrid.grid\u line\u color=None p、 ygrid.网格线α=0.5 p、 xaxis.axis_标签='year' p、 yaxis.axis_标签='close' r=p.linesource.data['date'], 来源.数据[“高”], 线条颜色=‘海军’ select=Selecttitle=Color,value=navy,options=COLORS 输入=文本输入=股票代码,值=符号 def update_symbolattrname,旧,新: source.data=get_datainput.value 输入。更改“值”时,更新符号 布局=列行输入,宽度=400,行 doc.add\u rootlayout showmodify\u文件 我认为当输入新符号时,绘图会更新,但它只是保持不变


有什么想法吗?

您的代码看起来像Bokeh服务器应用程序,但您使用的是显示我觉得不好的东西。您还试图通过将新数据指定给源来更新地物,但未将源传递给地物对象,因此不会产生任何效果。你能试试这个代码是否适合你吗?应该适用于BokehV1.0.4

import random
import pandas as pd
from tornado.ioloop import IOLoop
from bokeh.server.server import Server
from bokeh.application import Application
from bokeh.application.handlers.function import FunctionHandler
from bokeh.plotting import figure, ColumnDataSource
from bokeh.models.widgets import TextInput
from bokeh.layouts import column, row

def make_document(doc):
    symbol = 'AAWW'

    def get_data(symbol):
        dictionary = {}
        data = quandl.get('WIKI/' + symbol, collapse = 'annual', returns = 'numpy')
        df = pd.DataFrame(data)
        dictionary['date'] = list(df.Date.values)
        dictionary['high'] = list(df.High.values)
        return dictionary

    source = ColumnDataSource(data = get_data(symbol))

    p = figure(x_axis_type = 'datetime', title = 'Stock Price', plot_height = 350, plot_width = 800)
    p.xgrid.grid_line_color = None
    p.ygrid.grid_line_alpha = 0.5
    p.xaxis.axis_label = 'year'
    p.yaxis.axis_label = 'close'

    r = p.line(x = 'date',
               y = 'high',
               source = source,
               line_color = 'navy')

    input = TextInput(title = "Ticker Symbol", value = symbol)

    def update_symbol(attrname, old, new):
        source.data = get_data(input.value)

    input.on_change('value', update_symbol)

    layout = column(row(input, width = 400), row(p))
    doc.add_root(layout)

io_loop = IOLoop.current()
server = Server({'/myapp': Application(FunctionHandler(make_document))}, port = 5001, io_loop = io_loop)
server.start()
server.show('/myapp')
io_loop.start()
基本上主要的变化是:

r = p.line(x = 'date',
           y = 'high',
           source = source,
           line_color = 'navy')

根据Tony的回答,我只需更改一行代码:

r=p.linex='日期', y=‘高’, 来源=来源, 线条颜色=‘海军’
您是否正确地部署了bokeh服务器?我相信是这样。我正在Jupyter笔记本中部署它。所以从bokeh.io导入show,输出_笔记本,然后输出_笔记本。这有意义吗?图书馆的名字越来越奇怪了。我想知道他们是怎么想到昆德和博克的?一个巨大的谜!是的,这确实有效。非常感谢。只是出于好奇,你会如何在Jupyter笔记本中运行它?没问题。事实证明,如果我像上面那样改变p.line的参数,一切都正常。再次感谢!