定义长度时不显示 Bokeh Ray 字形
Bokeh Ray glyph not displaying when length defined
我正在尝试使用 Bokeh Ray 字形来显示风向数据。我的 x 数据是日期时间(1 天分辨率)。我有一个 Pandas 数据框,其中包含日期时间索引的风向数据列(每天一个条目,范围 0-360 度)。 Ray 函数看起来应该是完美的,但是当我定义 length
时,射线段不会渲染。如果我设置length=0
(强制光线段跨越整个图window),那么渲染就成功了。
相关代码:
def make_avewindspddir_fig(df):
fig = figure(
title="Average Wind Speed & Direction",
name="avewindspddir_fig",
x_axis_type='datetime',
y_axis_label='wind speed (mph)',
width=900, height=250
)
newcds = create_avewindspddir_cds(df, 'summit', start, end)
avewinddirrays = fig.ray(x='Date', y='y_zeros', length=0,
length_units='data', angle='avewinddir', angle_units='deg',
color='black', line_width=2, source=newcds)
fig.y_range = Range1d(-20, 100)
return fig
我传递给 'create_avewindspddir_cds' 函数(创建 newcds)的 Pandas 数据帧包含日期时间索引、平均风速、最大阵风、平均风向(度)和 'y_zeros'(一列零,我用作每条射线的原点,长度与所有其他列相等)。日期范围由用户输入并定义 'start' 和 'end'.
上面的代码(以及绘制风速和阵风线的代码)产生下图。这是我布局中许多其他面板中的一个面板,所以我将只使用屏幕截图(单击以查看放大视图):
光线正确地渲染了角度数据,如果我能控制长度参数,那么情节基本上看起来很完美。这里的想法是为每一天绘制小风向矢量,显示在平均风速和最大阵风线下方(每条射线的原点为 y=0)。如果我将射线绘图代码更改为此(将 length
参数更改为 10):
avewinddirrays = fig.ray(x='Date', y='y_zeros', length=10,
length_units='data', angle='avewinddir', angle_units='deg',
color='black', line_width=2, source=newcds)
...光线根本无法绘制(而且我的终端中没有收到任何错误消息)。我试过从 0.1 到 1000 的长度值,我试过使用 'screen' 和 'data'.
的长度单位
这可能是一个与我的 x 轴具有日期时间值和 y 轴具有整数相关的问题(数据中的 'length' 单位 - space 指的是 x-轴单位还是 y 轴单位?)。
作为后续问题,有没有办法在射线的一端放置箭头符号?
编辑: 回应@bigreddot....
另一件对完成这项工作至关重要的作品:
如果使用风向数据(以度为单位的罗盘方向),必须首先旋转数据以便 Ray 正确绘制它。请注意,Ray 从水平 x 轴向上旋转角度。要转换罗盘方向,以下代码有效:
# a: 0-90
a = winddir.ix[(winddir > 0) & (winddir <= 90)]
a_rotate = (a - 90)*-1
a_rotate.name = 'a_rotate'
# b: 90-180
b = winddir.ix[(winddir > 90) & (winddir <= 180)]
b_rotate = (b - 450)*-1
b_rotate.name = 'b_rotate'
# c: 180-360
c_d = winddir.ix[(winddir > 180) & (winddir <= 360)]
c_d_rotate = 360 - c_d + 90
c_d_rotate.name = 'c_d_rotate'
# retain the nulls!
nulls = winddir[winddir.isnull()==True]
nulls.name = 'nulls'
# put it back together:
avewinddir_rotate = pd.concat([a_rotate, b_rotate, c_d_rotate, nulls])
avewinddir_rotate.sort_index(inplace=True)
此外,由于无法使用箭头,我使用圆圈实现了相同的效果:
circles = fig.circle(x='Date', y='y_zeros',size=4, line_color='black',
fill_color='white', line_width=2, source=newcds)
只需要一个符号来定位射线的一端。在这种情况下,射线围绕圆圈旋转并指示风从 到 的位置(这是风倒钩的标准)。这是我的结果图:
射线length
目前仅根据x轴刻度进行测量。在您的情况下,x 轴测量日期时间,从纪元开始以毫秒为单位表示。对于数据单元,您可能需要使长度值达到数千万或更多,然后它们才能以月为单位显示。
不过,我希望事物以屏幕单位显示(长度以像素为单位)。也许有一个错误,所以我建议提交 GitHub issue。您可能还建议(在一个单独的问题中)添加一个 属性 以使其可配置测量发生的方向(一个简单的添加,已经可用于圆半径)
最后,这看起来是一个有趣的例子。如果您可以精简到最基本的内容并进行分享,请考虑为图库或文档贡献一个示例。
我正在尝试使用 Bokeh Ray 字形来显示风向数据。我的 x 数据是日期时间(1 天分辨率)。我有一个 Pandas 数据框,其中包含日期时间索引的风向数据列(每天一个条目,范围 0-360 度)。 Ray 函数看起来应该是完美的,但是当我定义 length
时,射线段不会渲染。如果我设置length=0
(强制光线段跨越整个图window),那么渲染就成功了。
相关代码:
def make_avewindspddir_fig(df):
fig = figure(
title="Average Wind Speed & Direction",
name="avewindspddir_fig",
x_axis_type='datetime',
y_axis_label='wind speed (mph)',
width=900, height=250
)
newcds = create_avewindspddir_cds(df, 'summit', start, end)
avewinddirrays = fig.ray(x='Date', y='y_zeros', length=0,
length_units='data', angle='avewinddir', angle_units='deg',
color='black', line_width=2, source=newcds)
fig.y_range = Range1d(-20, 100)
return fig
我传递给 'create_avewindspddir_cds' 函数(创建 newcds)的 Pandas 数据帧包含日期时间索引、平均风速、最大阵风、平均风向(度)和 'y_zeros'(一列零,我用作每条射线的原点,长度与所有其他列相等)。日期范围由用户输入并定义 'start' 和 'end'.
上面的代码(以及绘制风速和阵风线的代码)产生下图。这是我布局中许多其他面板中的一个面板,所以我将只使用屏幕截图(单击以查看放大视图):
光线正确地渲染了角度数据,如果我能控制长度参数,那么情节基本上看起来很完美。这里的想法是为每一天绘制小风向矢量,显示在平均风速和最大阵风线下方(每条射线的原点为 y=0)。如果我将射线绘图代码更改为此(将 length
参数更改为 10):
avewinddirrays = fig.ray(x='Date', y='y_zeros', length=10,
length_units='data', angle='avewinddir', angle_units='deg',
color='black', line_width=2, source=newcds)
...光线根本无法绘制(而且我的终端中没有收到任何错误消息)。我试过从 0.1 到 1000 的长度值,我试过使用 'screen' 和 'data'.
的长度单位这可能是一个与我的 x 轴具有日期时间值和 y 轴具有整数相关的问题(数据中的 'length' 单位 - space 指的是 x-轴单位还是 y 轴单位?)。
作为后续问题,有没有办法在射线的一端放置箭头符号?
编辑: 回应@bigreddot.... 另一件对完成这项工作至关重要的作品: 如果使用风向数据(以度为单位的罗盘方向),必须首先旋转数据以便 Ray 正确绘制它。请注意,Ray 从水平 x 轴向上旋转角度。要转换罗盘方向,以下代码有效:
# a: 0-90
a = winddir.ix[(winddir > 0) & (winddir <= 90)]
a_rotate = (a - 90)*-1
a_rotate.name = 'a_rotate'
# b: 90-180
b = winddir.ix[(winddir > 90) & (winddir <= 180)]
b_rotate = (b - 450)*-1
b_rotate.name = 'b_rotate'
# c: 180-360
c_d = winddir.ix[(winddir > 180) & (winddir <= 360)]
c_d_rotate = 360 - c_d + 90
c_d_rotate.name = 'c_d_rotate'
# retain the nulls!
nulls = winddir[winddir.isnull()==True]
nulls.name = 'nulls'
# put it back together:
avewinddir_rotate = pd.concat([a_rotate, b_rotate, c_d_rotate, nulls])
avewinddir_rotate.sort_index(inplace=True)
此外,由于无法使用箭头,我使用圆圈实现了相同的效果:
circles = fig.circle(x='Date', y='y_zeros',size=4, line_color='black',
fill_color='white', line_width=2, source=newcds)
只需要一个符号来定位射线的一端。在这种情况下,射线围绕圆圈旋转并指示风从 到 的位置(这是风倒钩的标准)。这是我的结果图:
射线length
目前仅根据x轴刻度进行测量。在您的情况下,x 轴测量日期时间,从纪元开始以毫秒为单位表示。对于数据单元,您可能需要使长度值达到数千万或更多,然后它们才能以月为单位显示。
不过,我希望事物以屏幕单位显示(长度以像素为单位)。也许有一个错误,所以我建议提交 GitHub issue。您可能还建议(在一个单独的问题中)添加一个 属性 以使其可配置测量发生的方向(一个简单的添加,已经可用于圆半径)
最后,这看起来是一个有趣的例子。如果您可以精简到最基本的内容并进行分享,请考虑为图库或文档贡献一个示例。