Skip to content

Commit 42cc485

Browse files
committed
Factor out shaping and shifting functionality as seperate functions.
1 parent 67f3676 commit 42cc485

File tree

1 file changed

+112
-133
lines changed

1 file changed

+112
-133
lines changed

R-packages/covidcast/R/plot.R

Lines changed: 112 additions & 133 deletions
Original file line numberDiff line numberDiff line change
@@ -252,60 +252,38 @@ plot_choro = function(x, time_value = NULL, include = c(), range,
252252
val = df$val
253253
geo = df$geo
254254
names(val) = geo
255-
255+
256256
# Make background layer for MSA and HRR maps which are incomplete
257257
if ((attributes(x)$metadata$geo_type == "msa") ||
258258
(attributes(x)$metadata$geo_type == "hrr")) {
259259
map_df = sf::st_read(system.file(
260-
"shapefiles/state",
261-
"cb_2019_us_state_5m.shp",
262-
package = "covidcast"))
260+
"shapefiles/state/cb_2019_us_state_5m.shp",
261+
package = "covidcast"))
263262
background_crs = sf::st_crs(map_df)
264263
map_df$STATEFP <- as.character(map_df$STATEFP)
265-
map_df$is_alaska = map_df$STATEFP == '02'
266-
map_df$is_hawaii = map_df$STATEFP == '15'
267-
map_df$is_pr = map_df$STATEFP == '72'
268-
map_df$STATEFP <- as.numeric(map_df$STATEFP)
269-
map_df$is_state = map_df$STATEFP < 57
270-
map_df$color = missing_col
271-
272-
pr_df = map_df %>% filter(.$is_pr)
273-
hawaii_df = map_df %>% filter(.$is_hawaii)
274-
alaska_df = map_df %>% filter(.$is_alaska)
275-
276-
main_df = map_df %>% filter(!map_df$is_alaska)
277-
main_df = main_df %>% filter(!main_df$is_hawaii)
278-
main_df = main_df %>% filter(main_df$is_state)
279-
280-
main_df = sf::st_transform(main_df, 102003)
281-
hawaii_df = sf::st_transform(hawaii_df, 102007)
282-
alaska_df = sf::st_transform(alaska_df, 102006)
283-
pr_df = sf::st_transform(pr_df, 102003)
284-
285-
hawaii_shift = sf::st_geometry(hawaii_df) + c(-1e+6, -2e+6)
286-
hawaii_df = sf::st_set_geometry(hawaii_df, hawaii_shift)
287-
hawaii_df = sf::st_set_crs(hawaii_df, 102003)
288-
289-
alaska_centroid = sf::st_centroid(sf::st_geometry(alaska_df))
290-
alaska_scale = (sf::st_geometry(alaska_df) - alaska_centroid) * 0.35 + alaska_centroid
291-
alaska_df = sf::st_set_geometry(alaska_df, alaska_scale)
292-
alaska_shift = sf::st_geometry(alaska_df) + c(-2e+6, -2.6e+6)
293-
alaska_df = sf::st_set_geometry(alaska_df, alaska_shift)
294-
alaska_df = sf::st_set_crs(alaska_df, 102003)
295-
296-
pr_shift = sf::st_geometry(pr_df) + c(-0.9e+6, 1e+6)
297-
pr_df = sf::st_set_geometry(pr_df, pr_shift)
298-
r = -16 * pi / 180
299-
rotation = matrix(c(cos(r), sin(r), -sin(r), cos(r)), nrow = 2, ncol = 2)
300-
pr_centroid = sf::st_centroid(sf::st_geometry(pr_df))
301-
pr_rotate = (sf::st_geometry(pr_df) - pr_centroid) * rotation + pr_centroid
302-
pr_df = sf::st_set_geometry(pr_df, pr_rotate)
303-
pr_df = sf::st_set_crs(pr_df, 102003)
264+
map_df = map_df %>% dplyr::mutate(
265+
is_alaska = STATEFP == '02',
266+
is_hawaii = STATEFP == '15',
267+
is_pr = STATEFP == '72',
268+
is_state = as.numeric(STATEFP) < 57,
269+
color = missing_col)
270+
271+
# For alaska and pr, set centroids here so same centroid is
272+
# used for every map layer.
273+
alaska_centroid = get_alaska_centroid(map_df)
274+
pr_centroid = get_pr_centroid(map_df)
275+
276+
# Need to filter out territories such as Guam, American Samoa, etc.
277+
main_df = map_df %>% dplyr::filter(.$is_state) %>% shift_main(.)
278+
279+
hawaii_df = shift_hawaii(map_df)
280+
alaska_df = shift_alaska(map_df, alaska_centroid)
281+
pr_df = shift_pr(map_df, pr_centroid)
304282

