Skip to content

Commit 9587c25

Browse files
Merge pull request #164 from nickcanz/set_max_y_axis
Add option to set a max y-axis value
2 parents 2b731f0 + 45c782b commit 9587c25

File tree

3 files changed

+60
-12
lines changed

3 files changed

+60
-12
lines changed

app.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,22 +73,22 @@
7373
st.subheader("New Admissions")
7474
st.markdown("Projected number of **daily** COVID-19 admissions at Penn hospitals")
7575
st.altair_chart(
76-
new_admissions_chart(alt, projection_admits, p.n_days - 10, as_date=as_date), use_container_width=True
76+
new_admissions_chart(alt, projection_admits, p.n_days - 10, as_date=as_date, max_y_axis=p.max_y_axis), use_container_width=True
7777
)
7878
if st.checkbox("Show Projected Admissions in tabular form"):
7979
draw_projected_admissions_table(st, projection_admits, as_date=as_date)
8080
st.subheader("Admitted Patients (Census)")
8181
st.markdown(
8282
"Projected **census** of COVID-19 patients, accounting for arrivals and discharges at Penn hospitals"
8383
)
84-
st.altair_chart(admitted_patients_chart(alt, census_df, p.n_days - 10, as_date=as_date), use_container_width=True)
84+
st.altair_chart(admitted_patients_chart(alt, census_df, p.n_days - 10, as_date=as_date, max_y_axis=p.max_y_axis), use_container_width=True)
8585
if st.checkbox("Show Projected Census in tabular form"):
8686
draw_census_table(st, census_df, as_date=as_date)
8787
st.markdown(
8888
"""**Click the checkbox below to view additional data generated by this simulation**"""
8989
)
9090
if st.checkbox("Show Additional Projections"):
91-
show_additional_projections(st, alt, additional_projections_chart, p.infected_v, p.recovered_v, as_date=as_date)
91+
show_additional_projections(st, alt, additional_projections_chart, p.infected_v, p.recovered_v, as_date=as_date, max_y_axis=p.max_y_axis)
9292
if st.checkbox("Show Raw SIR Simulation Data"):
9393
draw_raw_sir_simulation_table(st, p.n_days, p.susceptible_v, p.infected_v, p.recovered_v, as_date=as_date)
9494
write_definitions(st)

