相关文章推荐
痛苦的双杠  ·  python读取和保存json文件_pyth ...·  2 周前    · 
冷冷的草稿本  ·  txt文件转数组_python读取txt为数组·  2 周前    · 
体贴的松树  ·  性能测试--Jmeter随机生成/随机选取/ ...·  2 周前    · 
开朗的枕头  ·  精通 Oracle+Python,第 3 ...·  1 周前    · 
温文尔雅的青蛙  ·  python subprocess模块详解 ...·  4 天前    · 
冲动的红金鱼  ·  在Google Colab中无法解压·  1 年前    · 
踢足球的洋葱  ·  python实现腾讯文档自动打卡教程 - 简书·  1 年前    · 
一身肌肉的小虾米  ·  解决IDEA 中 Spring ...·  2 年前    · 
彷徨的桔子  ·  初次运行Android报错Connect ...·  2 年前    · 
活泼的弓箭  ·  [900]mysql字符串数字互转-腾讯云开 ...·  2 年前    · 
Code  ›  可视化实战,Python绘制出来的数据大屏真的太惊艳了!!开发者社区
python函数 可视化 大数据 python
https://cloud.tencent.com/developer/article/2230865
独立的荔枝
2 月前
用户6888863

可视化实战,Python绘制出来的数据大屏真的太惊艳了!!

腾讯云
开发者社区
文档 建议反馈 控制台
首页
学习
活动
专区
圈层
工具
MCP广场
文章/答案/技术大牛
发布
首页
学习
活动
专区
圈层
工具
MCP广场
返回腾讯云官网
用户6888863
首页
学习
活动
专区
圈层
工具
MCP广场
返回腾讯云官网
社区首页 > 专栏 > 可视化实战,Python绘制出来的数据大屏真的太惊艳了!!

可视化实战,Python绘制出来的数据大屏真的太惊艳了!!

作者头像
用户6888863
发布 于 2023-03-01 20:44:30
发布 于 2023-03-01 20:44:30
925 0 0
代码可运行
举报
文章被收录于专栏: AI篮球与生活 AI篮球与生活
运行总次数: 0
代码可运行

今天我们在进行一个 Python 数据可视化的实战练习,用到的模块叫做 Panel ,我们通过调用此模块来绘制动态可交互的图表以及数据大屏的制作,而本地需要用到的数据集,可在 kaggle 上面获取

https://www.kaggle.com/datasets/rtatman/188-million-us-wildfires

导入模块和读取数据

那么首先我们先导入后面会用到的模块,代码如下

代码语言: javascript
代码 运行次数: 0
运行
复制
# 数据库
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年美国境内发生的森林火灾的分布情况,那么这里就有涉及到火灾发生的位置,也就是经纬度坐标,由于数据集是放在 sqlite 数据库当中,因此数据集的导入也会用到 Python 当中的 sqlite3 这个模块

代码语言: javascript
代码 运行次数: 0
运行
复制
# 连接数据库
conn = sqlite3.connect('./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()

output

绘制地图

接下来我们来绘制一下全美各个地区发生火灾的次数,将历年发生的火灾都做一个汇总,代码如下

代码语言: javascript
代码 运行次数: 0
运行
复制
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

output

那么涉及到绘制地图,这里就需要依赖其他的模块了,例如 Shapely 、 Cartopy 以及 Pillow 等模块,安装起来会稍显复杂,大家可以上网去查阅一下具体的步骤,那么从上面的图表中我们可以看到加州以及佛罗里达州等地发生火灾的次数较多,颜色也就比较深。

要是我们要是想要给图表添加一个时间轴,通过拖拽时间轴来不断调整图表当中数据的变化,就可以这么来做,代码如下

代码语言: javascript
代码 运行次数: 0
运行
复制
# 绘制时间轴
year = pn.widgets.IntSlider(name='Year Slider', width=300,
                                 start=1992, end=2015, value=(1993),
                                 step=1,value_throttled=(1993))
# 显示出选中的时间
def year_selected(year):
    return '### Wildfires Across the US in {}'.format(year)
# 绘制地图
def plot_map(year_1):
    year_df = df[df['FIRE_YEAR'] == year_1].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

我们将自定义的函数结合到一起来使用,代码如下

代码语言: javascript
代码 运行次数: 0
运行
复制
dashboard = pn.WidgetBox(
    pn.Column(
    pn.Row(pn.bind(year_selected, year), year),
    pn.Row(pn.bind(plot_map, year)), align="start",
                         sizing_mode="stretch_width"))
dashboard

output

绘制柱状图

接下来我们来绘制几张简单的柱状图,首先是对不同的火灾等级进行分组统计并且绘制成柱状图,代码如下

代码语言: javascript
代码 运行次数: 0
运行
复制
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="发生在{}的森林火灾,根据不同级别来区分".format(year))
plot_class(2006)

output

当然我们也可以绘制将柱状图绘制成是水平方向的,例如我们想要探究一下不同原因造成的火灾的持续的时间有多长,代码如下

代码语言: javascript
代码 运行次数: 0
运行
复制
def plot_cause_duration(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['Cause'] = caused_df.index
    return caused_df.hvplot.barh(x='Cause', y='BURN_TIME', 
                                 c='Cause', cmap='fire_r', legend=False).opts(
                                 ylabel="Duration (Days)",
                                 title="发生在{}年由不同原因造成的森林火灾".format(year))
plot_cause_duration(2010)

output

以及我们想要看一下不同原因所造成的火灾的数量,代码如下

代码语言: javascript
代码 运行次数: 0
运行
复制
def plot_cause_occur(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['Cause'] = caused_df.index
    return caused_df.hvplot.barh(x='Cause', y='Count', 
                                 c='Cause', cmap='fire_r', 
                                 legend=False).opts(ylabel="Occurrence",
                                 title="发生在{}年由不同原因造成的森林火灾".format(year))
 
推荐文章
痛苦的双杠  ·  python读取和保存json文件_python json 保存 编码
2 周前
冷冷的草稿本  ·  txt文件转数组_python读取txt为数组
2 周前
体贴的松树  ·  性能测试--Jmeter随机生成/随机选取/csv读取关键字 - Wilson_Blogs
2 周前
开朗的枕头  ·  精通 Oracle+Python,第 3 部分:数据解析
1 周前
温文尔雅的青蛙  ·  python subprocess模块详解 - 三只松鼠
4 天前
冲动的红金鱼  ·  在Google Colab中无法解压
1 年前
踢足球的洋葱  ·  python实现腾讯文档自动打卡教程 - 简书
1 年前
一身肌肉的小虾米  ·  解决IDEA 中 Spring Boot+Jsp 项目使用插件启动的方式 Debug 失效 - 掘金
2 年前
彷徨的桔子  ·  初次运行Android报错Connect to 127.0.0.1:7890 [/127.0.0.1] failed: Connection refused (Connection refused)_BuXuTou的博客-CSDN博客
2 年前
活泼的弓箭  ·  [900]mysql字符串数字互转-腾讯云开发者社区-腾讯云
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号