Skip to content

Commit e4fd80b

Browse files
committed
Added MSA functionality to choro.
1 parent 9b49531 commit e4fd80b

File tree

1 file changed

+213
-20
lines changed

1 file changed

+213
-20
lines changed

R-packages/covidcast/R/plot.R

Lines changed: 213 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,81 @@ plot_choro = function(x, time_value = NULL, include = c(), range,
107107
geo = df$geo
108108
names(val) = geo
109109

110+
# Make background layer for MSA and HRR maps which are incomplete
111+
if ((attributes(x)$geo_type == "msa") |
112+
(attributes(x)$geo_type == "hrr")) {
113+
map_df = st_read('../data/shapefiles/state/cb_2019_us_state_5m.shp')
114+
background_crs = st_crs(map_df)
115+
map_df$STATEFP <- as.character(map_df$STATEFP)
116+
map_df$is_alaska = map_df$STATEFP == '02'
117+
map_df$is_hawaii = map_df$STATEFP == '15'
118+
map_df$is_pr = map_df$STATEFP == '72'
119+
map_df$STATEFP <- as.numeric(map_df$STATEFP)
120+
map_df$is_state = map_df$STATEFP < 57
121+
pr_df = map_df %>% filter(.$is_pr)
122+
hawaii_df = map_df %>% filter(.$is_hawaii)
123+
alaska_df = map_df %>% filter(.$is_alaska)
124+
125+
main_df = map_df %>% filter(!map_df$is_alaska)
126+
main_df = main_df %>% filter(!main_df$is_hawaii)
127+
main_df = main_df %>% filter(main_df$is_state)
128+
129+
main_df = st_transform(main_df, 102003)
130+
hawaii_df = st_transform(hawaii_df, 102007)
131+
alaska_df = st_transform(alaska_df, 102006)
132+
pr_df = st_transform(pr_df, 102003)
133+
134+
hawaii_shift = st_geometry(hawaii_df) + c(-1e+6, -2e+6)
135+
hawaii_df = st_set_geometry(hawaii_df, hawaii_shift)
136+
hawaii_df = st_set_crs(hawaii_df, 102003)
137+
138+
alaska_centroid = st_centroid(st_geometry(alaska_df))
139+
alaska_scale = (st_geometry(alaska_df) - alaska_centroid) * 0.35 + alaska_centroid
140+
alaska_df = st_set_geometry(alaska_df, alaska_scale)
141+
alaska_shift = st_geometry(alaska_df) + c(-2e+6, -2.6e+6)
142+
alaska_df = st_set_geometry(alaska_df, alaska_shift)
143+
alaska_df = st_set_crs(alaska_df, 102003)
144+
145+
pr_shift = st_geometry(pr_df) + c(-0.9e+6, 1e+6)
146+
pr_df = st_set_geometry(pr_df, pr_shift)
147+
r = -16 * pi / 180
148+
rotation = matrix(c(cos(r), sin(r), -sin(r), cos(r)), nrow = 2, ncol = 2)
149+
pr_centroid = pr_df %>% st_geometry %>% st_centroid
150+
pr_rotate = (st_geometry(pr_df) - pr_centroid) * rotation + pr_centroid
151+
pr_df = st_set_crs(pr_df, 102003)
152+
153+
main_geo = main_df$STATEFP
154+
main_col = rep(missing_col, length(main_geo))
155+
156+
hawaii_geo = hawaii_df$STATEFP
157+
hawaii_col = rep(missing_col, length(hawaii_geo))
158+
159+
alaska_geo = alaska_df$STATEFP
160+
alaska_col = rep(missing_col, length(alaska_geo))
161+
162+
pr_geo = pr_df$STATEFP
163+
pr_col = rep(missing_col, length(pr_geo))
164+
165+
aes = ggplot2::aes
166+
geom_args = list()
167+
geom_args$color = border_col
168+
geom_args$size = border_size
169+
geom_args$mapping = aes(geometry=geometry)
170+
171+
geom_args$fill = main_col
172+
geom_args$data = main_df
173+
back_main_layer = do.call(ggplot2::geom_sf, geom_args)
174+
geom_args$fill = pr_col
175+
geom_args$data = pr_df
176+
back_pr_layer = do.call(ggplot2::geom_sf, geom_args)
177+
geom_args$fill = hawaii_col
178+
geom_args$data = hawaii_df
179+
back_hawaii_layer = do.call(ggplot2::geom_sf, geom_args)
180+
geom_args$fill = alaska_col
181+
geom_args$data = alaska_df
182+
back_alaska_layer = do.call(ggplot2::geom_sf, geom_args)
183+
}
184+
110185
# Create the choropleth colors for counties
111186
if (attributes(x)$geo_type == "county") {
112187
map_df = usmap::us_map("county", include = include)
@@ -143,41 +218,145 @@ plot_choro = function(x, time_value = NULL, include = c(), range,
143218

144219
else if (attributes(x)$geo_type == "msa") {
145220
map_df = st_read('../data/shapefiles/msa/cb_2019_us_cbsa_5m.shp')
146-
print(typeof(map_df))
147221
map_df = map_df %>% filter(map_df$LSAD == 'M1') # only get metro and not micropolitan areas
148222
if (length(include) > 0) {
149-
map_df = map_df %>% filter(map_df$NAME %in% include)
223+
map_df = map_df %>% filter(map_df$GEOID %in% include)
150224
}
151225
map_df$NAME <- as.character(map_df$NAME)
152226
map_df$is_alaska = substr(map_df$NAME, nchar(map_df$NAME) - 1, nchar(map_df$NAME)) == 'AK'
153227
map_df$is_hawaii = substr(map_df$NAME, nchar(map_df$NAME) - 1, nchar(map_df$NAME)) == 'HI'
154228
map_df$is_pr = substr(map_df$NAME, nchar(map_df$NAME) - 1, nchar(map_df$NAME)) == 'PR'
155-
print(typeof(map_df))
156-
pr_df = (map_df %>% filter(map_df$is_pr)) + c(-0.9e6, 1e6)
157-
hawaii_df = map_df %>% filter(map_df$is_hawaii) + c(-1e6, -2e6)
229+
pr_df = map_df %>% filter(map_df$is_pr)
230+
hawaii_df = map_df %>% filter(map_df$is_hawaii)
158231
alaska_df = map_df %>% filter(map_df$is_alaska)
159-
map_df = map_df %>% filter(!map_df$is_alaska)
160-
map_df = map_df %>% filter(!map_df$is_hawaii)
161-
map_df = map_df %>% filter(!map_df$is_pr)
232+
main_df = map_df %>% filter(!map_df$is_alaska)
233+
main_df = main_df %>% filter(!main_df$is_hawaii)
234+
main_df = main_df %>% filter(!main_df$is_pr)
235+
236+
main_df = st_transform(main_df, 102003)
237+
hawaii_df = st_transform(hawaii_df, 102007)
238+
alaska_df = st_transform(alaska_df, 102006)
239+
pr_df = st_transform(pr_df, 102003)
240+
241+
hawaii_shift = st_geometry(hawaii_df) + c(-1e+6, -2e+6)
242+
hawaii_df = st_set_geometry(hawaii_df, hawaii_shift)
243+
hawaii_df = st_set_crs(hawaii_df, 102003)
244+
245+
# Note centroid is centroid for entire state (defined for background)
246+
alaska_scale = (st_geometry(alaska_df) - alaska_centroid) * 0.35 + alaska_centroid
247+
alaska_df = st_set_geometry(alaska_df, alaska_scale)
248+
alaska_shift = st_geometry(alaska_df) + c(-2e+6, -2.6e+6)
249+
alaska_df = st_set_geometry(alaska_df, alaska_shift)
250+
alaska_df = st_set_crs(alaska_df, 102003)
251+
252+
pr_shift = st_geometry(pr_df) + c(-0.9e+6, 1e+6)
253+
pr_df = st_set_geometry(pr_df, pr_shift)
254+
r = -16 * pi / 180
255+
rotation = matrix(c(cos(r), sin(r), -sin(r), cos(r)), nrow = 2, ncol = 2)
256+
# Note centroid is same as for entire territory (defined for background)
257+
pr_rotate = (st_geometry(pr_df) - pr_centroid) * rotation + pr_centroid
258+
pr_df = st_set_crs(pr_df, 102003)
259+
260+
main_geo = main_df$GEOID
261+
main_col = rep(missing_col, length(main_geo))
262+
main_obs = main_geo[main_geo %in% geo]
263+
main_col[main_geo %in% geo] = col_fun(val[main_obs])
264+
265+
hawaii_geo = hawaii_df$GEOID
266+
hawaii_col = rep(missing_col, length(hawaii_geo))
267+
hawaii_obs = hawaii_geo[hawaii_geo %in% geo]
268+
hawaii_col[hawaii_geo %in% geo] = col_fun(val[hawaii_obs])
269+
270+
alaska_geo = alaska_df$GEOID
271+
alaska_col = rep(missing_col, length(alaska_geo))
272+
alaska_obs = alaska_geo[alaska_geo %in% geo]
273+
alaska_col[alaska_geo %in% geo] = col_fun(val[alaska_obs])
274+
275+
pr_geo = pr_df$GEOID
276+
pr_col = rep(missing_col, length(pr_geo))
277+
pr_obs = pr_geo[pr_geo %in% geo]
278+
pr_col[pr_geo %in% geo] = col_fun(val[pr_obs])
279+
}
162280

163-
map_geo = map_df$GEOID
164-
map_col = rep(missing_col, length(map_geo))
281+
else if (attributes(x)$geo_type == "hrr") {
282+
map_df = st_read('../data/shapefiles/hrr/geo_export_ad86cff5-e5ed-432e-9ec2-2ce8732099ee.shp')
283+
if (length(include) > 0) {
284+
map_df = map_df %>% filter(map_df$hrr_num %in% include)
285+
}
286+
map_df = st_transform(map_df, background_crs)
287+
hrr_shift = st_geometry(map_df) + c(0, -0.185)
288+
map_df = st_set_geometry(map_df, hrr_shift)
289+
map_df = st_set_crs(map_df, background_crs)
290+
map_df$hrr_name <- as.character(map_df$hrr_name)
291+
map_df$is_alaska = substr(map_df$hrr_name, 1, 2) == 'AK'
292+
map_df$is_hawaii = substr(map_df$hrr_name, 1, 1) == 'HI'
293+
map_df$is_pr = substr(map_df$hrr_name, 1, 2) == 'PR'
294+
295+
pr_df = map_df %>% filter(map_df$is_pr)
296+
hawaii_df = map_df %>% filter(map_df$is_hawaii)
297+
alaska_df = map_df %>% filter(map_df$is_alaska)
165298

166-
map_obs = map_geo[map_geo %in% geo]
167-
map_col[map_geo %in% geo] = col_fun(val[map_obs])
299+
main_df = map_df %>% filter(!map_df$is_alaska)
300+
main_df = main_df %>% filter(!main_df$is_hawaii)
301+
main_df = main_df %>% filter(!main_df$is_pr)
302+
303+
main_df = st_transform(main_df, 102003)
304+
hawaii_df = st_transform(hawaii_df, 102007)
305+
alaska_df = st_transform(alaska_df, 102006)
306+
pr_df = st_transform(pr_df, 102003)
307+
308+
hawaii_shift = st_geometry(hawaii_df) + c(-1e+6, -2e+6)
309+
hawaii_df = st_set_geometry(hawaii_df, hawaii_shift)
310+
hawaii_df = st_set_crs(hawaii_df, 102003)
311+
312+
# Note centroid is centroid for entire state (defined for background)
313+
#alaska_scale = (st_geometry(alaska_df) - alaska_centroid) * 0.35 + alaska_centroid
314+
#alaska_df = st_set_geometry(alaska_df, alaska_scale)
315+
#alaska_shift = st_geometry(alaska_df) + c(-2e+6, -2.6e+6)
316+
#alaska_df = st_set_geometry(alaska_df, alaska_shift)
317+
alaska_df = st_set_crs(alaska_df, 102003)
318+
319+
pr_shift = st_geometry(pr_df) + c(-0.9e+6, 1e+6)
320+
pr_df = st_set_geometry(pr_df, pr_shift)
321+
r = -16 * pi / 180
322+
rotation = matrix(c(cos(r), sin(r), -sin(r), cos(r)), nrow = 2, ncol = 2)
323+
# Note centroid is same as for entire territory (defined for background)
324+
pr_rotate = (st_geometry(pr_df) - pr_centroid) * rotation + pr_centroid
325+
pr_df = st_set_crs(pr_df, 102003)
326+
327+
main_geo = main_df$hrr_num
328+
main_col = rep(missing_col, length(main_geo))
329+
main_obs = main_geo[main_geo %in% geo]
330+
main_col[main_geo %in% geo] = col_fun(val[main_obs])
331+
332+
hawaii_geo = hawaii_df$hrr_num
333+
hawaii_col = rep(missing_col, length(hawaii_geo))
334+
hawaii_obs = hawaii_geo[hawaii_geo %in% geo]
335+
hawaii_col[hawaii_geo %in% geo] = col_fun(val[hawaii_obs])
336+
337+
print('yo')
338+
alaska_geo = alaska_df$hrr_num
339+
alaska_col = rep(missing_col, length(alaska_geo))
340+
alaska_obs = alaska_geo[alaska_geo %in% geo]
341+
print(alaska_obs)
342+
alaska_col[alaska_geo %in% geo] = col_fun(val[alaska_obs])
343+
344+
pr_geo = pr_df$hrr_num
345+
pr_col = rep(missing_col, length(pr_geo))
346+
pr_obs = pr_geo[pr_geo %in% geo]
347+
pr_col[pr_geo %in% geo] = col_fun(val[pr_obs])
348+
168349
}
169350

170-
else if (attributes(x)$geo_type == "hrr") {}
171-
172351
# Create the polygon layer
173352
if (attributes(x)$geo_type == "county" ||
174353
attributes(x)$geo_type == "state") {
175354
aes = ggplot2::aes
176355
geom_args = list()
177356
geom_args$color = border_col
178357
geom_args$size = border_size
179-
geom_args$fill = map_col
180358
geom_args$mapping = aes(x = x, y = y, group = group)
359+
geom_args$fill = map_col
181360
geom_args$data = map_df
182361
polygon_layer = do.call(ggplot2::geom_polygon, geom_args)
183362
coord_layer = ggplot2::coord_equal()
@@ -188,13 +367,24 @@ plot_choro = function(x, time_value = NULL, include = c(), range,
188367
geom_args = list()
189368
geom_args$color = border_col
190369
geom_args$size = border_size
191-
geom_args$fill = map_col
192370
geom_args$mapping = aes(geometry=geometry)
193-
geom_args$data = map_df
194371
coord_args = list()
195-
polygon_layer = do.call(ggplot2::geom_sf, geom_args)
372+
373+
geom_args$fill = main_col
374+
geom_args$data = main_df
375+
polygon_layer = do.call(ggplot2::geom_sf, geom_args)
376+
geom_args$fill = pr_col
377+
geom_args$data = pr_df
378+
pr_layer = do.call(ggplot2::geom_sf, geom_args)
379+
geom_args$fill = hawaii_col
380+
geom_args$data = hawaii_df
381+
hawaii_layer = do.call(ggplot2::geom_sf, geom_args)
382+
#geom_args$fill = alaska_col
383+
#geom_args$data = alaska_df
384+
#alaska_layer = do.call(ggplot2::geom_sf, geom_args)
196385
coord_layer = do.call(ggplot2::coord_sf, coord_args)
197386
}
387+
198388

199389
# For intensity and continuous color scale, create a legend layer
200390
if (!direction && is.null(breaks)) {
@@ -265,9 +455,12 @@ plot_choro = function(x, time_value = NULL, include = c(), range,
265455
labels = legend_labels,
266456
guide = guide)
267457
}
268-
269458
# Put it all together and return
270-
return(ggplot2::ggplot() + polygon_layer + coord_layer +
459+
return(ggplot2::ggplot() + back_main_layer + back_pr_layer + back_hawaii_layer + back_alaska_layer +
460+
polygon_layer +
461+
pr_layer +
462+
#hawaii_layer + alaska_layer +
463+
coord_layer +
271464
title_layer + hidden_layer + scale_layer + theme_layer)
272465
}
273466

0 commit comments

Comments
 (0)