penn_chime/models.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ def __init__(
2121
hospitalized: RateLos,
2222
icu: RateLos,
2323
ventilated: RateLos,
24+
25+
max_y_axis: int
2426
):
2527
self.current_hospitalized = current_hospitalized
2628
self.doubling_time = doubling_time
@@ -34,6 +36,8 @@ def __init__(
3436
self.icu = icu
3537
self.ventilated = ventilated
3638

39+
self.max_y_axis = max_y_axis
40+
3741
self.rates = tuple(
3842
each.rate
3943
for each in (hospitalized, icu, ventilated)

penn_chime/presentation.py

Lines changed: 53 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,16 @@ def display_sidebar(st, d: Constants) -> Parameters:
211211
format="%i",
212212
)
213213

214+
max_y_axis_set = st.sidebar.checkbox("Set the Y-axis on graphs to a static value")
215+
max_y_axis = None
216+
if max_y_axis_set:
217+
max_y_axis = st.sidebar.number_input(
218+
"Y-axis static value",
219+
value=500,
220+
format="%i",
221+
step=25,
222+
)
223+
214224
return Parameters(
215225
current_hospitalized=current_hospitalized,
216226
doubling_time=doubling_time,
@@ -221,7 +231,8 @@ def display_sidebar(st, d: Constants) -> Parameters:
221231

222232
hospitalized=RateLos(hospitalized_rate, hospitalized_los),
223233
icu=RateLos(icu_rate, icu_los),
224-
ventilated=RateLos(ventilated_rate, ventilated_los)
234+
ventilated=RateLos(ventilated_rate, ventilated_los),
235+
max_y_axis=max_y_axis
225236
)
226237

227238

@@ -375,12 +386,23 @@ def write_footer(st):
375386

376387

377388
def new_admissions_chart(
378-
alt, projection_admits: pd.DataFrame, plot_projection_days: int, as_date: bool = False
389+
alt,
390+
projection_admits: pd.DataFrame,
391+
plot_projection_days: int,
392+
as_date: bool = False,
393+
max_y_axis: int = None
379394
) -> alt.Chart:
380395
"""docstring"""
381396
projection_admits = projection_admits.rename(
382397
columns={"hosp": "Hospitalized", "icu": "ICU", "vent": "Ventilated"}
383398
)
399+
400+
y_scale = alt.Scale()
401+
402+
if max_y_axis is not None:
403+
y_scale.domain = (0, max_y_axis)
404+
y_scale.clamp = True
405+
384406
tooltip_dict = {False: "day", True: "date:T"}
385407
if as_date:
386408
projection_admits = add_date_column(projection_admits)
@@ -394,7 +416,7 @@ def new_admissions_chart(
394416
.mark_line(point=True)
395417
.encode(
396418
x=alt.X(**x_kwargs),
397-
y=alt.Y("value:Q", title="Daily admissions"),
419+
y=alt.Y("value:Q", title="Daily admissions", scale=y_scale),
398420
color="key:N",
399421
tooltip=[
400422
tooltip_dict[as_date],
@@ -410,7 +432,8 @@ def admitted_patients_chart(
410432
alt,
411433
census: pd.DataFrame,
412434
plot_projection_days: int,
413-
as_date: bool = False
435+
as_date: bool = False,
436+
max_y_axis: int = None
414437
) -> alt.Chart:
415438
"""docstring"""
416439
census = census.rename(
@@ -427,13 +450,19 @@ def admitted_patients_chart(
427450
else:
428451
x_kwargs ={"shorthand": "day", "title": "Days from today"}
429452

453+
y_scale = alt.Scale()
454+
455+
if max_y_axis is not None:
456+
y_scale.domain = (0, max_y_axis)
457+
y_scale.clamp = True
458+
430459
return (
431460
alt.Chart(census.head(plot_projection_days))
432461
.transform_fold(fold=["Hospital Census", "ICU Census", "Ventilated Census"])
433462
.mark_line(point=True)
434463
.encode(
435464
x=alt.X(**x_kwargs),
436-
y=alt.Y("value:Q", title="Census"),
465+
y=alt.Y("value:Q", title="Census", scale=y_scale),
437466
color="key:N",
438467
tooltip=[
439468
tooltip_dict[as_date],
@@ -449,7 +478,8 @@ def additional_projections_chart(
449478
alt,
450479
i: np.ndarray,
451480
r: np.ndarray,
452-
as_date: bool = False
481+
as_date: bool = False,
482+
max_y_axis: int = None
453483
) -> alt.Chart:
454484
dat = pd.DataFrame({"Infected": i, "Recovered": r})
455485
dat["day"] = dat.index
@@ -459,26 +489,40 @@ def additional_projections_chart(
459489
else:
460490
x_kwargs = {"shorthand": "day", "title": "Days from today"}
461491

492+
y_scale = alt.Scale()
493+
494+
if max_y_axis is not None:
495+
y_scale.domain = (0, max_y_axis)
496+
y_scale.clamp = True
497+
462498
return (
463499
alt.Chart(dat)
464500
.transform_fold(fold=["Infected", "Recovered"])
465501
.mark_line()
466502
.encode(
467503
x=alt.X(**x_kwargs),
468-
y=alt.Y("value:Q", title="Case Volume"),
504+
y=alt.Y("value:Q", title="Case Volume", scale=y_scale),
469505
tooltip=["key:N", "value:Q"],
470506
color="key:N",
471507
)
472508
.interactive()
473509
)
474510

475511

476-
def show_additional_projections(st, alt, charting_func, i, r, as_date: bool = False):
512+
def show_additional_projections(
513+
st,
514+
alt,
515+
charting_func,
516+
i,
517+
r,
518+
as_date: bool = False,
519+
max_y_axis: int = None
520+
):
477521
st.subheader(
478522
"The number of infected and recovered individuals in the hospital catchment region at any given moment"
479523
)
480524

481-
st.altair_chart(charting_func(alt, i, r, as_date=as_date), use_container_width=True)
525+
st.altair_chart(charting_func(alt, i, r, as_date=as_date, max_y_axis=max_y_axis), use_container_width=True)
482526

483527

484528
##########

0 commit comments

Comments
 (0)