首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >图中空袭警报持续时间的可视化问题

图中空袭警报持续时间的可视化问题
EN

Stack Overflow用户
提问于 2022-05-24 17:56:25
回答 1查看 43关注 0票数 2

我试图按日期和时间想象我国空袭警报的持续时间。有一个问题我很难解决。当空气警报一天开始,第二天结束,它就填满了整个情节的一天。

例如,空气警报开始于3月2日,23:21 (晚上11:21),结束于3月3日,00:38,然后整个一天都会被填满,你可以在屏幕截图上看到。

我的代码

代码语言:javascript
复制
    alt.data_transformers.disable_max_rows()
    
    dropdown = alt.binding_select(options=df.region.unique(), name='Select Region')
    select_region = alt.selection_single(empty='none', bind=dropdown, fields=['region'], init={'region':'Київ'})
    
    layer1 = alt.Chart(df).mark_rect().encode(
        y=alt.Y('hours(siren_start_at):O', title='hour of day'
                ,axis=alt.Axis(format='%H:%M', grid=True)
                ,scale=alt.Scale(reverse=True)
                ),
        y2=alt.Y2('hours(siren_end_at):O'),
        x=alt.X('monthdate(siren_start_at):O', title='date', axis = alt.Axis(grid=True)),
        tooltip = [
                   alt.Tooltip('monthdate(siren_start_date):O', title='siren started date')
                   ,alt.Tooltip('hoursminutes(siren_start_at):O', title='siren started at')
                   ,alt.Tooltip('monthdate(siren_end_date):O', title='siren end date')
                   ,alt.Tooltip('hoursminutes(siren_end_at):O', title='siren ended at')
                   ,alt.Tooltip('duration:Q', title='siren duration (min)')
        ]
    ).add_selection(select_region).transform_filter(select_region) 
    
    layer2 = alt.Chart(df).mark_rect().encode(
        x=alt.X('monthdate(siren_start_at):O', title='date', axis = alt.Axis(orient='top', grid=True))
        ,y=alt.Y('hours(siren_start_at):O', title='hour of day'
                ,axis=alt.Axis(format='%H:%M', grid=True)
                ,scale=alt.Scale(reverse=True)
                )
        ,y2=alt.Y2('hours(siren_end_at):O')    
    ).transform_filter(select_region) 
    
    alt.layer(layer1, layer2).resolve_scale(
        x = 'independent'
    )

我的数据帧存储在这里,https://github.com/GendolfJunior/UA_air_sirens

完整的数据集在这里可用,https://github.com/Vadimkin/ukrainian-air-raid-sirens-dataset。归功于@Vadimkin。

EN

回答 1

Stack Overflow用户

发布于 2022-05-31 15:47:48

由于您只使用y轴上的时间,所以牛郎星无法知道第二天的00:00是在23:00之后,它将在同一天在0到23之间绘制矩形。我不认为有一个更优雅的方法来编写一个函数,将跨越午夜的所有日期分割成两个单独的条目,一个以23:59结束,另一个从第二天的00:00开始。相关行将是匹配条件(pd.to_datetime(df['siren_start_at']).dt.day - pd.to_datetime(df['siren_end_at']).dt.day) != 0的行。

另一种方法是考虑不同的方式可视化相同的数据。例如,您可以只显示开始时间,然后使用标记的颜色或大小来表示持续时间:

代码语言:javascript
复制
dropdown = alt.binding_select(options=df.region.unique(), name='Select Region ')
select_region = alt.selection_single(empty='none', bind=dropdown, fields=['region'], init={'region':'Київ'})

alt.Chart(df).mark_rect().encode(
    y=alt.Y(
        'hours(siren_start_at):T',
        title='Start hour of day',
        axis=alt.Axis(format='%H:%M', grid=True),
        scale=alt.Scale(reverse=True),
    ),
    color='duration',
    x=alt.X('monthdate(siren_start_at):O', title='', axis=alt.Axis(grid=True)),
    tooltip = [
        alt.Tooltip('monthdate(siren_start_date):O', title='siren started date'),
        alt.Tooltip('hoursminutes(siren_start_at):O', title='siren started at'),
        alt.Tooltip('monthdate(siren_end_date):O', title='siren end date'),
        alt.Tooltip('hoursminutes(siren_end_at):O', title='siren ended at'),
        alt.Tooltip('duration:Q', title='siren duration (min)'),
    ]
).add_selection(
    select_region
).transform_filter(
    select_region
)

或者一个圆的大小:

代码语言:javascript
复制
dropdown = alt.binding_select(options=df.region.unique(), name='Select Region ')
select_region = alt.selection_single(empty='none', bind=dropdown, fields=['region'], init={'region':'Київ'})

alt.Chart(df, width=800).mark_circle().encode(
    y=alt.Y(
        'hours(siren_start_at):T',
        title='Start hour of day',
        axis=alt.Axis(format='%H:%M', grid=True),
        scale=alt.Scale(reverse=True),
    ),
    size='duration',
    x=alt.X('monthdate(siren_start_at):T', title='', axis=alt.Axis(grid=True)),
    tooltip = [
        alt.Tooltip('monthdate(siren_start_date):O', title='siren started date'),
        alt.Tooltip('hoursminutes(siren_start_at):O', title='siren started at'),
        alt.Tooltip('monthdate(siren_end_date):O', title='siren end date'),
        alt.Tooltip('hoursminutes(siren_end_at):O', title='siren ended at'),
        alt.Tooltip('duration:Q', title='siren duration (min)'),
    ]
).add_selection(
    select_region
).transform_filter(
    select_region
)

您还可以这样做,以了解哪些区域在警报器持续时间模式中是相似的:

代码语言:javascript
复制
alt.Chart(df, width=1800).mark_rect().encode(
    y=alt.Y('region', sort=df.groupby('region')['duration'].sum().sort_values(ascending=False).index.to_list()),
    tooltip = [
               alt.Tooltip('monthdate(siren_start_date):O', title='siren started date')
               ,alt.Tooltip('hoursminutes(siren_start_at):O', title='siren started at')
               ,alt.Tooltip('monthdate(siren_end_date):O', title='siren end date')
               ,alt.Tooltip('hoursminutes(siren_end_at):O', title='siren ended at')
               ,alt.Tooltip('duration:Q', title='siren duration (min)')
    ],
    x=alt.X('siren_start_at:T', title='date', axis = alt.Axis(grid=True)),
    x2=alt.X2('siren_end_at:T'),
)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72367402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档