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

(x,y)位置是图表上鼠标的位置,对我们的直方图不是很有帮助,因为我们要找到给定条形中对应于条形顶部的航班数量。 为了解决这个问题,我们将改变我们的 tooltip 实例以引用正确的列。 格式化提示工具中显示的数据可能令人沮丧,因此我通常在 dataframe 中使用正确的格式创建另一列。 例如,如果我希望我的提示工具显示给定栏的整个间隔,我在 dataframe 中创建一个格式化的列:

# Add a column showing the extent of each interval delays[\'f_interval\'] = [\'%d to %d minutes\' % (left, right) for left, right in zip(delays[\'left\'], delays[\'right\'])]

然后,我将此 dataframe 转换为 ColumnDataSource 并在我的 HoverTool 调用中访问此列。 下面的代码使用悬停工具创建绘图,引用两个格式化的列并将工具添加到绘图中:

# 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 with source this time p.quad(bottom=0, top=\'flights\', left=\'left\', right=\'right\', source=src, fill_color=\'red\', line_color=\'black\', fill_alpha = 0.75, hover_fill_alpha = 1.0, hover_fill_color = \'navy\') # Add a hover tool referring to the formatted columns hover = HoverTool(tooltips = [(\'Delay\', \'@f_interval\'), (\'Num of Flights\', \'@f_flights\')]) # Style the plot p = style(p) # Add the hover tool to the graph p.add_tools(hover) # Show the plot show(p)

在 Bokeh 样式中,通过将元素添加到原始图形中来包含元素。 注意在 p.quad 调用中,还有一些额外的参数,hover_fill_alpha 和 hover_fill_color,当将鼠标悬停在条形图上时会改变 glyph 的外观。 我还使用 style 函数添加了样式。 当使用样式时,我会保持简单并专注于标签的可读性。 图的主要观点是显示数据,添加不必要的元素只会减少图形的用处! 最终的图形如下:

image07-带HoverTool的直方图

当将鼠标悬停在不同的栏上时,会得到该栏的精确统计数据,显示该区间内的间隔和航班数。 如果我们为图形感到自豪,可以将其保存到html文件中进行分享:

# Import savings function from bokeh.io import output_file # Specify the output file and save output_file(\'hist.html\') show(p)

上面这张图完成了工作,但它不是很吸引人! 读者可以看到航班延误的分布接近正态分布(略有正偏斜),但他们没有理由再花费更多的时间来分析该图。

如果想要创建更具吸引力的可视化图表,我们可以允许用户通过交互自己来探索数据。 例如,在直方图中,一个有价值的特征是能够选择特定航空公司进行比较,或者选择更改 bins 的宽度以更精细地检查数据。 幸运的是,这些都是可以使用 Bokeh 在现有绘图之上添加的功能。 直方图的初始开发可能似乎涉及一个简单的绘图,但现在我们看到使用像 Bokeh 这样强大的库的回报!

在 Bokeh 中添加主动交互

Bokeh中有两类交互:被动交互和主动交互。 前面介绍的被动交互也称为检查器(inspectors),因为它们允许用户更详细地查阅图表中的信息,但不会更改显示的信息。 一个示例是当用户将鼠标悬停在数据点上时显示的提示信息,如下:

image10-被动交互

第二类交互称为主动交互,因为它会更改绘图上显示的实际数据。 这可以是从选择数据子集(例如特定航空公司)到改变多项式回归拟合自由度的任何事情。 Bokeh 中有多种类型的主动交互,但在这里我们将重点关注所谓的“小部件”(“widgets”),可以点击的元素,并让用户控制图形的某些方面。

image11-主动交互

当查看图表时,我喜欢使用主动交互,因为它们允许我自己探索数据。 我发现从我自己的数据(来自设计师的某个方向)而不是从完全静态的图表中发现数据的结论更具洞察力。 此外,为用户提供一定的自由度使他们能够略微不同的解释,从而产生有关数据集的有益讨论。

主动互动的实现方法

一旦我们开始添加主动交互,我们需要超越单行代码并进入封装特定操作的函数。 对于 Bokeh 小部件(widgets)交互,有三个主要功能要实现:

make_dataset(): 按特定格式整理要显示的特定数据

make_plot(): 使用指定的数据绘图

update(): 根据用户选择更新绘图

整理数据

在制作绘图之前,需要设计将要显示的数据。 对于交互式直方图,将为用户提供三个可控参数:

航空公司 (在代码中称为 carriers)

延迟的时间范围,比如: -60 至 +120 分钟

直方图的宽度(即 bin 大小),默认值为 5 分钟

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

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