本文解说应用Panel、hvPlot等工具库,简略疾速地制作可交互的数据仪表板,对180万起野火数据进行空间可视化,更直观地对起火起因、火势大小、继续时长进行单维或多维分析。
💡 作者:韩信子@ShowMeAI
📘 数据分析实战系列:https://www.showmeai.tech/tutorials/40
📘 本文地址:https://www.showmeai.tech/article-detail/335
📢 申明:版权所有,转载请分割平台与作者并注明出处
📢 珍藏ShowMeAI查看更多精彩内容
📘Panel 是 Python 中一个十分棒的能够用作制作数据仪表板的工具库,基于它能够轻松构建数据可视化看板。
在本篇内容中,ShowMeAI 综合 Python 可视化与出现技能,应用 Panel 制作一个仪表盘看板,能够交互查看美国野火记录的信息。
💡 导入工具库
咱们本次须要用到的工具库包含数据库工具、Python 数据处理工具、可视化工具和看板工具,咱们先把这些工具库导入,代码如下:
# 数据库
import sqlite3
# 数据处理
import numpy as np
import pandas as pd
# 可视化与仪表盘
import holoviews as hv
import colorcet as cc
import panel as pn
from holoviews.element.tiles import EsriImagery
from datashader.utils import lnglat_to_meters
import hvplot.pandas
hv.extension('bokeh')
💡 数据筹备
用于本次可视化的数据集蕴含 1992 年至 2015 年间在美国产生的超过 180 万起野火。🏆美国野火数据集能够在 ShowMeAI 的百度网盘地址下载。
🏆 实战数据集下载(百度网盘):公✦众✦号『ShowMeAI钻研核心』回复『实战』,或者点击 这里 获取本文 [[28]基于Panel和hvPlot的可视化交互看板实战案例](https://www.showmeai.tech/art…) 『美国野火 FPA_FOD_20170508.sqlite 数据集』
⭐ ShowMeAI官网GitHub:https://github.com/ShowMeAI-Hub
咱们心愿构建一个数据仪表板,帮忙咱们更好地理解导致这些野火的起因、产生地点等信息。咱们导入数据并选出须要的信息,代码如下:
# 连贯数据库
conn = sqlite3.connect('../data/FPA_FOD_20170508.sqlite')
# 选取信息:经纬度、起因形容、火势大小与等级、日期、所在州、年份 等
df = pd.read_sql_query("SELECT LATITUDE, LONGITUDE, STAT_CAUSE_DESCR, FIRE_SIZE, FIRE_SIZE_CLASS, DISCOVERY_DATE, CONT_DATE, STATE, FIRE_YEAR FROM fires", conn)
# 数据中有一些不在美国的记录,删除它们
df = df.loc[(df.loc[:,'STATE']!='AK') & (df.loc[:,'STATE']!='HI') & (df.loc[:,'STATE']!='PR')]
# 计算野火持续时间
df['BURN_TIME'] = df['CONT_DATE'] - df['DISCOVERY_DATE']
# 查看数据
df.head()
💡 野火地图
咱们先把所有历史火灾绘制成热度地图,这样咱们能够直观看到空间散布。借助 📘hvPlot 能够很容易实现(它利用 Datashader 来栅格化咱们的 180 万个点,使得它们更易于渲染)。
具体的代码如下:
map_tiles = EsriImagery().opts(alpha=0.5, width=700, height=480, bgcolor='black')
plot = df.hvplot(
'LONGITUDE',
'LATITUDE',
geo=True,
kind='points',
rasterize=True,
cmap=cc.fire,
cnorm='eq_hist',
colorbar=True).opts(colorbar_position='bottom', xlabel='', ylabel='')
map_tiles * plot
简略的一组代码即可实现上述可视化后果,hvPlot 是一个十分棒的空间可视化工具库,它利用了其余 📘Holoviz 库——📘Holoviews、📘Geoviews、📘Datashader 和 📘Colorcet,所以能够极大简化创立大型数据集的交互式地图所需步骤。
💡 带工夫滑块的仪表板
Panel 的小部件让咱们能够拜访各种办法来操作和切分咱们的数据子集可视化,例如对工夫序列数据可切分:退出抉择年份的滑块。
应用 Panel 制作这种仪表板,分为3个步骤:
- ① 定义一个小部件,例如用于抉择年份或下拉列表的整数滑块。
- ② 定义一个绘图函数,将滑块中的年份值作为输出。
- ③ 布局和渲染咱们的仪表板。
# 为工夫序列构建滑动小组件
year = pn.widgets.IntSlider(name='Year Slider', width=300,
start=1992, end=2015, value=(1993),
step=1,value_throttled=(1993))
# 展现以后年份
@pn.depends(year.param.value_throttled)
def year_selected(year):
return '## Wildfires Across the US in {}'.format(year)
# 理论绘图函数
@pn.depends(year.param.value_throttled)
def plot_map(year):
year_df = df[df['FIRE_YEAR'] == year].copy()
plot = year_df.hvplot(
'LONGITUDE',
'LATITUDE',
geo=True,
kind='points',
rasterize=True,
cmap=cc.fire,
cnorm='eq_hist',
colorbar=True).opts(colorbar_position='bottom', xlabel='', ylabel='')
return map_tiles * plot
dashboard = pn.WidgetBox(pn.Column(pn.Row(year_selected, year),
pn.Row(pn.bind(plot_map, year)), align="start",
sizing_mode="stretch_width"))
💡 更简略的构建形式
当咱们的绘图只有一个小部件要显示时,有一种更简略的形式:咱们能够改为应用.interactive
制作咱们的 DataFrame 和数据管道的交互式正本。
上面咱们用一个示例来演示如何应用这个办法:这次咱们的条件是『火灾的起因』,咱们让地图只显示每个起因下的火灾。
select_cause = pn.widgets.Select(
options = df['STAT_CAUSE_DESCR'].value_counts().index.tolist(),
name = 'Cause')
# 动静交互
dfi = df.interactive
iplot = dfi[dfi['STAT_CAUSE_DESCR']==select_cause].hvplot(
'LONGITUDE',
'LATITUDE',
geo=True,
kind='points',
rasterize=True,
cmap=cc.fire,
cnorm='eq_hist',
colorbar=True).opts(colorbar_position='bottom', xlabel='', ylabel='', title='Wildfires by Cause from 1992-2015')
map_tiles.opts(level='underlay') * iplot
💡 组合仪表板
咱们能够构建更弱小的组合仪表盘,它让咱们可能同时查看数据的多个维度信息。上面咱们创立一些可视化图例,而后应用 Panel 将它们组合在一起。
💦 火势大小
咱们先绘制每个规模等级产生的火灾数量:野火按焚烧区域的大小进行分类,A 级最小,G 级最大。
@pn.depends(year.param.value_throttled)
def plot_class(year):
year_df = df[df['FIRE_YEAR'] == year].copy()
count_df = pd.DataFrame(year_df.groupby('FIRE_SIZE_CLASS').size(), columns=['Count'])
count_df['Fire Class'] = count_df.index
return count_df.hvplot.bar(x='Fire Class', y='Count', c='Fire Class', cmap='fire',
legend=False).opts(xlabel="Fire Size Class", ylabel="Number of Fires",
title="Wildfires in {} Grouped by Size Classification".format(year))
plot_class(2006)
留神到上述绘图函数将『年份』作为参数,这样它能够在滑块值更改时对数据进行子集切分和出现。拿到对应的数据子集后,咱们把它按大小分类进行分组,并应用.size()
计算每组的火灾次数。
💦 起火起因 & 继续时长
上面咱们对『起火起因和对应的继续时长』进行剖析可视化(留神,这里和下面的模块一样,也是传入年份作为参数,这样咱们最初的组合绘图,能够有对立的数据子集切分形式)。
@pn.depends(year.param.value_throttled)
def plot_cause_burn(year):
year_df = df[df['FIRE_YEAR'] == year].copy()
caused_df = pd.DataFrame(year_df.groupby('STAT_CAUSE_DESCR')[['BURN_TIME']].mean().sort_values('BURN_TIME'))
caused_df['Fire Cause'] = caused_df.index
return caused_df.hvplot.barh(x='Fire Cause', y='BURN_TIME',
c='Fire Cause', cmap='fire_r', legend=False).opts(
ylabel="Burn Time (Days)",
title="Wildfire Burn time Grouped by Cause in {}".format(year))
plot_cause_burn(2003)
💦 起火起因 & 火灾数量
上面咱们对『起火起因和对应的数量』进行剖析可视化。
@pn.depends(year.param.value_throttled)
def plot_cause_count(year):
year_df = df[df['FIRE_YEAR'] == year].copy()
caused_df = pd.DataFrame(year_df.groupby('STAT_CAUSE_DESCR').size(), columns=['Count']).sort_values('Count')
caused_df['Fire Cause'] = caused_df.index
return caused_df.hvplot.barh(x='Fire Cause', y='Count',
c='Fire Cause', cmap='fire_r',
legend=False).opts(ylabel="Number of Fires",
title="Number of Wildfires Grouped by Cause in {}".format(year))
plot_cause_count(2003)
比照上图,咱们能够看到一些乏味差别,例如:
- 吸烟带来第2焚烧时长的野火,而它在引发的野火总数中排名第9。
- 除了闪电之外,焚烧工夫最长的火灾并不是最频繁产生的火灾。
这也解释了为什么野火难以点燃,它们通常产生在更偏僻的中央,很难及早管制。闪电、吸烟和营火都有可能在这些地区引发火灾,因为那里有大量木材可焚烧,而四周很少有人在晚期发现迹象并报告烟雾。
也有一些年份看起来齐全不同,例如 2006 年,电力线故障导致大火均匀焚烧数天。如下图所示:
pn.Row(plot_cause_count(2006) , plot_cause_burn(2006), width=1000)
这里须要留神的是 Panel 和 hvPlot 如何辨认这两个子图共享雷同的 y 轴。
💦 剖析后果组装
当初咱们曾经从不同维度进行了剖析,咱们应用小部件把它们进行组合,使咱们能够沿着时间轴动静抉择和做一些数据摸索,构建组合仪表板的代码如下:
plots_box = pn.WidgetBox(pn.Column(pn.Row(pn.bind(fire_count, year), year),
pn.Row(pn.bind(plot_map, year), pn.bind(plot_class, year)) ,
pn.Row(pn.bind(plot_cause_count, year), pn.bind(plot_cause_burn, year)), align="start",
width=800, sizing_mode="stretch_width"))
dashboard = pn.Row(plots_box, sizing_mode="stretch_width")
下面只是截取的一些gif动图,大家快快实际操作一下吧!会有更清晰的意识。
💡 总结
在本篇内容中 ShowMeAI 给大家解说了应用 hvPlot 和 Panel 构建各种组合可视化看板仪表盘的办法,当咱们须要进行数据摸索和剖析的时候,简略的一些数据分析可视化用 Pandas 和 Seaborn 等就能够疾速实现,当咱们须要一个交互式摸索剖析工具时,应用hvPlot 和 Panel 是一个十分棒的抉择。
参考资料
- 📘 panel 文档:https://panel.holoviz.org/
- 📘 hvPlot 文档:https://hvplot.holoviz.org/
- 📘 holoviz 文档:https://holoviz.org/tutorial/index.html
- 📘 holoviews 文档:https://holoviews.org/gallery/index.html
- 📘 Geoviews 文档:https://geoviews.org/
- 📘 Datashader 文档:https://datashader.org/
- 📘 Colorcet 文档:https://colorcet.holoviz.org/
发表回复