305283
main_col = main_df$color
306284
hawaii_col = hawaii_df$color
307285
alaska_col = alaska_df$color
308-
pr_col = pr_df$color
286+
pr_col = pr_df$color
309287

310288
aes = ggplot2::aes
311289
geom_args = list()
@@ -363,52 +341,23 @@ plot_choro = function(x, time_value = NULL, include = c(), range,
363341

364342
else if (attributes(x)$metadata$geo_type == "msa") {
365343
map_df = sf::st_read(system.file(
366-
"shapefiles/msa",
367-
"cb_2019_us_cbsa_5m.shp",
368-
package = "covidcast"))
369-
map_df = map_df %>% filter(map_df$LSAD == 'M1') # only get metro and not micropolitan areas
344+
"shapefiles/msa/cb_2019_us_cbsa_5m.shp",
345+
package = "covidcast"))
346+
map_df = map_df %>% dplyr::filter(map_df$LSAD == 'M1') # only get metro and not micropolitan areas
370347
if (length(include) > 0) {
371-
map_df = map_df %>% filter(map_df$GEOID %in% include)
348+
map_df = map_df %>% dplyr::filter(map_df$GEOID %in% include)
372349
}
373350
map_df$NAME <- as.character(map_df$NAME)
374-
map_df$is_alaska = substr(map_df$NAME, nchar(map_df$NAME) - 1, nchar(map_df$NAME)) == 'AK'
375-
map_df$is_hawaii = substr(map_df$NAME, nchar(map_df$NAME) - 1, nchar(map_df$NAME)) == 'HI'
376-
map_df$is_pr = substr(map_df$NAME, nchar(map_df$NAME) - 1, nchar(map_df$NAME)) == 'PR'
377-
map_df$color = ifelse(map_df$GEOID %in% geo,
378-
col_fun(val[map_df$GEOID]),
379-
missing_col)
380-
381-
pr_df = map_df %>% filter(map_df$is_pr)
382-
hawaii_df = map_df %>% filter(map_df$is_hawaii)
383-
alaska_df = map_df %>% filter(map_df$is_alaska)
384-
main_df = map_df %>% filter(!map_df$is_alaska)
385-
main_df = main_df %>% filter(!main_df$is_hawaii)
386-
main_df = main_df %>% filter(!main_df$is_pr)
387-
388-
main_df = sf::st_transform(main_df, 102003)
389-
hawaii_df = sf::st_transform(hawaii_df, 102007)
390-
alaska_df = sf::st_transform(alaska_df, 102006)
391-
pr_df = sf::st_transform(pr_df, 102003)
392-
393-
hawaii_shift = sf::st_geometry(hawaii_df) + c(-1e+6, -2e+6)
394-
hawaii_df = sf::st_set_geometry(hawaii_df, hawaii_shift)
395-
hawaii_df = sf::st_set_crs(hawaii_df, 102003)
396-
397-
# Note centroid is centroid for entire state (defined for background)
398-
alaska_scale = (sf::st_geometry(alaska_df) - alaska_centroid) * 0.35 + alaska_centroid
399-
alaska_df = sf::st_set_geometry(alaska_df, alaska_scale)
400-
alaska_shift = sf::st_geometry(alaska_df) + c(-2e+6, -2.6e+6)
401-
alaska_df = sf::st_set_geometry(alaska_df, alaska_shift)
402-
alaska_df = sf::st_set_crs(alaska_df, 102003)
403-
404-
pr_shift = sf::st_geometry(pr_df) + c(-0.9e+6, 1e+6)
405-
pr_df = sf::st_set_geometry(pr_df, pr_shift)
406-
r = -16 * pi / 180
407-
rotation = matrix(c(cos(r), sin(r), -sin(r), cos(r)), nrow = 2, ncol = 2)
408-
# Note centroid is same as for entire territory (defined for background)
409-
pr_rotate = (sf::st_geometry(pr_df) - pr_centroid) * rotation + pr_centroid
410-
pr_df = sf::st_set_geometry(pr_df, pr_rotate)
411-
pr_df = sf::st_set_crs(pr_df, 102003)
351+
map_df = map_df %>% dplyr::mutate(
352+
is_alaska = substr(NAME, nchar(NAME) - 1, nchar(NAME)) == 'AK',
353+
is_hawaii = substr(NAME, nchar(NAME) - 1, nchar(NAME)) == 'HI',
354+
is_pr = substr(NAME, nchar(NAME) - 1, nchar(NAME)) == 'PR',
355+
color = ifelse(GEOID %in% geo, col_fun(val[GEOID]), missing_col))
356+
357+
main_df = shift_main(map_df)
358+
hawaii_df = shift_hawaii(map_df)
359+
alaska_df = shift_alaska(map_df, alaska_centroid)
360+
pr_df = shift_pr(map_df, pr_centroid)
412361

