干货推荐 | 掌握这几点,轻松玩转 Bokeh 可视化 (项目实战经验分享)

作者 | Will Koehrsen

翻译 | Lemon

译文出品 | Python数据之道 (ID:PyDataRoad)

本文通过一个项目案例,详细的介绍了如何从 Bokeh 基础到构建 Bokeh 交互式应用程序的过程,内容循序渐进且具有很高的实用性。本文共有两万字左右,属于纯干货分享,强烈推荐大家阅读后续内容。

如果觉得内容不错,欢迎关注『Python数据之道』并将内容分享到您的朋友圈。

本文由以下几个大的部分组成:

  1. Bokeh 基础介绍
  2. 在 Bokeh 中添加主动交互功能
  3. 在 Bokeh 中创建交互式可视化应用程序

Tips:

本文源代码地址,可以在公众号『Python数据之道』后台回复 “code” 来获取。

关于 Bokeh 基础的详细介绍,可以参考以下内容:

可用于数据科学的资源正在迅速发展,这在可视化领域尤其明显,似乎每周都有另一种选择。 随着所有这些进步,有一个共同的趋势:增加交互性。 人们喜欢在静态图中查看数据,但他们更喜欢的是使用数据来查看更改参数如何影响结果。 关于我的研究,一份报告告诉建筑物所有者他们可以通过改变他们的空调(AC)使用计划表节省多少电力是很好的,但是给他们一个交互式图表更有效,他们可以选择不同的使用计划表,看看他们的选择如何影响用电量。 最近,受到互动图的趋势和不断学习新工具的渴望的启发,我一直在使用 Bokeh,一个 Python 库。 我为我的研究项目构建的仪表板中显示了 Bokeh 交互功能的一个示例,如下:

image1-能耗项目示例

虽然我不能分享这个项目背后的代码,但我可以通过一个使用公开数据构建完全交互式 Bokeh 应用程序的例子。 本文将介绍使用 Bokeh 创建应用程序的整个过程。 首先,我们将介绍 Bokeh 的基础内容, 我们将使用 nycflights13 数据集,该数据集记录了 2013年超过 300,000 个航班。首先,我们将专注于可视化单个变量,在这种情况下,航班的到达延迟时间为几分钟,我们将从构造基本直方图开始。

Bokeh 基础

Bokeh 的主要概念是图形一次构建一层。 我们首先创建一个图形(figure),然后在图形中添加称为 图形符号(glyphs) 的元素。 glyphs 可以根据所需的用途呈现多种形状:圆形(circles),线条(lines) ,补丁(patches),条形(bars),弧形(arcs)等。 让我们通过制作带有正方形和圆形的基本图表来说明 glyphs 的概念。 首先,我们使用 figure 方法创建一个图,然后通过调用适当的方法并传入数据将我们的 glyphs 附加到 figure 中。 最后,我们展示了所做的图表。

# bokeh basics
from bokeh.plotting import figure
from bokeh.io import show, output_notebook

# Create a blank figure with labels
p = figure(plot_width = 600, plot_height = 600,
           title = 'Example Glyphs',
           x_axis_label = 'X', y_axis_label = 'Y')

# Example data
squares_x = [1, 3, 4, 5, 8]
squares_y = [8, 7, 3, 1, 10]
circles_x = [9, 12, 4, 3, 15]
circles_y = [8, 4, 11, 6, 10]

# Add squares glyph
p.square(squares_x, squares_y, size = 12, color = 'navy', alpha = 0.6)
# Add circle glyph
p.circle(circles_x, circles_y, size = 12, color = 'red')

# Set to output the plot in the notebook
output_notebook()
# Show the plot
show(p)

图示如下:

image2-Bokeh基础图

现在让我们开始展示航班延误数据,在进入图表之前,应该加载数据并对其进行简要检查:

# Read the data from a csv into a dataframe
flights = pd.read_csv('../data/flights.csv', index_col=0)
# Summary stats for the column of interest
flights['arr_delay'].describe()

out[]:
count    327346.000000
mean          6.895377
std          44.633292
min         -86.000000
25%         -17.000000
50%          -5.000000
75%          14.000000
max        1272.000000

上述统计数据提供了可以用来决策的信息:共有 327,346 次航班,最短延误时间为-86 分钟(意味着航班提前 86 分钟),最长延迟时间为 1272 分钟,惊人的 21 小时! 75% 的分位数仅在 14 分钟,因此我们可以假设超过 1000 分钟的数字可能是异常值(这并不意味着它们是非法的,只是极端的)。 下面将重点关注直方图的 -60 分钟到 +120 分钟之间的延迟。

直方图是单个变量的初始可视化的常见选择,因为它显示了数据的分布。 x 位置是被称为区间(bins)的变量的值,并且每个柱子的高度表示每个区间中的数据点的计数(数量)。 在我们的例子中,x 位置将代表以分钟为单位的到达延迟,高度是相应 bin 中的航班数量。 Bokeh 没有内置的直方图,但是我们可以使用 quad 来制作我们自己的直方图。

为条形图(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 列是从 leftright 的每个延迟间隔内的航班数量。 从这里开始,我们可以创建一个新的 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),因为它们允许读者更详细地 “

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值