- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 Django 应用程序中创建 Bokeh 图,以绘制运动员的游泳事件图。我正在绘制持续时间(游泳时间)与日期(游泳比赛日期)。这个想法是拥有一个图并能够使用 SelectBox 小部件来选择在图表上显示哪个事件。问题是,当我更改 CallbackJS 函数中的数据源时,图表不会更新,而是变为空白。
数据来自表单的Event对象
class Event(models.Model):
swimmer = models.ForeignKey(Swimmer, on_delete=models.SET_NULL, null=True, blank=True)
team = models.ForeignKey(Team, on_delete=models.CASCADE, null=True, blank=True)
name = models.CharField(max_length=50, null=True, blank=True)
gender = models.CharField(max_length=1, choices=GENDER_CHOICE, null=True, blank=True)
event = models.CharField(max_length=10, choices=EVENT_CHOICE)
time = models.DurationField()
place = models.IntegerField(null=True, blank=True)
date = models.DateField(null=True)
首先,我迭代每个事件(当前为 17 个)并创建日期 (datetime.date) 和时间 (datetime.timedelta) 字段的列表。未修改的字段分别用于 x 和 y,并对值进行轻微编辑(主要是类型转换为字符串)以用于悬停工具。如果特定事件没有数据,data_source{}
条目将设置为 None
。
示例数据:
data_source = {
'x_50_free': [date(2017,9,7), date(2017,9,8)]
'y_50_free': [timedelta(seconds=22.96), timedelta(seconds=22.32)]
'date_50_free': ['9/7/2017', '9/8/2017']
'time_50_free': ['00:22.96', '00:22.32']
'x_100_free': [date(2017,9,7)]
'y_100_free': [timedelta(seconds=49.86)]
'date_100_free': ['9/7/2017']
'time_100_free': ['00:49.86']
}
然后,我绘制一条初始线,以便在页面加载时显示一条线。
source = ColumnDataSource(data=dict(
x=data_source['x_'+first_event],
y=data_source['y_'+first_event],
date=data_source['date_'+first_event],
time=data_source['time_'+first_event]
))
plot.line('x', 'y', source=source)
我在回调函数中更新源数据
callback = CustomJS(args=dict(source=source), code="""
data = %s;
f = cb_obj.value;
if (f == "50 Freestyle") {
source.data['x'] = data.x_50_free;
source.data['y'] = data.y_50_free;
source.data['date'] = data.date_50_free;
source.data['time'] = data.time_50_free;
} else if (f == "100 Freestyle") {
source.data['x'] = data.x_100_free;
source.data['y'] = data.y_100_free;
source.data['date'] = data.date_100_free;
source.data['time'] = data.time_100_free;
}
...
} else if (f == "400 IM") {
source.data['x'] = data.x_400_im;
source.data['y'] = data.y_400_im;
source.data['date'] = data.date_400_im;
source.data['time'] = data.time_400_im;
}
source.change.emit();
""" % json.dumps(data_source, cls=DatetimeEncoder)) # encoder to handle datetimes for x-axis
据我了解,source.change.emit()
用于更新ColumnDataSource。这似乎有效,因为我能够将 source.data[]
记录到控制台并看到它根据 Select
小部件选项进行更新,但绘图本身不会更新它只是一片空白。我如何更新绘图以反射(reflect)源数据的变化?
最佳答案
您的示例既不简单也不完整。一个完整的例子可以立即运行。最低限度的遗漏了与您的问题无关的方面。因此,我不太确定我是否理解了所有内容,但我尝试去适应它。以下是一些可以帮助您入门的代码:
from bokeh.io import show, output_file, output_notebook
from bokeh.models import ColumnDataSource
from bokeh.plotting import figure
from bokeh.layouts import column, widgetbox
from bokeh.models import CustomJS, Select
output_file("swim_plot.html")
first_event = "_50_free"
second_event = "_100_free"
data_source = {
'x': [date(2017,9,3), date(2017,9,4)],
'y': [0, 0],
'x_50_free': [date(2017,9,7), date(2017,9,8)],
'y_50_free': [22.23, 24.34],
'x_100_free': [date(2017,9,12), date(2017,9,14)],
'y_100_free': [23.22, 25,12]
}
source = ColumnDataSource(data=data_source)
callback = CustomJS(args=dict(source=source), code="""
data = source.data;
f = cb_obj.value;
if (f == "_50_free") {
data['x'] = data.x_50_free;
data['y'] = data.y_50_free;
} else if (f == "_100_free") {
data['x'] = data.x_100_free;
data['y'] = data.y_100_free;
}
source.change.emit();
""")
select = Select(title="Option:", value="default", options=["default",
first_event, second_event])
select.js_on_change('value', callback)
plot = figure(plot_width=400, plot_height=400, x_axis_type='datetime')
plot.line('x', 'y', source=source)
show(column(widgetbox(select),plot))
我在您的代码中发现的主要问题是 ColumnDataSource 的定义。当您将所有数据添加到 data_dict 时,您只将其中的一部分添加到源中。因此,尝试访问 JS 回调中丢失的数据将会失败。
关于javascript - Bokeh 更改 CallbackJS 中的源数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45987419/
我用 bokeh.plotting.Figure.line 画了下面的图。我如何添加垂直引用线来强调 Feb/14 的一个点? 这是另一个情节。这是 bokeh.charts.Bar。我想添加水平指南
我使用 python 在 Bokeh 中创建了一个散点图。我想创建一个小部件,允许用户更改散点图中点的颜色。有没有简单的方法可以做到这一点?我找到了一个基于 JQuery 的颜色选择器小部件 ( ht
我有一个 bokeh 应用程序,我可以在其中读取各种文件(6 到 12 个)并生成 DataTable 来比较几个不同的变量。 所以我有一个生成 DataTable 的循环,将它们添加到列表中,然后最
典型的 Bokeh 散点图可能如下所示: 其中 x 和 y 限制均为 [0,1]。如何删除轴上 0 之前并延伸到 1 之外的额外空间?这样最终图的左角为坐标 (0,0),左上角和右下角分别为 (0,1
我正在尝试创建一个 Bokeh 图,它允许我通过单击复选框来切换图中线条的可见性。 我开始尝试对复选框组使用 js 回调,但不幸的是,实际上并没有为复选框组实现 js 回调。 任何人都可以提出另一种方
例如,我有 button = Button(label="0", type="success") 选择此按钮后,我想将标签更改为“1”,反之亦然。有没有简单的方法来实现这一目标? 编辑: RadioB
我团队中的一些人,包括我自己,发现在 Bokeh 散点图中使用 circle 非常令人迷惑。方法,对于图中数据的初始自动缩放拟合,我们可以为我们的数据拨入合理的大小,例如使用 plot.circle(
所以我想做的是一个带有线条和圆圈的简单图形 http://docs.bokeh.org/en/latest/docs/quickstart.html#getting-started 但带有在鼠标悬停在
考虑一个垂直堆积条形图,其中每一列都由多个条形(段)组成。是否可以在每个段上添加工具提示?目前,相同的工具提示附加到组成该列的所有段。 from bokeh.core.properties impor
In[21]: from bokeh.charts import Bar, output_file, show In[22]: dict = {'sec': {u'A': 10, u'B': 20}}
在 Bokeh 中实现树形图需要什么?类似于这个 DS 示例的东西会很好—— http://bl.ocks.org/robschmuecker/7880033 我只是想可视化一个数据结构,所以只需要平
我了解如何指定在 Bokeh 中显示的特定刻度,但我的问题是是否有一种方法可以分配特定的标签来显示与位置。例如 plot.xaxis[0].ticker=FixedTicker(ticks=[0,1]
有什么方法可以为图例添加标题,例如左侧为当前图例,右侧为带有标题的图例。这个特殊的图例被放置在情节之外,所以我不知道是否可以用文本字形来伪造它。 最佳答案 从最新版本的 Bokeh (1.2) 开始,
问题:我的 python 应用程序启动了一个 Bokeh 服务器,如本文所述: http://matthewrocklin.com/blog/work/2017/06/28/simple-bokeh-
我正在使用 Bokeh 图制作折线图,我想标记实际的点(用线穿过它们),而不是仅仅标记线本身。我怎样才能做到这一点?我浏览了文档和用户指南,但似乎找不到答案。谢谢! 最佳答案 假设您正在使用 boke
我将一个 Bokeh Figure 实例作为输入传递给另一个函数,我需要在那里修改它的源代码。 不知道该怎么做! 这就是我创建图形实例的方式: source = ColumnDataSource({'
据我所知,我可以通过设置 responsive=True 来使 Bokeh 图响应 div 的宽度。然而,我感兴趣的是让 Bokeh 图只在一定程度上做出响应。有没有一种方法可以让我设置 Bokeh
我有一个 Bokeh 服务器应用程序。我想在命令行上传递自定义选项: bokeh serve /path/to/script.py --my-option foo 这可能吗? Bokeh 会以某种方式
我有一个图,它使用来自一些原始数据的值(在 0-20 的 x/y 范围内),以及一些导致一些相当大的 x/y 值(例如 -1000 到 1000+)的最小化数据。因此,我所做的绘图需要我手动单击缩放以
在Web应用程序中,我想让用户使用bokeh的漂亮的框/套索选择工具来选择绘制图像中的感兴趣区域。我想接收选定的像素,以便在python中进行进一步的操作。 对于散点图,这类似于gallery,很容易
我是一名优秀的程序员,十分优秀!