长度定义

时间:2017-08-27 02:00:15

标签: python pandas bokeh

我正在尝试使用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

我将Pandas数据传递给' create_avewindspddir_cds' function(创建newcds)包含日期时间索引,平均风速,最大阵风,ave风向(度)和' y_zeros' (一列零,我用作每条光线的原点,长度等于所有其他列)。日期范围由用户输入并定义“开始”'并且'结束'。

上面的代码(以及用于绘制风速和阵风线的代码)产生下图。这是我布局中许多其他面板中的单个面板,因此我将使用屏幕截图(单击缩放视图): enter image description here

光线正确渲染角度数据,如果我可以控制长度参数,则图表基本上看起来很完美。这里的想法是为每天绘制小的风向矢量图,显示低于平均风速和最大阵风线(每条光线起源于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)

所需要的只是一个指向Ray一端的符号。在这种情况下,Ray围绕圆圈旋转并指示风来自 <(风帆倒钩的标准配置)。这是我的结果:

enter image description here

1 个答案:

答案 0 :(得分:1)

Ray length目前仅根据x轴刻度进行测量。在您的情况下,x轴是测量日期时间,以纪元为单位以毫秒表示。对于数据单元,您可能需要使长度值在数月之内变得可见之前达到数千万或更多。

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

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