Holoview--Introduction

本文的来源是holoview官网,本着学习的目的,尝试翻译下该文档,有条件的同学建议访问官网,官网链接HoloViews-Introduction

学习HoloView的初衷在于使用Bokeh去画图的时候,针对大数据(千万个点的级别),chrome已经基本没有能力渲染了,所以先切过来学习下HoloView,欢迎大家一起学习,文章末尾有交流群,欢迎加入,纯粹交流python可视化的主题

介绍

HoloView是一个用于数据分析和可视化的python开源库。那么,在已经有numpy,pandas,xarry这些数据分析,bokeh和matplotlib这些可视化的极好的开源库的条件下,为什么我们还需要另外一个库呢?

Holoview可以无缝的处理数据和图形表示,从而帮助我们更好的理解数据

HoloViews专注于将数据与适当的元数据捆绑在一起,以支持分析和可视化,使原始数据及其可视化在任何时候都具有同等的可访问性。对于那些习惯于传统数据处理和绘图工具的人来说,这个过程可能并不熟悉,本入门指南旨在从较高的层次演示它是如何工作的。用户指南中提供了关于每个主题的更详细信息。

使用HoloViews,而不是使用直接调用绘图库来构建绘图,您首先使用使其可视化所需的少量关键语义信息来描述数据,然后根据需要指定其他元数据以确定可视化的更详细方面。这种方法提供了即时、自动的可视化,随着数据的发展,可以随时轻松地请求,并由支持的绘图库(如Bokeh或Matplotlib)自动渲染。

表格数据:地铁站

我们将使用纽约地铁站的相关信息来演示HoloView的一些关键特性,首先,第一步,当然就是导入库(哈哈,人称调包侠)

import pandas as pd
import numpy as np
import holoviews as hv
from holoviews import opts
from bokeh.io import output_notebook
from bokeh.plotting import show
output_notebook() #这里是作者加的,一定要加,不然bokeh的结果不会显示在jupyterlab中,当然还要装上bokeh的插件
# 按照测试,有时使用bokeh作为渲染的时候,就是加载不出来,这时候可以尝试将文本清空,然后在命令行尝试jupyter lab clean
# 这个是我目前尝试的解决方法
hv.extension("bokeh")

hv.extension(‘bokeh’)的作用是加载bokeh作为可视化的扩展,在下一个章节中,我们将使用matplotlib作为画图的扩展,甚至我们还可以使用两者的结合作为可视化的扩展 接下来,我们来加载地铁的数据

path = r"C:\Users\samsung\AppData\Local\Programs\Python\Python38\Lib\site-packages\holoviews\examples\getting_started"
import os
os.chdir(path)
station_info = pd.read_csv('../assets/station_info.csv')
station_info.head()

在这里插入图片描述

可以看到,这个表格包含了地铁站的名字,经纬度,开启的时间,地铁出口的数量和具体信息,还有客流量

可视化要素

我们可以立即以表中的一些数据做一个散点图,作为可视化的例子

scatter = hv.Scatter(station_info, 'services', 'ridership')
scatter

在这里插入图片描述
在这里,我们往hv.Scatter传了一个dataframe,其创建了一个scatter对象,该对象独立于画图的库,只不过我们这里用了bokeh来做了可视化,Holiview提供了非常多的元素类型,在Reference Gallery.都可以看到
scatter是station_info的简单的装饰器,其知道’services’列是自变量,作为x轴,而’ridership’是因变量,作为y轴,这些就是维度的概念,接下来还会更详细的阐述
我们通过print这个Scatter对象创建的句柄scatter,我们就可以知道他真的不是一个绘图

print(scatter)

上列中的bokeh的画图只是散步的可视化,由HoloViews自动绘制,并自动显示在JupyterLab中,尽管其本身并不依赖与JupyterLab,但是却非常方便使用
Notice: 一定要加output_notebook()

合成布局

ScatterElement的一个子集,如在我们的元素库中所示,Element是HoloView中最简单的组件,现在我们掌握了scatter,我们可以演示这些文件的组成

layout = scatter + hv.Histogram(np.histogram(station_info['opened'], bins=24), kdims=['opened'])
layout

在这里插入图片描述
上述我们使用了+,我们创建了一个新的合成对象,称之为Layout,显然该布局所显示的是scatter和一个柱状图的合成,该柱状图显示了自1900年以来,曼哈顿有多少地铁站开放。需要再次强调的是,layout并不是一个plot,他是一个独立于任何画图系统的一个新的对象,如下

print(layout)

在这里插入图片描述

