干货: 可视化项目实战经验分享,轻松玩转 Bokeh (建议收藏) (2)

为条形图(bars)创建数据,我们将使用 Numpy 的 histogram 函数来计算每个指定 bin 中的数据点数。 我们将使用 5 分钟长度的时间间隔(bins),这意味着该功能将计算每五分钟延迟间隔的航班数量。 生成数据后,我们将其放在 Pandas 的 dataframe 中,以将所有数据保存在一个对象中。

"""Bins will be five minutes in width, so the number of bins is (length of interval / 5). Limit delays to [-60, +120] minutes using the range.""" arr_hist, edges = np.histogram(flights[\'arr_delay\'], bins = int(180/5), range = [-60, 120]) # Put the information in a dataframe delays = pd.DataFrame({\'arr_delay\': arr_hist, \'left\': edges[:-1], \'right\': edges[1:]})

数据如下:

image3-flights数据

flights 列是从 left 到 right 的每个延迟间隔内的航班数量。 从这里开始,我们可以创建一个新的 Bokeh 图形,并添加一个指定适当参数的 quad:

# Create the blank plot p = figure(plot_height = 600, plot_width = 600, title = \'Histogram of Arrival Delays\', x_axis_label = \'Delay (min)]\', y_axis_label = \'Number of Flights\') # Add a quad glyph p.quad(bottom=0, top=delays[\'flights\'], left=delays[\'left\'], right=delays[\'right\'], fill_color=\'red\', line_color=\'black\') # Show the plot show(p)

image4-Bokeh绘制直方图

从上述图表来看,我们看到到达延迟几乎正态分布,右侧有轻微的正偏斜或重尾。

当然,其实有更简单的方法可以在 Python 中创建基本直方图,比如可以使用几行 matplotlib 代码完成相同的结果。 但是,我们想在 Bokeh 图中添加直方图并进行交互演示。

增加交互性

本文介绍的第一种交互方式是被动交互。 这些是读者可以采取的不会改变所显示数据的动作。 这些被称为检查员(inspectors),因为它们允许读者更详细地 “查看” 数据。 一个有用的检查器是当用户将鼠标悬停在数据点上时出现的提示工具,在 Bokeh 中称为 HoverTool 。

image5-HoverTool

为了添加提示工具(tooltips),我们需要将数据源从 dataframe 更改为 ColumnDataSource (CDS),这是 Bokeh 中的一个关键概念。 CDS 是一个专门用于绘图的对象,包括数据以及多个方法和属性。 CDS 允许我们为图形添加注释和交互性,并且可以从pandas 的 dataframe 构建。 实际数据本身保存在可通过 CDS 的 data 属性访问的字典中。 在这里,我们从 dataframe 创建源代码,并查看数据字典中与 dataframe 列对应的键。

# Import the ColumnDataSource class from bokeh.models import ColumnDataSource # Convert dataframe to column data source src = ColumnDataSource(delays) src.data.keys() out: dict_keys([\'flights\', \'left\', \'right\', \'index\'])

当我们使用 CDS 添加 glyphs 时,我们传入 CDS 作为 source 参数并使用字符串引用列名:

# Add a quad glyph with source this time p.quad(source = src, bottom=0, top=\'flights\', left=\'left\', right=\'right\', fill_color=\'red\', line_color=\'black\')

注意代码如何通过单个字符串而不是之前的 df [\'column\'] 格式引用特定数据列,例如\'flights\',\'left\' 和 \'right\'。

Bokeh 中的 HoverTool

HoverTool 的语法起初可能看起来有些复杂,但通过练习它们很容易创建。 我们将 HoverTool 实例作为 Python 元组的 “tooltips” 列表传递,其中第一个元素是数据的标签,第二个元素引用我们想要突出显示的特定数据。 我们可以使用 $ 引用图表的任一属性,例如 x 或 y 位置,或使用 @ 引用我们数据源中的特定字段。 这可能听起来有点令人困惑,所以这里有一个 HoverTool 的例子:

# Hover tool referring to our own data field using @ and # a position on the graph using $ h = HoverTool(tooltips = [(\'Delay Interval Left \', \'@left\'), (\'(x,y)\', \'($x, $y)\')])

在这里,我们使用 @ 引用 ColumnDataSource 中的 left 数据字段(对应于原始 dataframe 的 \'left\' 列),并使用 $ 引用光标的(x,y)位置。 结果如下:

image06-HoverTool

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwgdsj.html