413362
main_col = main_df$color
414363
hawaii_col = hawaii_df$color
@@ -418,56 +367,26 @@ plot_choro = function(x, time_value = NULL, include = c(), range,
418367

419368
else if (attributes(x)$metadata$geo_type == "hrr") {
420369
map_df = sf::st_read(system.file(
421-
"shapefiles/hrr",
422-
"geo_export_ad86cff5-e5ed-432e-9ec2-2ce8732099ee.shp",
423-
package = "covidcast"))
370+
"shapefiles/hrr/geo_export_ad86cff5-e5ed-432e-9ec2-2ce8732099ee.shp",
371+
package = "covidcast"))
424372
if (length(include) > 0) {
425-
map_df = map_df %>% filter(map_df$hrr_num %in% include)
373+
map_df = map_df %>% filter(.$hrr_num %in% include)
426374
}
427375
map_df = sf::st_transform(map_df, background_crs)
428376
hrr_shift = sf::st_geometry(map_df) + c(0, -0.185)
429377
map_df = sf::st_set_geometry(map_df, hrr_shift)
430378
map_df = sf::st_set_crs(map_df, background_crs)
431379
map_df$hrr_name <- as.character(map_df$hrr_name)
432-
map_df$is_alaska = substr(map_df$hrr_name, 1, 2) == 'AK'
433-
map_df$is_hawaii = substr(map_df$hrr_name, 1, 2) == 'HI'
434-
map_df$is_pr = substr(map_df$hrr_name, 1, 2) == 'PR'
435-
map_df$color = ifelse(map_df$hrr_num %in% geo,
436-
col_fun(val[map_df$hrr_num]),
437-
missing_col)
438-
439-
pr_df = map_df %>% filter(map_df$is_pr)
440-
hawaii_df = map_df %>% filter(map_df$is_hawaii)
441-
alaska_df = map_df %>% filter(map_df$is_alaska)
442-
443-
main_df = map_df %>% filter(!map_df$is_alaska)
444-
main_df = main_df %>% filter(!main_df$is_hawaii)
445-
main_df = main_df %>% filter(!main_df$is_pr)
446-
447-
main_df = sf::st_transform(main_df, 102003)
448-
hawaii_df = sf::st_transform(hawaii_df, 102007)
449-
alaska_df = sf::st_transform(alaska_df, 102006)
450-
pr_df = sf::st_transform(pr_df, 102003)
451-
452-
hawaii_shift = sf::st_geometry(hawaii_df) + c(-1e+6, -2e+6)
453-
hawaii_df = sf::st_set_geometry(hawaii_df, hawaii_shift)
454-
hawaii_df = sf::st_set_crs(hawaii_df, 102003)
455-
456-
# Note centroid is centroid for entire state (defined for background)
457-
alaska_scale = (sf::st_geometry(alaska_df) - alaska_centroid) * 0.35 + alaska_centroid
458-
alaska_df = sf::st_set_geometry(alaska_df, alaska_scale)
459-
alaska_shift = sf::st_geometry(alaska_df) + c(-2e+6, -2.6e+6)
460-
alaska_df = sf::st_set_geometry(alaska_df, alaska_shift)
461-
alaska_df = sf::st_set_crs(alaska_df, 102003)
462-
463-
pr_shift = sf::st_geometry(pr_df) + c(-0.9e+6, 1e+6)
464-
pr_df = sf::st_set_geometry(pr_df, pr_shift)
465-
r = -16 * pi / 180
466-
rotation = matrix(c(cos(r), sin(r), -sin(r), cos(r)), nrow = 2, ncol = 2)
467-
# Note centroid is same as for entire territory (defined for background)
468-
pr_rotate = (sf::st_geometry(pr_df) - pr_centroid) * rotation + pr_centroid
469-
pr_df = sf::st_set_geometry(pr_df, pr_rotate)
470-
pr_df = sf::st_set_crs(pr_df, 102003)
380+
map_df = map_df %>% dplyr::mutate(
381+
is_alaska = substr(hrr_name, 1, 2) == 'AK',
382+
is_hawaii = substr(hrr_name, 1, 2) == 'HI',
383+
is_pr = substr(hrr_name, 1, 2) == 'PR',
384+
color = ifelse(hrr_num %in% geo, col_fun(val[hrr_num]), missing_col))
385+
386+
main_df = shift_main(map_df)
387+
hawaii_df = shift_hawaii(map_df)
388+
alaska_df = shift_alaska(map_df, alaska_centroid)
389+
pr_df = shift_pr(map_df, pr_centroid)
471390