目前为止,我们讨论的是基于pandas DataFrame 的可视化,但是如绘图库一样,HoloView对数据格式也是不可知的;更多内容可以参考[Applying Customizations](http://holoviews.org/user_guide/Applying_Customizations.html),这意味着我们可以像处理表格一样轻松的处理数据,下面以numpy arrays 作为参考,关于纽约出租车的上下车地点。

taxi_dropoffs = {hour:arr for hour, arr in np.load('../assets/hourly_taxi_data.npz').items()}
print('Hours: {hours}'.format(hours=', '.join(taxi_dropoffs.keys())))
print('Taxi data contains {num} arrays (one per hour).\nDescription of the first array:\n'.format(num=len(taxi_dropoffs)))
np.info(taxi_dropoffs['0'])

在这里插入图片描述
可以看到,该数据集包含了24个(代表一天24个小时)出租车上下课的地点(经纬度)的数组,在2015年的一个月内的汇总

合成覆盖

同样,我们可以将数组传递到hv.Image,来创建一个Image对象,通过holoview来可视化,根据相应的经纬度范围,该对象具有被声明为“边界”的数据的空间范围。

bounds = (-74.05, 40.70, -73.90, 40.80)
image = hv.Image(taxi_dropoffs['0'], ['lon','lat'], bounds=bounds)
print(image)
image

在这里插入图片描述
在处理阵列数据(array data)时,HoloView支持numpy,xarray,dask这些类型。我们还可以将包含array data和tabular data的数据集合起来

points = hv.Points(station_info, ['lon','lat']).opts(color="red")
print(points)
image + image * points

在这里插入图片描述
在左边,是一个我们创建的image对象,在右边是一个通过*来组合的"overlay"(覆盖)的操作方式,然后左右两边通过"+"组成了一个layout。*这个特殊的覆盖就是在image上显示了points(可以改成image + points * image,对比效果,一目了然,编者注)。这里覆盖的很好是因为两者image和points都是纽约市的结果,即地理位置重叠.
"opts"这个方法其明确指出了HoloView的可视化方式
这个覆盖的效果让我们看到了在上下客位置中的地铁站的位置,当然,还可以按照自己的意愿显示更多的东西。

毫不费力的探索数据

我们可以继续组合数据结构,知道屏幕上无法容纳更多,例如以下,我们将一天中每个小时的图像组成了一个字典,用HoloView来显示。

dictionary = {int(hour):hv.Image(arr, ['lon','lat'], bounds=bounds) 
              for hour, arr in taxi_dropoffs.items()}
hv.HoloMap(dictionary, kdims='Hour')

在这里插入图片描述
如上所示,此时会自动出现一个拖曳框,非常方便的拖动显示每个小时的情况
当然,也可以通过另外一种方式来渲染
因为这个holomap其实就是一个Image的容器,我们可以通过相应的方法使其返回新的容器。例如,下面我们通过select来选择某几个小时,通过layout给展现出来

holomap.select(Hour={3,6,9}).layout()

在这里插入图片描述
这里,select方法从Hour维度选取了指定的几个值,Scatter和Image等各种元素都接受两种类型的维度,key维度和value维度,分别命名为kdims和vdims,可以作为除了直方图意外的所有元素的第二个第三个参数。如上所示,HoloMap也有一个kdims,kdims和vdims接受单个维度或维度列表,并允许您方便地表示数据所在的完整空间。

数据可视化

Holomap也能与其他元素或者Holomap组合在一起,就像两个元素组合在一起一样简单,下面是这样一些组合,我们从Points中选取一些经纬度,然后覆盖在一起

hotspot = points.select(lon=(-73.99, -73.96), lat=(40.75,40.765))
composition = holomap * hotspot

composition.opts(
    opts.Image(xrotation=90),
    opts.Points(color='red', marker='v', size=6))

在这里插入图片描述
在上面的单元格中,我们用几行短代码创建了一个复合对象并设置了其样式。此外,该复合对象将表格和数组数据联系起来,并以一种可以交互探索的方式立即呈现。这种工作方式可以实现高效的探索,从而轻松获得新的见解。例如,在使用滑块进行探索后,我们注意到早上7点有一个出租车下车的热点,我们可以选择如下:

composition.select(Hour=7)

在这里插入图片描述
我们现在可以看到,地铁位置的选择与上午7点左右出租车下车的热点有关。曼哈顿中央公园以南的这一地区包含许多著名的旅游景点,包括时代广场,我们可以推断,游客通常从地铁站乘坐出租车进入这一地区。请注意,与原始绘图一样,自定义是如何应用于此新绘图的,这是因为HoloViews允许您独立于任何特定可视化来捕获数据及其属性。

在这一点上,HoloViews似乎是关于从数据中轻松生成探索性的交互式可视化。事实上,在我们构建这些可视化的过程中,我们实际上一直在使用我们的数据,通过检查切片地铁位置的.data属性可以看出:

hotspot.data

在这里插入图片描述

我们看到,在可视化中切片HoloViews Points对象会切片底层数据,而表的结构保持不变。我们可以看到,Times Square–42nd Street 确实是我们出租车下车热点周围的地铁站之一。原始数据和易于生成的可视化数据之间的无缝交互和交换对于HoloViews如何帮助您理解数据至关重要。

保存和渲染对象

HoloViews使用各种后端渲染对象,从而可以轻松的将绘图导出为各种形式。hv.save将HoloView对象保存到文件中。例如,如果我们想将上述的合成对象保存到一个独立的html文件中,只需要运行:

hv.save(composition, 'holomap.html')

或者保存一个单独的frame

hv.save(composition.last, 'image.html')

hv.save默认通过指定的后端来保存,也可以修改比如backend=‘matplotlib’。Bokeh后端支持png输出,Matplotlib后端支持png、svg、gif或mp4,使用适当的扩展名而不是.html进行选择。在每种情况下,渲染到给定格式可能需要安装额外的库。

最后

欢迎各种牛一起加入学习探讨,关于python可视化的交流,刚新建的群,主要专注于bokeh与Holoview

可在QQ搜索群 python bokeh, 群号859297380,随时交流,互通有无

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值