- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个由 ColumnDataSource
驱动的 hbar
图,其中 y 轴上有分类标签,两个数字 x 轴上有分类标签。为了在 y 轴上每个标签有两组条形,我构造了两个范围 (Things1=df.Thing.index + 1 - 0.2
和 Things2=df.Thing.index + 1 + 0.2
) 并将两个 hbar
实例分别分配给这些范围之一。
当且仅当 ColumnDataSource
中的范围 Things1
和 Things2
是使用预定义偏移量 1 构造的时,这才给我正确的布局;否则,所有标签和条形图都恰好偏移一个条目。
我现在构建绘图的方式如下所示:
df = pandas.DataFrame([('Store', 'Juice', 3, 19.0),
('Warehouse', 'Paint', 7, 21.0),
('Store', 'Fruit', 2, 6.0),
('Warehouse', 'Grass', 4, 15.0),
('Store', 'Leaves', 9, 32.0)],
columns=('Storage', 'Thing', 'Quantity', 'Valueation'))
source = bokeh.models.ColumnDataSource(dict(Quantity=df.Quantity,
Things1=df.Thing.index + 1 - 0.2, # Why +1 ?
Things2=df.Thing.index + 1 + 0.2, # Why +1 ?
Valueation=df.Valueation,
Storage=df.Storage))
plot = bokeh.plotting.figure(plot_width=800, plot_height=300,
y_range=list(df.Thing.unique()),
x_range=(0, df.Quantity.max() * 1.1))
plot.hbar(y='Things1', right='Quantity', height=0.3, alpha=0.7, source=source)
plot.hbar(y='Things2', right='Valueation', height=0.3, alpha=1, source=source,
x_range_name="ValueationRange")
plot.yaxis.axis_label = 'Thing'
plot.xaxis.axis_label = 'Quantity'
plot.extra_x_ranges = {"ValueationRange":
bokeh.models.Range1d(start=0, end=df.Valueation.max() * 1.1)}
plot.add_layout(bokeh.models.LinearAxis(x_range_name="ValueationRange",
axis_label='Valueation'), 'above')
bokeh.plotting.show(plot)
Things1/2=df.Thing.index + 1 -/+ 0.2
给出正确的绘图:
使用 Things1/2=df.Thing.index -/+ 0.2
我得到
我的猜测是,这是由于不同的范围是基于 0 或 1 的。这是一个简单的陷阱还是我做错了?
最佳答案
编辑事实证明,这种使用原始值(而不是真实的分类数据)和因子范围的方法没有记录和未经测试。分类数据的处理将在 0.12.7 中发生变化,这将允许正确使用分类数据所需的功能 - 请参阅下面的 bigreddots(主要 Bokeh 开发人员)评论。
仅从观察来看,分类范围的默认行为似乎是将整数 y 值从 1 开始映射到类别。
如果在初始化绘图对象后添加 y_range,则会暴露原始刻度:
正如您所提到的,这只是由于范围所致。第一个绘制的数据系列从 0 开始,但第一个标签从 1 开始。您可以使用 funtickformatter 设置偏移量或将显式 y 刻度映射到值,这可以精确控制值和标签之间的映射。
如果你看一个例子,例如 http://docs.bokeh.org/en/latest/docs/gallery/categorical.html ,您可以看到数据映射到类别,但这是因为 y 值本身作为因子输入。在您的示例中,您只是更改 y 轴,但为了偏移值,您不能使用原始类别本身。
顺便说一句:编辑 offset 属性在 0.12.7 中可能不存在,因此最好不要依赖它/假设它存在。
查看文档,它说默认偏移量为 0。所以我认为您需要 -1 的偏移量来解释这一点。请参阅http://docs.bokeh.org/en/latest/docs/reference/models/ranges.html#bokeh.models.ranges.FactorRange.offset
import pandas
import bokeh
import bokeh.models, bokeh.plotting
df = pandas.DataFrame([('Store', 'Juice', 3, 19.0),
('Warehouse', 'Paint', 7, 21.0),
('Store', 'Fruit', 2, 6.0),
('Warehouse', 'Grass', 4, 15.0),
('Store', 'Leaves', 9, 32.0)],
columns=('Storage', 'Thing', 'Quantity', 'Valueation'))
source = bokeh.models.ColumnDataSource(dict(Quantity=df.Quantity,
Things1=df.Thing.index - 0.2, # Why +1 ?
Things2=df.Thing.index + 0.2, # Why +1 ?
Valueation=df.Valueation,
Storage=df.Storage))
plot = bokeh.plotting.figure(plot_width=800, plot_height=300,
y_range=list(df.Thing.unique()),
x_range=(0, df.Quantity.max() * 1.1))
plot.y_range.offset = -1
plot.hbar(y='Things1', right='Quantity', height=0.3, alpha=0.7, source=source)
plot.hbar(y='Things2', right='Valueation', height=0.3, alpha=1, source=source,
x_range_name="ValueationRange")
plot.yaxis.axis_label = 'Thing'
plot.xaxis.axis_label = 'Quantity'
plot.extra_x_ranges = {"ValueationRange":
bokeh.models.Range1d(start=0, end=df.Valueation.max() * 1.1)}
plot.add_layout(bokeh.models.LinearAxis(x_range_name="ValueationRange",
axis_label='Valueation'), 'above')
bokeh.plotting.show(plot)
关于python - 与 Bokeh hbar 和 ColumnDataSource 的标签相差一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45280354/
我正在尝试使用 flask 和 bokeh 构建一个网络应用程序,用户可以在其中手动对数据进行分类。现在,UI 使用自定义 javascript 回调来直观地呈现更改,但我不确定如何使用 javasc
我想根据用户从下拉菜单中选择的内容更改简单线图的数据源。 我有 2 个数据框,分别是我自己和男朋友的体重和年龄。 my_weight = [60,65,70] my_age = [21,22,25]
我正在尝试创建一个绘制多个时间序列的 Bokeh 应用程序,并允许用户使用 CheckboxButtonGroup 小部件选择时间序列的一个子集。我想从 python 更改显示的图形,而不是试图在 j
我有两个相同单位的变量,我想用 Bokeh 在同一个 x 轴上绘制。似乎 plot.multi_line 是正确的工具,但我无法从文档中找到正确的语法。我尝试了什么(从文档中收集): # df is
我是 Bokeh 的新手,并试图弄清楚 columnDataSource 的作用。它出现在很多地方,但我不确定它的目的和它是如何工作的。有人可以照亮吗?抱歉,如果这是一个愚蠢的问题... 最佳答案 C
我的问题与修改 this 有关来自 Bokeh Gallery 的示例。 我有一个矩阵 m 或原始数据,其中每一行对应于转换空间中的一对 x、y 坐标(请参阅代码的#MockData 部分)。 x,y
我想使用 ColumnDataSource 设置 Bokeh 线图( Bokeh 版本 0.12.5)的颜色。但是,对于线图,不会绘制任何内容。另一方面,如果我使用圆形渲染器,一切都会按预期进行。下面
我正在尝试使用 Bokeh 在交互式圆图中显示我的集群。我设法显示了绘图本身,但图表上的所有规范都是蓝色的。我想在 4 个集群中显示它们,因为这是一个集群分析。 这是在没有实现颜色的情况下工作的代码:
我试图避免使用 ColumnDataSource,而是将 pandas 数据框列直接传递给 Bokeh 图。 但很快我就不得不实现一个 HoverTool,它需要将数据保存在 ColumnDataSo
我一直在尝试选择要在简单的 Bokeh 线图中绘制的行。所需的结果是一个简单的线图,其中 x 轴为 Date,y 轴为 Value。使用 2 个选择小部件,我想选择 Country 和 Type。 非
我的回调有问题,我一切正常,除了图表没有更新的部分,即使当我更改 slider 时数组已更新。 import numpy as np from bokeh.io import curdoc from
我正在使用 jupyter 中的嵌入式 Bokeh 应用程序来标记时间序列的部分。假设我们必须使用以下示例数据框: Time Y Label
我在 Bokeh 中使用 pandas 数据框作为 ColumnDataSource 来绘制散点图,其中每个气泡代表一个国家/地区。在我的数据框中,有一列名为“区域”的列,用于通知每个国家/地区的区域
尝试将以下内容读入 vbar Bokeh 图表,但它不会渲染空白图形之外的任何内容。 Index | Sub Call Type | Calls |Total AHT 0 | S
我正在尝试绘制可追溯到 1998 年的大量数据。 我的代码似乎工作正常,但运行时抛出错误消息“BokehUserWarning:ColumnDataSource 的列必须具有相同的长度” 这是我的代码
Dataframes 自然带有一个索引,即我们可以将它们视为的那些行标题集。当我在 Bokeh 中构建 ColumnDataSource 以捕获该数据框中的信息以在 HoverTool 中进行绘图和注
我对 Bokeh 中的 HoverTool 有点恼火。我有一个具有多个数据“列”的 ColumnDataSource,我使用各个列在图表上绘制线条。当我将鼠标悬停在一条线上的一个点上时,我想显示该线上
我想向 ColumDataSource() 添加工具提示,以捕捉到最近的数据点。但是当使用 @x, @y 时它显示 ???而不是最接近的值。使用 $x, $y 效果很好。 下面提供了一个示例: fro
我有一个由 ColumnDataSource 驱动的 hbar 图,其中 y 轴上有分类标签,两个数字 x 轴上有分类标签。为了在 y 轴上每个标签有两组条形,我构造了两个范围 (Things1=df
我正在尝试向我的 Bokeh 图添加悬停工具提示。工具提示出现,但我试图显示的面积值显示为“???”。我正在使用 ColumnDataSource 来设置绘图源数据,并且 area 是该数据源中的有效
我是一名优秀的程序员,十分优秀!