社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

CDA数据分析师 • 1 年前 • 589 次点击  

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

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

导入模块和读取数据

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

# 数据库
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这个模块

# 连接数据库
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

绘制地图

接下来我们来绘制一下全美各个地区发生火灾的次数,将历年发生的火灾都做一个汇总,代码如下
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
那么涉及到绘制地图,这里就需要依赖其他的模块了,例如ShapelyCartopy以及Pillow等模块,安装起来会稍显复杂,大家可以上网去查阅一下具体的步骤,那么从上面的图表中我们可以看到加州以及佛罗里达州等地发生火灾的次数较多,颜色也就比较深。
要是我们要是想要给图表添加一个时间轴,通过拖拽时间轴来不断调整图表当中数据的变化,就可以这么来做,代码如下
# 绘制时间轴
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
我们将自定义的函数结合到一起来使用,代码如下
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

绘制柱状图

接下来我们来绘制几张简单的柱状图,首先是对不同的火灾等级进行分组统计并且绘制成柱状图,代码如下
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
当然我们也可以绘制将柱状图绘制成是水平方向的,例如我们想要探究一下不同原因造成的火灾的持续的时间有多长,代码如下
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
以及我们想要看一下不同原因所造成的火灾的数量,代码如下
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))
plot_cause_occur(2010)
output

可视化大屏的制作

最后我们将上面绘制出来的图标拼凑到一起,做成可视化大屏,代码如下
plots_box = pn.WidgetBox(pn.Column(pn.Row(pn.bind(year_selected, year), year),
                                   pn.Row(pn.bind(plot_map, year), pn.bind(plot_class, year)) ,
                                   pn.Row(pn.bind(plot_cause_occur, year), pn.bind(plot_cause_duration, year)), align="start",
                                   width=800, sizing_mode="stretch_width"))
dashboard = pn.Row(plots_box, sizing_mode="stretch_width")
dashboard
output


了解更多数据分析知识、与更多优秀的人一起进群交流请扫码


群码过期或者群满请添加客服微信 CDAshujufenxi 后拉您进群


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/166027
 
589 次点击