【问题标题】:Bokeh Ray glyph not displaying when length defined定义长度时不显示散景光线字形
【发布时间】:2017-08-27 02:00:14
【问题描述】:

我正在尝试使用 Bokeh Ray 字形来显示风向数据。我的 x 数据是日期时间(以 1 天为分辨率)。我有一个 Pandas 数据框,其中包含一个日期时间索引的风向数据列(每天一个条目,范围为 0-360 度)。 Ray 函数看起来应该很完美,但是当我定义 length 时,光线段不会渲染。如果我设置length=0(强制光线段跨越整个绘图窗口),则渲染成功。

相关代码:

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”(一列零我用作每条射线的原点,长度与所有其他列相等)。日期范围由用户输入并定义“开始”和“结束”。

上面的代码(连同绘制风速和阵风线的代码)生成下图。这是我布局中许多其他面板中的一个面板,因此我将仅使用屏幕截图(单击以查看放大视图):

光线正确地渲染了角度数据,如果我可以控制长度参数,那么绘图基本上看起来很完美。这里的想法是绘制每天的小风向矢量,显示在平均风速和最大阵风线下方(每条射线的原点为 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 的长度值,并且我尝试过使用“屏幕”和“数据”的长度单位。

这可能是与我的 x 轴的日期时间值和我的 y 轴的整数有关的问题(数据空间中的“长度”单位是指 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)

只需要一个符号来定位光线的一端。在这种情况下,光线围绕圆圈旋转并指示风的来源来自(这是风倒钩的标准)。这是我的结果图:

【问题讨论】:

    标签: python pandas bokeh


    【解决方案1】:

    Ray length 目前仅根据 x 轴刻度进行测量。在您的情况下,x 轴正在测量日期时间,以自纪元以​​来的毫秒数表示。对于数据单元,您可能需要将长度值设置为数千万或更多,然后才能以月为单位显示。

    不过,我希望事情会以屏幕单位显示(长度以像素为单位)。也许有一个错误,所以我建议提交GitHub issue。您可能还建议(在单独的问题中)添加一个属性以使其可配置测量发生的方向(一个简单的添加,已经可用于圆半径)

    最后,这看起来是一个有趣的例子。如果您可以减少基本知识并分享,请考虑为图库或文档提供示例。

    【讨论】:

    • 是的,使用毫秒 (length=7.9e7) 为光线提供了在绘图上可见的长度。谢谢!然而,屏幕单元似乎没有渲染。也许这与我的多面板布局有关,并且可能是一个错误。你知道是否可以用箭头结束射线段吗?我在文档中没有看到这个选项。
    • 看起来箭头注释 (bokeh.pydata.org/en/latest/docs/user_guide/…) 是我想要的,但它需要起点和终点的 (x,y) 坐标。我可以为我的向量计算出这一点(尽管对日期时间轴具有挑战性),但是使用 Ray 字形并直接使用我的角度数据会很棒。是否有将箭头注释附加到射线字形?
    • 目前没有任何方法可以为射线添加箭头,Arrow 目前也没有“矢量化”,这意味着你必须为每个你想要的箭头添加一个箭头显示。对于图像中显示的数字,这将是非常低效的。我建议在 GitHub 上提出功能请求问题以提出改进建议。
    • 查看我上面关于旋转所需的一些调整的编辑,以及使用圆圈而不是箭头的解决方案。我可能会跟进有关您提到的其他一些项目的 Github 问题。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-17
    • 2018-10-24
    • 1970-01-01
    相关资源
    最近更新 更多