我试图按日期和时间想象我国空袭警报的持续时间。有一个问题我很难解决。当空气警报一天开始,第二天结束,它就填满了整个情节的一天。
例如,空气警报开始于3月2日,23:21 (晚上11:21),结束于3月3日,00:38,然后整个一天都会被填满,你可以在屏幕截图上看到。
我的代码
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。
发布于 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的行。
另一种方法是考虑不同的方式可视化相同的数据。例如,您可以只显示开始时间,然后使用标记的颜色或大小来表示持续时间:
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
)

或者一个圆的大小:
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
)

您还可以这样做,以了解哪些区域在警报器持续时间模式中是相似的:
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'),
)

https://stackoverflow.com/questions/72367402
复制相似问题