472391
main_col = main_df$color
473392
hawaii_col = hawaii_df$color
@@ -487,7 +406,7 @@ plot_choro = function(x, time_value = NULL, include = c(), range,
487406
geom_args$data = map_df
488407
polygon_layer = do.call(ggplot2::geom_polygon, geom_args)
489408
coord_layer = ggplot2::coord_equal()
490-
}
409+
}
491410
else if (attributes(x)$metadata$geo_type == "msa" ||
492411
attributes(x)$metadata$geo_type == "hrr") {
493412
aes = ggplot2::aes
@@ -510,7 +429,7 @@ plot_choro = function(x, time_value = NULL, include = c(), range,
510429
geom_args$data = alaska_df
511430
alaska_layer = do.call(ggplot2::geom_sf, geom_args)
512431
coord_layer = do.call(ggplot2::coord_sf, coord_args)
513-
}
432+
}
514433

515434
# For continuous color scale, create a legend layer
516435
if (is.null(breaks)) {
@@ -567,7 +486,7 @@ plot_choro = function(x, time_value = NULL, include = c(), range,
567486
back_main_layer + back_pr_layer + back_hawaii_layer + back_alaska_layer +
568487
main_layer + pr_layer + alaska_layer + hawaii_layer + coord_layer +
569488
title_layer + hidden_layer + scale_layer + theme_layer)
570-
}
489+
}
571490
else {
572491
return(ggplot2::ggplot() + polygon_layer + coord_layer +
573492
title_layer + hidden_layer + scale_layer + theme_layer)
@@ -791,3 +710,63 @@ plot_line = function(x, range = NULL, title = NULL, params = list()) {
791710
return(ggplot2::ggplot(aes(x = time_value), data = df) +
792711
line_layer + ribbon_layer + lim_layer + label_layer + theme_layer)
793712
}
713+
714+
715+
get_pr_centroid = function(map_df){
716+
pr_df = map_df %>% dplyr::filter(.$is_pr) %>% sf::st_transform(., 102003)
717+
pr_centroid = sf::st_centroid(sf::st_geometry(pr_df))
718+
return(pr_centroid)
719+
}
720+
721+
722+
shift_pr = function(map_df, pr_centroid){
723+
pr_df = map_df %>% dplyr::filter(.$is_pr)
724+
pr_df = sf::st_transform(pr_df, 102003)
725+
pr_shift = sf::st_geometry(pr_df) + c(-0.9e+6, 1e+6)
726+
pr_df = sf::st_set_geometry(pr_df, pr_shift)
727+
r = -16 * pi / 180
728+
rotation = matrix(c(cos(r), sin(r), -sin(r), cos(r)), nrow = 2, ncol = 2)
729+
pr_rotate = (sf::st_geometry(pr_df) - pr_centroid) * rotation + pr_centroid
730+
pr_df = sf::st_set_geometry(pr_df, pr_rotate)
731+
pr_df = sf::st_set_crs(pr_df, 102003)
732+
return(pr_df)
733+
}
734+
735+
736+
get_alaska_centroid = function(map_df){
737+
alaska_df = map_df %>% dplyr::filter(.$is_alaska) %>% sf::st_transform(., 102006)
738+
alaska_centroid = sf::st_centroid(sf::st_geometry(alaska_df))
739+
return(alaska_centroid)
740+
}
741+
742+
743+
shift_alaska = function(map_df, alaska_centroid){
744+
alaska_df = map_df %>% dplyr::filter(.$is_alaska)
745+
alaska_df = sf::st_transform(alaska_df, 102006)
746+
alaska_scale = (sf::st_geometry(alaska_df) - alaska_centroid) * 0.35 + alaska_centroid
747+
alaska_df = sf::st_set_geometry(alaska_df, alaska_scale)
748+
alaska_shift = sf::st_geometry(alaska_df) + c(-2e+6, -2.6e+6)
749+
alaska_df = sf::st_set_geometry(alaska_df, alaska_shift)
750+
alaska_df = sf::st_set_crs(alaska_df, 102003)
751+
return(alaska_df)
752+
}
753+
754+
755+
shift_hawaii = function(map_df){
756+
hawaii_df = map_df %>% dplyr::filter(.$is_hawaii)
757+
hawaii_df = sf::st_transform(hawaii_df, 102007)
758+
hawaii_shift = sf::st_geometry(hawaii_df) + c(-1e+6, -2e+6)
759+
hawaii_df = sf::st_set_geometry(hawaii_df, hawaii_shift)
760+
hawaii_df = sf::st_set_crs(hawaii_df, 102003)
761+
return(hawaii_df)
762+
}
763+
764+
765+
shift_main = function(map_df){
766+
main_df = map_df %>% dplyr::filter(
767+
!.$is_alaska) %>% dplyr::filter(
768+
!.$is_hawaii) %>% dplyr::filter(!.$is_pr)
769+
main_df = sf::st_transform(main_df, 102003)
770+
return(main_df)
771+
}
772+

0 commit comments

Comments
 (0)