From 0e895e248024249f43cea8091e14d0f7df5f1b78 Mon Sep 17 00:00:00 2001 From: usmap-bot Date: Fri, 29 Aug 2025 01:03:03 +0000 Subject: [PATCH 1/3] [automated] Prepare for 1.0.0 release --- DESCRIPTION | 2 +- NEWS.md | 2 +- .../usmap.Rcheck/00_pkg_src/usmap/DESCRIPTION | 26 + check/usmap.Rcheck/00_pkg_src/usmap/NAMESPACE | 28 + check/usmap.Rcheck/00_pkg_src/usmap/NEWS.md | 247 +++++++ check/usmap.Rcheck/00_pkg_src/usmap/R/data.R | 194 ++++++ check/usmap.Rcheck/00_pkg_src/usmap/R/fips.R | 223 ++++++ .../00_pkg_src/usmap/R/join-data.R | 101 +++ .../00_pkg_src/usmap/R/plot-map.R | 197 ++++++ .../usmap.Rcheck/00_pkg_src/usmap/R/regions.R | 202 ++++++ .../00_pkg_src/usmap/R/transform.R | 161 +++++ .../usmap.Rcheck/00_pkg_src/usmap/R/us-map.R | 51 ++ .../00_pkg_src/usmap/R/usmap-package.R | 76 +++ check/usmap.Rcheck/00_pkg_src/usmap/README.md | 368 ++++++++++ .../00_pkg_src/usmap/build/vignette.rds | Bin 0 -> 260 bytes .../00_pkg_src/usmap/data/citypop.rda | Bin 0 -> 1910 bytes .../00_pkg_src/usmap/data/countypop.rda | Bin 0 -> 28343 bytes .../00_pkg_src/usmap/data/countypov.rda | Bin 0 -> 21385 bytes .../00_pkg_src/usmap/data/earthquakes.rda | Bin 0 -> 23191 bytes .../00_pkg_src/usmap/data/statepop.rda | Bin 0 -> 1132 bytes .../00_pkg_src/usmap/data/statepov.rda | Bin 0 -> 922 bytes .../00_pkg_src/usmap/data/usrivers.rda | Bin 0 -> 78491 bytes .../00_pkg_src/usmap/inst/WORDLIST | 29 + .../00_pkg_src/usmap/man/citypop.Rd | 34 + .../00_pkg_src/usmap/man/countypop.Rd | 32 + .../00_pkg_src/usmap/man/countypov.Rd | 32 + .../usmap/man/dot-east_north_central.Rd | 24 + .../usmap/man/dot-east_south_central.Rd | 24 + .../00_pkg_src/usmap/man/dot-mid_atlantic.Rd | 24 + .../usmap/man/dot-midwest_region.Rd | 25 + .../00_pkg_src/usmap/man/dot-mountain.Rd | 24 + .../00_pkg_src/usmap/man/dot-new_england.Rd | 24 + .../usmap/man/dot-north_central_region.Rd | 25 + .../usmap/man/dot-northeast_region.Rd | 24 + .../00_pkg_src/usmap/man/dot-pacific.Rd | 24 + .../usmap/man/dot-south_atlantic.Rd | 25 + .../00_pkg_src/usmap/man/dot-south_region.Rd | 24 + .../usmap/man/dot-west_north_central.Rd | 24 + .../00_pkg_src/usmap/man/dot-west_region.Rd | 23 + .../usmap/man/dot-west_south_central.Rd | 24 + .../00_pkg_src/usmap/man/earthquakes.Rd | 33 + .../usmap.Rcheck/00_pkg_src/usmap/man/fips.Rd | 71 ++ .../00_pkg_src/usmap/man/fips_info.Rd | 52 ++ .../00_pkg_src/usmap/man/get_fips_info.Rd | 14 + .../00_pkg_src/usmap/man/map_with_data.Rd | 72 ++ .../00_pkg_src/usmap/man/perform_transform.Rd | 13 + .../00_pkg_src/usmap/man/plot_usmap.Rd | 113 +++ .../00_pkg_src/usmap/man/statepop.Rd | 32 + .../00_pkg_src/usmap/man/statepov.Rd | 32 + .../00_pkg_src/usmap/man/static_merge.Rd | 15 + .../00_pkg_src/usmap/man/theme_map.Rd | 17 + .../00_pkg_src/usmap/man/us_map.Rd | 58 ++ .../00_pkg_src/usmap/man/usmap.Rd | 83 +++ .../00_pkg_src/usmap/man/usmap_crs.Rd | 15 + .../00_pkg_src/usmap/man/usmap_transform.Rd | 69 ++ .../00_pkg_src/usmap/man/usrivers.Rd | 35 + .../00_pkg_src/usmap/tests/spelling.R | 6 + .../00_pkg_src/usmap/tests/testthat.R | 12 + .../tests/testthat/_snaps/data/countypop.svg | 310 +++++++++ .../tests/testthat/_snaps/data/countypov.svg | 313 +++++++++ .../tests/testthat/_snaps/data/statepop.svg | 75 ++ .../tests/testthat/_snaps/data/statepov.svg | 75 ++ ...rizona-county-map-with-labels-and-fill.svg | 71 ++ ...e-data-state-map-with-custom-linewidth.svg | 188 +++++ ...-state-map-with-labels-excluding-maine.svg | 54 ++ ...pr-county-map-with-labels-and-excludes.svg | 194 ++++++ .../southeastern-states-map-with-labels.svg | 50 ++ .../_snaps/plot/state-map-with-labels.svg | 225 ++++++ .../plot/state-map-with-major-rivers.svg | 246 +++++++ ...tate-population-map-with-blue-outlines.svg | 185 +++++ .../testthat/helper-requireNamespace-mock.R | 12 + .../usmap/tests/testthat/test-data.R | 13 + .../usmap/tests/testthat/test-fips-info.R | 75 ++ .../usmap/tests/testthat/test-fips.R | 84 +++ .../usmap/tests/testthat/test-join-data.R | 56 ++ .../usmap/tests/testthat/test-plot.R | 186 +++++ .../usmap/tests/testthat/test-transform.R | 203 ++++++ .../usmap/tests/testthat/test-usmap.R | 18 + .../00_pkg_src/usmap/vignettes/usmap1.Rmd | 83 +++ .../00_pkg_src/usmap/vignettes/usmap2.Rmd | 211 ++++++ .../00_pkg_src/usmap/vignettes/usmap3.Rmd | 152 +++++ check/usmap.Rcheck/00check.log | 71 ++ check/usmap.Rcheck/00install.out | 16 + check/usmap.Rcheck/R_check_bin/R | 2 + check/usmap.Rcheck/R_check_bin/Rscript | 2 + check/usmap.Rcheck/tests/spelling.R | 6 + check/usmap.Rcheck/tests/spelling.Rout | 28 + check/usmap.Rcheck/tests/spelling.Rout.save | 28 + check/usmap.Rcheck/tests/startup.Rs | 4 + check/usmap.Rcheck/tests/testthat.R | 12 + check/usmap.Rcheck/tests/testthat.Rout | 39 ++ .../tests/testthat/_snaps/data/countypop.svg | 310 +++++++++ .../tests/testthat/_snaps/data/countypov.svg | 313 +++++++++ .../tests/testthat/_snaps/data/statepop.svg | 75 ++ .../tests/testthat/_snaps/data/statepov.svg | 75 ++ ...rizona-county-map-with-labels-and-fill.svg | 71 ++ ...e-data-state-map-with-custom-linewidth.svg | 188 +++++ ...-state-map-with-labels-excluding-maine.svg | 54 ++ ...pr-county-map-with-labels-and-excludes.svg | 194 ++++++ .../southeastern-states-map-with-labels.svg | 50 ++ .../_snaps/plot/state-map-with-labels.svg | 225 ++++++ .../plot/state-map-with-major-rivers.svg | 246 +++++++ ...tate-population-map-with-blue-outlines.svg | 185 +++++ .../testthat/helper-requireNamespace-mock.R | 12 + check/usmap.Rcheck/tests/testthat/test-data.R | 13 + .../tests/testthat/test-fips-info.R | 75 ++ check/usmap.Rcheck/tests/testthat/test-fips.R | 84 +++ .../tests/testthat/test-join-data.R | 56 ++ check/usmap.Rcheck/tests/testthat/test-plot.R | 186 +++++ .../tests/testthat/test-transform.R | 203 ++++++ .../usmap.Rcheck/tests/testthat/test-usmap.R | 18 + check/usmap.Rcheck/usmap-Ex.R | 488 +++++++++++++ check/usmap.Rcheck/usmap-Ex.Rout | 644 ++++++++++++++++++ check/usmap.Rcheck/usmap-Ex.pdf | Bin 0 -> 1139485 bytes check/usmap.Rcheck/usmap-Ex.timings | 21 + check/usmap.Rcheck/usmap/DESCRIPTION | 27 + check/usmap.Rcheck/usmap/INDEX | 32 + check/usmap.Rcheck/usmap/NAMESPACE | 28 + check/usmap.Rcheck/usmap/NEWS.md | 247 +++++++ check/usmap.Rcheck/usmap/R/usmap | 27 + check/usmap.Rcheck/usmap/R/usmap.rdb | Bin 0 -> 21499 bytes check/usmap.Rcheck/usmap/R/usmap.rdx | Bin 0 -> 650 bytes check/usmap.Rcheck/usmap/WORDLIST | 29 + check/usmap.Rcheck/usmap/data/Rdata.rdb | Bin 0 -> 167269 bytes check/usmap.Rcheck/usmap/data/Rdata.rds | Bin 0 -> 145 bytes check/usmap.Rcheck/usmap/data/Rdata.rdx | Bin 0 -> 240 bytes check/usmap.Rcheck/usmap/help/AnIndex | 38 ++ check/usmap.Rcheck/usmap/help/aliases.rds | Bin 0 -> 451 bytes check/usmap.Rcheck/usmap/help/paths.rds | Bin 0 -> 426 bytes check/usmap.Rcheck/usmap/help/usmap.rdb | Bin 0 -> 64848 bytes check/usmap.Rcheck/usmap/help/usmap.rdx | Bin 0 -> 881 bytes check/usmap.Rcheck/usmap/html/00Index.html | 95 +++ check/usmap.Rcheck/usmap/html/R.css | 130 ++++ check/usmap_0.8.0.9000.tar.gz | Bin 0 -> 1846993 bytes 134 files changed, 10809 insertions(+), 2 deletions(-) create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/DESCRIPTION create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/NAMESPACE create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/NEWS.md create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/R/data.R create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/R/fips.R create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/R/join-data.R create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/R/plot-map.R create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/R/regions.R create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/R/transform.R create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/R/us-map.R create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/R/usmap-package.R create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/README.md create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/build/vignette.rds create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/data/citypop.rda create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/data/countypop.rda create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/data/countypov.rda create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/data/earthquakes.rda create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/data/statepop.rda create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/data/statepov.rda create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/data/usrivers.rda create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/inst/WORDLIST create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/man/citypop.Rd create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/man/countypop.Rd create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/man/countypov.Rd create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/man/dot-east_north_central.Rd create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/man/dot-east_south_central.Rd create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/man/dot-mid_atlantic.Rd create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/man/dot-midwest_region.Rd create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/man/dot-mountain.Rd create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/man/dot-new_england.Rd create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/man/dot-north_central_region.Rd create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/man/dot-northeast_region.Rd create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/man/dot-pacific.Rd create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/man/dot-south_atlantic.Rd create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/man/dot-south_region.Rd create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/man/dot-west_north_central.Rd create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/man/dot-west_region.Rd create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/man/dot-west_south_central.Rd create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/man/earthquakes.Rd create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/man/fips.Rd create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/man/fips_info.Rd create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/man/get_fips_info.Rd create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/man/map_with_data.Rd create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/man/perform_transform.Rd create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/man/plot_usmap.Rd create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/man/statepop.Rd create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/man/statepov.Rd create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/man/static_merge.Rd create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/man/theme_map.Rd create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/man/us_map.Rd create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/man/usmap.Rd create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/man/usmap_crs.Rd create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/man/usmap_transform.Rd create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/man/usrivers.Rd create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/tests/spelling.R create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat.R create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/data/countypop.svg create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/data/countypov.svg create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/data/statepop.svg create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/data/statepov.svg create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/plot/arizona-county-map-with-labels-and-fill.svg create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/plot/example-data-state-map-with-custom-linewidth.svg create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/plot/new-england-state-map-with-labels-excluding-maine.svg create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/plot/pr-county-map-with-labels-and-excludes.svg create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/plot/southeastern-states-map-with-labels.svg create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/plot/state-map-with-labels.svg create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/plot/state-map-with-major-rivers.svg create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/plot/state-population-map-with-blue-outlines.svg create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/helper-requireNamespace-mock.R create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/test-data.R create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/test-fips-info.R create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/test-fips.R create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/test-join-data.R create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/test-plot.R create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/test-transform.R create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/test-usmap.R create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/vignettes/usmap1.Rmd create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/vignettes/usmap2.Rmd create mode 100644 check/usmap.Rcheck/00_pkg_src/usmap/vignettes/usmap3.Rmd create mode 100644 check/usmap.Rcheck/00check.log create mode 100644 check/usmap.Rcheck/00install.out create mode 100755 check/usmap.Rcheck/R_check_bin/R create mode 100755 check/usmap.Rcheck/R_check_bin/Rscript create mode 100644 check/usmap.Rcheck/tests/spelling.R create mode 100644 check/usmap.Rcheck/tests/spelling.Rout create mode 100644 check/usmap.Rcheck/tests/spelling.Rout.save create mode 100644 check/usmap.Rcheck/tests/startup.Rs create mode 100644 check/usmap.Rcheck/tests/testthat.R create mode 100644 check/usmap.Rcheck/tests/testthat.Rout create mode 100644 check/usmap.Rcheck/tests/testthat/_snaps/data/countypop.svg create mode 100644 check/usmap.Rcheck/tests/testthat/_snaps/data/countypov.svg create mode 100644 check/usmap.Rcheck/tests/testthat/_snaps/data/statepop.svg create mode 100644 check/usmap.Rcheck/tests/testthat/_snaps/data/statepov.svg create mode 100644 check/usmap.Rcheck/tests/testthat/_snaps/plot/arizona-county-map-with-labels-and-fill.svg create mode 100644 check/usmap.Rcheck/tests/testthat/_snaps/plot/example-data-state-map-with-custom-linewidth.svg create mode 100644 check/usmap.Rcheck/tests/testthat/_snaps/plot/new-england-state-map-with-labels-excluding-maine.svg create mode 100644 check/usmap.Rcheck/tests/testthat/_snaps/plot/pr-county-map-with-labels-and-excludes.svg create mode 100644 check/usmap.Rcheck/tests/testthat/_snaps/plot/southeastern-states-map-with-labels.svg create mode 100644 check/usmap.Rcheck/tests/testthat/_snaps/plot/state-map-with-labels.svg create mode 100644 check/usmap.Rcheck/tests/testthat/_snaps/plot/state-map-with-major-rivers.svg create mode 100644 check/usmap.Rcheck/tests/testthat/_snaps/plot/state-population-map-with-blue-outlines.svg create mode 100644 check/usmap.Rcheck/tests/testthat/helper-requireNamespace-mock.R create mode 100644 check/usmap.Rcheck/tests/testthat/test-data.R create mode 100644 check/usmap.Rcheck/tests/testthat/test-fips-info.R create mode 100644 check/usmap.Rcheck/tests/testthat/test-fips.R create mode 100644 check/usmap.Rcheck/tests/testthat/test-join-data.R create mode 100644 check/usmap.Rcheck/tests/testthat/test-plot.R create mode 100644 check/usmap.Rcheck/tests/testthat/test-transform.R create mode 100644 check/usmap.Rcheck/tests/testthat/test-usmap.R create mode 100644 check/usmap.Rcheck/usmap-Ex.R create mode 100644 check/usmap.Rcheck/usmap-Ex.Rout create mode 100644 check/usmap.Rcheck/usmap-Ex.pdf create mode 100644 check/usmap.Rcheck/usmap-Ex.timings create mode 100644 check/usmap.Rcheck/usmap/DESCRIPTION create mode 100644 check/usmap.Rcheck/usmap/INDEX create mode 100644 check/usmap.Rcheck/usmap/NAMESPACE create mode 100644 check/usmap.Rcheck/usmap/NEWS.md create mode 100644 check/usmap.Rcheck/usmap/R/usmap create mode 100644 check/usmap.Rcheck/usmap/R/usmap.rdb create mode 100644 check/usmap.Rcheck/usmap/R/usmap.rdx create mode 100644 check/usmap.Rcheck/usmap/WORDLIST create mode 100644 check/usmap.Rcheck/usmap/data/Rdata.rdb create mode 100644 check/usmap.Rcheck/usmap/data/Rdata.rds create mode 100644 check/usmap.Rcheck/usmap/data/Rdata.rdx create mode 100644 check/usmap.Rcheck/usmap/help/AnIndex create mode 100644 check/usmap.Rcheck/usmap/help/aliases.rds create mode 100644 check/usmap.Rcheck/usmap/help/paths.rds create mode 100644 check/usmap.Rcheck/usmap/help/usmap.rdb create mode 100644 check/usmap.Rcheck/usmap/help/usmap.rdx create mode 100644 check/usmap.Rcheck/usmap/html/00Index.html create mode 100644 check/usmap.Rcheck/usmap/html/R.css create mode 100644 check/usmap_0.8.0.9000.tar.gz diff --git a/DESCRIPTION b/DESCRIPTION index eb3c11d..02933ab 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,5 +1,5 @@ Package: usmap -Version: 0.8.0.9000 +Version: 1.0.0 Title: US Maps Including Alaska and Hawaii Description: Obtain United States map data frames of varying region types (e.g. county, state). The map data frames include Alaska and Hawaii conveniently placed to the diff --git a/NEWS.md b/NEWS.md index 3a462bf..861fba0 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,4 +1,4 @@ -# [unreleased] +# usmap 1.0.0 Introducing `usmap 1.0.0`! This week we celebrated 10 years since the [first commit](https://github.com/pdil/usmap/commit/1d6a950d54c8195507406d7042093041381b605c) to this project. It has been quite a ride and `usmap` has grown greatly over the years. To everyone who has supported the project in any way, either by reporting issues, contributing code, or just using the package in your work, thank you so much. diff --git a/check/usmap.Rcheck/00_pkg_src/usmap/DESCRIPTION b/check/usmap.Rcheck/00_pkg_src/usmap/DESCRIPTION new file mode 100644 index 0000000..73787c1 --- /dev/null +++ b/check/usmap.Rcheck/00_pkg_src/usmap/DESCRIPTION @@ -0,0 +1,26 @@ +Package: usmap +Version: 0.8.0.9000 +Title: US Maps Including Alaska and Hawaii +Description: Obtain United States map data frames of varying region types (e.g. county, + state). The map data frames include Alaska and Hawaii conveniently placed to the + bottom left, as they appear in most maps of the US. Convenience functions for plotting + choropleths, visualizing spatial data, and working with FIPS codes are also provided. +Authors@R: person("Paolo", "Di Lorenzo", email = "paolo@dilorenzo.org", role = c("aut", "cph", "cre")) +Depends: R (>= 3.5.0) +License: GPL (>= 3) +Encoding: UTF-8 +Language: en-US +LazyData: true +URL: https://usmap.dev +BugReports: https://github.com/pdil/usmap/issues +Imports: rlang, usmapdata (>= 1.0.0) +Suggests: covr, ggplot2 (>= 3.5.0), ggrepel, knitr, proto, rmarkdown, + scales, sf, spelling, testthat (>= 3.0.0), vdiffr, withr +RoxygenNote: 7.3.2 +Roxygen: list(markdown = TRUE) +VignetteBuilder: knitr +Config/testthat/edition: 3 +NeedsCompilation: no +Packaged: 2025-08-29 01:02:17 UTC; runner +Author: Paolo Di Lorenzo [aut, cph, cre] +Maintainer: Paolo Di Lorenzo diff --git a/check/usmap.Rcheck/00_pkg_src/usmap/NAMESPACE b/check/usmap.Rcheck/00_pkg_src/usmap/NAMESPACE new file mode 100644 index 0000000..09b0283 --- /dev/null +++ b/check/usmap.Rcheck/00_pkg_src/usmap/NAMESPACE @@ -0,0 +1,28 @@ +# Generated by roxygen2: do not edit by hand + +S3method(fips_info,character) +S3method(fips_info,numeric) +S3method(usmap_transform,data.frame) +S3method(usmap_transform,sf) +export(.east_north_central) +export(.east_south_central) +export(.mid_atlantic) +export(.midwest_region) +export(.mountain) +export(.new_england) +export(.north_central_region) +export(.northeast_region) +export(.pacific) +export(.south_atlantic) +export(.south_region) +export(.west_north_central) +export(.west_region) +export(.west_south_central) +export(fips) +export(fips_info) +export(map_with_data) +export(plot_usmap) +export(us_map) +export(usmap_crs) +export(usmap_transform) +importFrom(rlang,.data) diff --git a/check/usmap.Rcheck/00_pkg_src/usmap/NEWS.md b/check/usmap.Rcheck/00_pkg_src/usmap/NEWS.md new file mode 100644 index 0000000..3a462bf --- /dev/null +++ b/check/usmap.Rcheck/00_pkg_src/usmap/NEWS.md @@ -0,0 +1,247 @@ +# [unreleased] + +Introducing `usmap 1.0.0`! This week we celebrated 10 years since the [first commit](https://github.com/pdil/usmap/commit/1d6a950d54c8195507406d7042093041381b605c) to this project. It has been quite a ride and `usmap` has grown greatly over the years. To everyone who has supported the project in any way, either by reporting issues, contributing code, or just using the package in your work, thank you so much. + +I'm happy to announce that with this version we have finally added Puerto Rico! This addition has been [years](https://github.com/pdil/usmap/issues/20) in the making and its now available throughout `usmap`. + +### New Features +* Add Puerto Rico support to all `usmap` functions (where relevant), see [Issue #20](https://github.com/pdil/usmap/issues/20). + * All included map years have been retroactively updated to include Puerto Rico, so any valid value of `data_year` will include Puerto Rico if desired. + * Functions now return Puerto Rico in their data sets and it can be included or excluded just like any state (using FIPS, full name, abbreviation, etc.). + * Puerto Rican municipalities will be shown when using `"county"` map variants. + * By default, Puerto Rico is not shown when using `plot_usmap()` unless it is specifically included with the `include` parameter. This default behavior can be changed by setting the environment variable `USMAP_DEFAULT_EXCLUDE_PR = FALSE`. Setting this parameter will include Puerto Rico by default when calling `plot_usmap()` unless specifically excluded with the `exclude` parameter. + * Special thanks [@dcaud](https://github.com/dcaud) who started this work [years ago](https://github.com/pdil/usmap/pull/34). + +### Improvements +* Improve documentation and vignettes. + +# usmap 0.8.0 +Released Wednesday, May 28, 2025. + +### New Features +* Add `data_year` parameter to `fips()`, `fips_info()`, `map_with_data()`, `plot_usmap()`, and `us_map()`, see [Issue #110](https://github.com/pdil/usmap/issues/110). + * Allows user to select the year for which to plot US map. + * This will allow the user to match the map that is provided to the data they are using. + * To start with, 2021, 2022, 2023, and 2024 maps are included. + * Going forward, each year will be added to `usmapdata` (`usmap`'s data repository) and previous years can be accessed with this parameter. + * `usmapdata v0.4.0` or later is required to use this parameter. + * If the value provided via `data_year` is not available, the package will select the next year for which data exists. + * For example, if data sets 2022 and 2023 are available and the user calls `us_map(data_year = 2019)`, 2022 will be used. + * A warning is presented when this occurs to alert the user. + * Further reading on the impetus for this change: [major changes made to Connecticut counties in 2023](https://www.ctinsider.com/projects/2023/ct-planning-regions). + * The old Connecticut counties are available in the 2021 data, 2022 and forward use the new planning regions. + +### Improvements +* Update package author email. + +### Removed +* The `as_sf` parameter has been completely removed from `usmapdata`. + * Its usage was already removed from `usmap` but its removal is noted here as a final notice. + * Any existing code that sets it can safely delete it from `usmapdata` function calls. + +# usmap 0.7.1 +Released Thursday, March 21, 2024. + +### Improvements +* Add citation information to README, see [Issue #86](https://github.com/pdil/usmap/issues/86). +* Update map theme to work with new legend behavior in [ggplot2 3.5.0](https://www.tidyverse.org/blog/2024/02/ggplot2-3-5-0-legends/#placement). +* Update provided population and poverty (county & state) data sets, see [Issue #88](https://github.com/pdil/usmap/issues/88). + * Previous data sets from 2015 and 2014, respectively have been updated to 2022 and 2021 versions, respectively. + * The main change (besides numerical values) is that Connecticut now has the correct FIPS codes in the 2022 county population data set. See [this Federal Register document](https://www.federalregister.gov/documents/2022/06/06/2022-12063/change-to-county-equivalents-in-the-state-of-connecticut) for more information. The 2021 county data does not include CT updates yet since the new FIPS codes were not made effective until 2022. Poverty data for 2022 is not available yet so the most recently available data from 2021 is included for now. + +### Documentation +* Replace `size` with `linewidth` in `plot_usmap()` documentation, see [Issue #89](https://github.com/pdil/usmap/issues/89). + +### Technical Changes +* Internal `usmapdata` functions are used for data transformation (i.e. `usmap_transform()`) values for consistency. + * This allows the same values used to create the map to be used when transforming external data. + * Values will now only have to be updated in one place. + * `usmapdata 0.2.2` is now a required dependency because of this change. +* Continue `sf`-based map data file migration. + * Usage of the `as_sf` parameter in `usmapdata` function calls has been removed. + * The parameter will be removed from `usmapdata` functions in the future. + +# usmap 0.7.0 +Released Saturday, January 20, 2024. + +This is a major new release for `usmap`. The data has been modernized to be a [simple features (`sf`)](https://r-spatial.github.io/sf/) object. This will allow for much greater flexibility in the type of data that can be portrayed on the US map. `us_map()`, `plot_usmap()`, and `usmap_transform()` have been updated to work with these new formats. See the examples in the vignettes and `README` for more information. + +### Improvements +* Migrate to new `usmapdata 0.2.0` `sf`-based map data files. + * Map data produced by `us_map()` is now returned as an `sf` object instead of a standard data frame. + * Allows for further flexibility in manipulation, easier plotting, and reduced file sizes. + * There should be no visible changes to existing `usmap` functionality. + * If something doesn't look right, please [open an issue](https://github.com/pdil/usmap/issues). +* Change the output of `usmap_transform()` in accordance with the `sf` change mentioned above. + * The output data frame now replaces the `lat`/`lon` columns with a single `geometry` column with the transformed points and can be plotted using `ggplot2::geom_sf()`. + * Review the included examples and `advanced-mapping` vignette for more details. +* `usmap_transform()` now accepts `sf` objects and automatically transforms its `geometry` column to the projection used by this package. + * It is now possible to add any geographical features to the plotted map such as rivers, roads, topographical data, etc. using `usmap_transform()` before plotting with `ggplot2::geom_sf()`, see [Issue #12](https://github.com/pdil/usmap/issues/12). + * See the provided vignettes and examples for more information. + * Input can now also be in any coordinate reference system, if it is not standard longitude/latitude, it can be specified with the `crs` parameter. +* Add `usrivers` dataset featuring major US rivers. + * The dataset is provided in an `sf` object and is ready to be transformed with `usmap_transform()` and plotted with `plot_usmap() + ggplot2::geom_sf()`. +* Add visual snapshot tests for more resilient plots, see [Issue #80](https://github.com/pdil/usmap/issues/80). +* Add state abbreviation (`abbr`) column to `citypop` data set. +* Update and standardize documentation throughout the page. + * Includes updates to formatting, links, and language. +* Rename vignettes to make them easier to find and read in order. + +### Bug Fixes +* `plot_usmap()` warnings have been cleaned up, including a defunct warning that didn't make sense. + +### Removed +* `output_names` is no longer required as a parameter to `usmap_transform()`. + * It continues to exist for compatibility but produces a warning and may be removed in a future version of `usmap`. + * `usmap_transform()` will output its transformation using the `sf` default of `"geometry"` as the column name. + +# usmap 0.6.4 +Released Monday, December 11, 2023. + +### Improvements +* Replace local state and county FIPS files with `usmapdata::fips_data()`. + * Single source of truth for this data is now housed in `usmapdata`. + * Data will be updated in sync with shapefile updates. + +### Bug Fixes +* FIPS file change resolves issue with Valdez-Cordova Census Area in Alaska, see [Issue #72](https://github.com/pdil/usmap/issues/72). + +### Technical Changes +* Resolve all code-linting warnings. +* Increase test coverage to 100%. + +# usmap 0.6.3 +Released Saturday, October 21, 2023. + +* Update package author email and website. + +# usmap 0.6.2 +Released Tuesday, June 13, 2023. + +### Bug Fixes +* Replace retired packages `maptools` and `rgdal` with `sp` and `sf`, see [Issue #57](https://github.com/pdil/usmap/issues/57) and [Issue #70](https://github.com/pdil/usmap/issues/70). + * Special thanks [@rsbivand](https://github.com/rsbivand). + +# usmap 0.6.1 +Released Saturday, November 12, 2022. + +### Bug Fixes +* Fix failing `plot_usmap` tests, see [Issue #58](https://github.com/pdil/usmap/issues/58). +* Fix `aes_string` and `size` deprecation in ggplot2, see [Issue #59](https://github.com/pdil/usmap/issues/59). + +# usmap 0.6.0 +Released Sunday, February 27, 2022. + +### New Features +* Add `input_names` and `output_names` parameters to `usmap_transform`, see [Issue #33](https://github.com/pdil/usmap/issues/33). +* Add `sortAndRemoveDuplicates` parameter to `fips_info`, see [Issue #47](https://github.com/pdil/usmap/issues/47). + * The default (`FALSE`) value changes existing behavior, to retain existing behavior, change the parameter value to `TRUE`. + +### Improvements +* Improve map resolution. + * More polygons are shown, this has a marginal increase on the data set file sizes but it is negligible. +* Add shape file update history, see [Issue #30](https://github.com/pdil/usmap/issues/30). +* Extract map data frame to external [usmapdata](https://github.com/pdil/usmapdata) package to reduce `usmap` package size, see [Issue #39](https://github.com/pdil/usmap/issues/39). + * All existing functions (including `us_map()`) should continue to work as usual. +* Add data format examples for `plot_usmap` to "Mapping" vignette, see [Issue #42](https://github.com/pdil/usmap/issues/42). + +### Bug Fixes +* Fix CRS warnings, see [Issue #40](https://github.com/pdil/usmap/issues/40). +* Fix `plot_usmap()` issue when provided data has `"values"` column, see [Issue #48](https://github.com/pdil/usmap/issues/48) and [this Stack Overflow question](https://stackoverflow.com/questions/61111024/trouble-using-plot-usmap-function-in-usmap-package). + +# usmap 0.5.2 +Released Wednesday, October 7, 2020. + +* Update links in documentation. + +# usmap 0.5.1 +Released Wednesday, October 7, 2020. + +* New website for the package: https://usmap.dev + * Lightweight landing page containing useful information, links, and examples of usmap usage. +* `state` can now be omitted when using `fips()`. In this case, all available FIPS codes are returned, sorted by state abbreviation, see [Issue #28](https://github.com/pdil/usmap/issues/28). +* `fips` can now be omitted when using `fips_info()`. In this case, all available states are returned, sorted by state abbreviation, see [Issue #28](https://github.com/pdil/usmap/issues/28). +* Fix duplicate coordinates from being removed during `usmap_transform` (if value columns differ), see [Issue #32](https://github.com/pdil/usmap/issues/32). +* Prevent [warnings introduced by `ggplot2` v3.3.0](https://github.com/tidyverse/ggplot2/pull/3346), see [Issue #35](https://github.com/pdil/usmap/issues/35). +* Set minimum R version to 3.5.0. Versions lower than this do not support the latest version of the `rgdal` package. + +# usmap 0.5.0 +Released Friday, September 13, 2019. + +### New Features +* Ability to include county name labels on county maps, see [Issue #14](https://github.com/pdil/usmap/issues/14). + * They currently work the same as state labels except they include the full county name (excluding the word "County"). +* Ability to pass `ggplot2::geom_polygon()` parameters to `plot_usmap()`, see [Issue #15](https://github.com/pdil/usmap/issues/15). + * This is a breaking change and removes the `lines` parameter. The previous defaults of `color="black"`, `fill="white"`, and `size=0.4` are maintained and will be used for any of those parameters that are omitted. + * Refer to the `ggplot2::geom_polygon()` documentation for more information. + * The following aesthetics are supported: `alpha`, `colour`/`color`, `fill`, `linetype`, `size` + * This feature provides more direct control over the appearance of plots. +* Ability to exclude counties and states with new `exclude` parameter in `us_map`, `map_with_data`, and `plot_usmap`, see [Issue #19](https://github.com/pdil/usmap/issues/19). +* New function (`usmap_transform`) to transform longitude/latitude point data frames into coordinate reference system that matches the plotted map, see [Issue #21](https://github.com/pdil/usmap/issues/21). + * Also includes `usmap_crs()` to easily access the coordinate reference system used by the package. + +### Improvements +* In the data frames provided by `us_map()`, `long` and `lat` have been renamed to `x` and `y`, respectively, see [Issue #16](https://github.com/pdil/usmap/issues/16). + * This should not affect the behavior of `plot_usmap()` but will be a breaking change for any code that relies on `us_map()`. +* Added contributing guidelines and templates, see [Issue #24](https://github.com/pdil/usmap/issues/24). + * These can be see in the [.github folder](https://github.com/pdil/usmap/tree/master/.github). + +# usmap 0.4.0 +Released Sunday, September 16, 2018. + +### New Features +* Ability to include state abbreviation labels in state maps, see [Issue #9](https://github.com/pdil/usmap/issues/9). + * e.g. `plot_usmap(labels = TRUE)` +* Add US Census Bureau regional divisions as constants for quick plotting of certain regions. + * e.g. `plot_usmap(include = .northeast_region)` + * The provided regions and divisions can be seen [on this map by the US Census Bureau](https://www2.census.gov/geo/pdfs/maps-data/maps/reference/us_regdiv.pdf). +* Allow ability to include only certain states while viewing county map, see [Issue #11](https://github.com/pdil/usmap/issues/11). + * e.g. `us_map("counties", include = "TX")` or `plot_usmap("counties", include = c("AZ", "NM"))` + +### Improvements +* Vectorize counties in `fips`, see [Issue #10](https://github.com/pdil/usmap/issues/10). + * e.g. `fips("NJ", c("Bergen", "Hudson"))` +* Allow all columns in the data frame that's passed to `map_with_data()` or `plot_usmap()` to be preserved. + +### Bug Fixes +* Add Kusilvak Census Area (FIPS code 02158), replaces Wade Hampton Census Area (FIPS code 02270). + +# usmap 0.3.0 +Released Sunday, June 3, 2018. + +### Improvements +* Update shape files to [2017 versions](https://www.census.gov/geographies/mapping-files/time-series/geo/tiger-line-file.2017.html). +* Improvements to `fips` and `fips_info`: + * Vectorization support (e.g. enter multiple states in `fips` to receive a vector of corresponding FIPS codes) + * e.g. `fips(c("AK", "AL"))` or `fips(c("Alaska", "Alabama"))` + * Mixed abbreviations and full names are also supported: `fips(c("AK", "Alabama"))` + * Improved warning and error messages. +* Allow data to be specified by state abbreviation or full name in `plot_usmap` and `map_with_data` (instead of just by FIPS code). + * The data frame passed to `plot_usmap` or `map_with_data` (via the `data =` parameter), can now be a two column data frame with columns "fips" and "values" or "state" and "values". + +# usmap 0.2.1 +Released Tuesday, August 15, 2017. + +### Improvements +* Standardize documentation language. +* Improve descriptiveness of error messages and warnings. +### Bug Fixes +* Allow data passed to `map_with_data` and `plot_usmap` to contain FIPS codes with missing leading zeros. + * This usually occurs when the codes are read as `numeric` from a `.csv` file. + +# usmap 0.2.0 +Released Saturday, April 29, 2017. + +* Add `map_with_data` function for adding user-defined data to map data. +* Add ability to plot map with data automatically (utilizes new `map_with_data` function). + +# usmap 0.1.0 +Released Sunday, January 29, 2017. + +* First release + +### Main features + +* Retrieve US map data frame for merging with data and plotting +* Lookup FIPS codes for states and counties (reverse-lookup as well) +* Map plotting convenience method (uses `ggplot2`) diff --git a/check/usmap.Rcheck/00_pkg_src/usmap/R/data.R b/check/usmap.Rcheck/00_pkg_src/usmap/R/data.R new file mode 100644 index 0000000..b2d6814 --- /dev/null +++ b/check/usmap.Rcheck/00_pkg_src/usmap/R/data.R @@ -0,0 +1,194 @@ +#' Population estimates (2022), county level +#' +#' @description US census population estimates by county for 2022. \cr\cr +#' The data is formatted for easy merging with output from [usmap::us_map()]. +#' +#' @usage data(countypop) +#' +#' @details +#' \itemize{ +#' \item \code{fips} The 5-digit FIPS code corresponding to the county. +#' \item \code{abbr} The 2-letter state abbreviation. +#' \item \code{county} The full county name. +#' \item \code{pop_2022} The 2022 population estimate (in number of people) +#' for the corresponding county. +#' } +#' +#' @name countypop +#' @format A data frame with 3222 rows and 4 variables. +#' @docType data +#' @references +#' \itemize{ +#' \item \url{https://www.census.gov/programs-surveys/popest.html} +#' \item \url{https://www.ers.usda.gov/data-products/county-level-data-sets} +#' } +#' @keywords data +"countypop" + +#' Population estimates (2022), state level +#' +#' @description US census population estimates by state for 2022. \cr\cr +#' The data is formatted for easy merging with output from [usmap::us_map()]. +#' +#' @usage data(statepop) +#' +#' @details +#' \itemize{ +#' \item \code{fips} The 2-digit FIPS code corresponding to the state. +#' \item \code{abbr} The 2-letter state abbreviation. +#' \item \code{full} The full state name. +#' \item \code{pop_2022} The 2022 population estimate (in number of people) +#' for the corresponding state. +#' } +#' +#' @name statepop +#' @format A data frame with 52 rows and 4 variables. +#' @docType data +#' @references +#' \itemize{ +#' \item \url{https://www.census.gov/programs-surveys/popest.html} +#' \item \url{https://www.ers.usda.gov/data-products/county-level-data-sets} +#' } +#' @keywords data +"statepop" + +#' Poverty percentage estimates (2021), county level +#' +#' @description US census poverty percentage estimates by county for 2021. \cr\cr +#' The data is formatted for easy merging with output from [usmap::us_map()]. +#' +#' @usage data(countypov) +#' +#' @details +#' \itemize{ +#' \item \code{fips} The 5-digit FIPS code corresponding to the county. +#' \item \code{abbr} The 2-letter state abbreviation. +#' \item \code{county} The full county name. +#' \item \code{pct_pov_2021} The 2021 poverty estimate (in percent of county population) +#' for the corresponding county. +#' } +#' +#' @name countypov +#' @format A data frame with 3194 rows and 4 variables. +#' @docType data +#' @references +#' \itemize{ +#' \item \url{https://www.census.gov/topics/income-poverty/poverty.html} +#' \item \url{https://www.ers.usda.gov/data-products/county-level-data-sets} +#' } +#' @keywords data +"countypov" + +#' Poverty percentage estimates (2021), state level +#' +#' @description US census poverty percentage estimates by state for 2021. \cr\cr +#' The data is formatted for easy merging with output from [usmap::us_map()]. +#' +#' @usage data(statepov) +#' +#' @details +#' \itemize{ +#' \item \code{fips} The 2-digit FIPS code corresponding to the state. +#' \item \code{abbr} The 2-letter state abbreviation. +#' \item \code{full} The full state name. +#' \item \code{pct_pov_2021} The 2021 poverty estimate (in percent of state population) +#' for the corresponding state +#' } +#' +#' @name statepov +#' @format A data frame with 51 rows and 4 variables. +#' @docType data +#' @references +#' \itemize{ +#' \item \url{https://www.census.gov/topics/income-poverty/poverty.html} +#' \item \url{https://www.ers.usda.gov/data-products/county-level-data-sets} +#' } +#' @keywords data +"statepov" + +#' Most populous city in each state (2010) +#' +#' @description The most populous city in each US state, as of the 2010 US Census.\cr\cr +#' The data is formatted for transforming with [usmap::usmap_transform()]. +#' Once the longitude and latitude is transformed, it can be added to +#' [usmap::plot_usmap()] using [ggplot2::ggplot()] layers. +#' +#' @usage data(citypop) +#' +#' @details +#' \itemize{ +#' \item \code{lon} The longitude of the most populous city. +#' \item \code{lat} The latitude of the most populous city. +#' \item \code{state} The name of the state containing the city. +#' \item \code{abbr} The abbreviation of the state containing the city. +#' \item \code{most_populous_city} The name of the city. +#' \item \code{city_pop} The population of the city. +#' } +#' +#' @name citypop +#' @format A data frame with 51 rows and 5 variables. +#' @docType data +#' @references +#' \itemize{ +#' \item \url{https://www.census.gov/programs-surveys/decennial-census/decade.2010.html} +#' } +#' @keywords data +"citypop" + +#' Earthquakes (2019) +#' +#' @description US earthquakes with a magnitude of 2.5 or greater, occurring in the +#' first half of 2019, from January 1 to June 30, from USGS.\cr\cr +#' The data is formatted for transforming with [usmap::usmap_transform()]. +#' Once the longitude and latitude is transformed, it can be added to +#' [usmap::plot_usmap()] using [ggplot2::ggplot()] layers. +#' +#' @usage data(earthquakes) +#' +#' @details +#' \itemize{ +#' \item \code{lon} The longitude of the earthquake's location. +#' \item \code{lat} The latitude of the earthquake's location. +#' \item \code{mag} The magnitude of the earthquake. +#' } +#' +#' @name earthquakes +#' @format A data frame with 2254 rows and 3 variables. +#' @docType data +#' @references +#' \itemize{ +#' \item \url{https://www.usgs.gov/programs/earthquake-hazards/earthquakes} +#' \item \url{https://earthquake.usgs.gov/earthquakes/search/} +#' } +#' @keywords data +"earthquakes" + +#' US Major Rivers (2010) +#' +#' @description Major rivers in the United States.\cr\cr +#' The data is can be transformed with [usmap::usmap_transform()]. +#' Once the `Shape` strings are transformed, it can be added to +#' [plot_usmap()] using a [ggplot2::geom_sf()] layer. +#' +#' @usage data(usrivers) +#' +#' @details +#' \itemize{ +#' \item \code{NAME} The name of the river. +#' \item \code{SYSTEM} The system the river belongs to. +#' \item \code{MILES} The length of the river in miles. +#' \item \code{Shape_Length} The length of the river in the coordinate system. +#' \item \code{Shape} The MULTILINESTRING features depicting the river, for plotting. +#' } +#' +#' @name usrivers +#' @format A simple features (sf) data frame with 55 rows and 5 variables. +#' @docType data +#' @references +#' \itemize{ +#' \item \url{https://www.arcgis.com/home/item.html?id=290e4ab8a07f4d2c8392848d011add32#!} +#' \item Sources: Esri; Rand McNally; Bartholemew and Times Books; +#' Digital Chart of the World (DCW), U.S. National Geospatial-Intelligence Agency (NGA); i-cubed +#' } +#' @keywords data +"usrivers" diff --git a/check/usmap.Rcheck/00_pkg_src/usmap/R/fips.R b/check/usmap.Rcheck/00_pkg_src/usmap/R/fips.R new file mode 100644 index 0000000..5972b4a --- /dev/null +++ b/check/usmap.Rcheck/00_pkg_src/usmap/R/fips.R @@ -0,0 +1,223 @@ +#' Retrieve FIPS code for either a US state or county +#' +#' @description Each US state and county has a unique FIPS +#' (Federal Information Processing Standards) code. Use +#' this function to obtain the FIPS code for a state or +#' county. +#' +#' @param state The state(s) for which to obtain a FIPS code(s). +#' Can be entered as either a state abbreviation or full name (case-insensitive). +#' +#' `state` can be entered as either a single state or a vector of states. +#' If `state` is a vector, `county` must be omitted. +#' +#' @param county The county for which to obtain a FIPS code. +#' Can be entered with or without "county" (case-insensitive). +#' +#' @param data_year The year for which to obtain FIPS data. If the value is NULL, +#' the most recent year's data is used. If the provided year is not found from +#' the available map data sets, the next most recent year's data is used. +#' The default is NULL, i.e. the most recent available year is used. +#' +#' @note A `state` must be included when searching for `county`, +#' otherwise multiple results may be returned for duplicate county names. +#' +#' @details State and county FIPS (Federal Information Processing Standards) are +#' two and five digit codes, respectively. They uniquely identify all states and +#' counties within the United States. The first two digits of the five digit county +#' codes correspond to the state that the county belongs to. FIPS codes also exist +#' for US territories and minor outlying islands, though this package only provides +#' information for the 50 US states (and their associated counties and +#' census designated areas). +#' +#' @return The FIPS code(s) of given `state` or `county`. +#' +#' If only states are entered, a vector of length equal to the number of states +#' is returned. If any states are not found or are invalid, `NA` is returned in their place. +#' +#' If a state and county are entered, a single value with the FIPS code +#' for the given county is returned. If the county is invalid for the given state, +#' an error is thrown. +#' +#' If both `state` and `county` are omitted, the entire list of available FIPS +#' codes is returned, sorted by the state's abbreviation (e.g. Alaska (AK) comes +#' before Alabama (AL)). +#' +#' @seealso [fips_info()] +#' +#' @examples +#' fips() +#' +#' fips("NJ") +#' fips("California") +#' +#' fips(c("AK", "CA", "UT")) +#' +#' fips("CA", county = "orange") +#' fips(state = "AL", county = "autauga") +#' fips(state = "Alabama", county = "Autauga County") +#' @export +fips <- function(state, county = c(), data_year = NULL) { + if (missing(state) && missing(county)) { + return(usmapdata::fips_data(data_year = data_year)$fips) + } + + state_ <- tolower(state) + county_ <- tolower(county) + + if (length(county_) == 0) { + df <- usmapdata::fips_data(data_year = data_year) + abbr <- tolower(df$abbr) + full <- tolower(df$full) + fips2 <- c(df$fips, df$fips) + + result <- fips2[match(state_, c(abbr, full))] + result[result == "NA"] <- NA + result + } else { + if (length(state_) > 1) { + stop("`county` parameter cannot be used with multiple states.") + } + + df <- usmapdata::fips_data("counties", data_year = data_year) + name <- tolower(df$county) + state_abbr <- tolower(df$abbr) + state_full <- tolower(df$full) + + result <- c() + + for (county_i in county_) { + result <- c( + result, + df$fips[which( + (name %in% county_i | name %in% paste(county_i, "county")) & + (state_abbr %in% state_ | state_full %in% state_) + )] + ) + } + + if (length(result) == 0) { + if (length(county) == 1) { + stop(paste0(county, " is not a valid county in ", state, ".\n")) + } else { + stop(paste0(county, " are not valid counties in ", state, ".\n")) + } + } else { + result + } + } +} + +#' Retrieve states or counties using FIPS codes +#' +#' @param fips A one to five digit, either \code{numeric} +#' or \code{character}, vector of FIPS codes for which to look up states or counties. +#' States have a two digit FIPS code and counties have a five digit FIPS +#' code (where the first 2 numbers pertain to the state). +#' +#' @param sortAndRemoveDuplicates Whether or not to sort the output and remove +#' duplicates. By default, the output will be returned in the order of +#' the values provided to the \code{fips} parameter. Set this parameter to \code{TRUE} +#' to return the output sorted by FIPS with a single instance of each FIPS. +#' +#' @param data_year The year for which to obtain FIPS data. If the value is NULL, +#' the most recent year's data is used. If the provided year is not found from +#' the available map data sets, the next most recent year's data is used. +#' The default is NULL, i.e. the most recent available year is used. +#' +#' @return A data frame with the states or counties and the associated +#' FIPS codes. +#' +#' If `fips` is omitted, the data frame containing all available states is +#' returned. +#' +#' @seealso [fips()] +#' +#' @examples +#' fips_info(2) +#' fips_info("2") +#' fips_info(c("02", "03", "04")) +#' +#' fips_info(2016) +#' fips_info(c("02016", "02017"), sortAndRemoveDuplicates = TRUE) +#' +#' @rdname fips_info +#' @export +fips_info <- function(fips, sortAndRemoveDuplicates = FALSE, data_year = NULL) { + if (missing(fips)) { + fips_info.character(usmap::fips(data_year = data_year)) + } else { + UseMethod("fips_info", fips) + } +} + +#' @rdname fips_info +#' @export +fips_info.numeric <- function(fips, sortAndRemoveDuplicates = FALSE, data_year = NULL) { + if (all(fips >= 1001 & fips <= 56043)) { + fips_ <- sprintf("%05d", fips) + } else if (all(fips >= 1 & fips <= 56)) { + fips_ <- sprintf("%02d", fips) + } else { + stop("Invalid FIPS code(s), must be either 2 digit (states) or 5 digit (counties), but not both.") + } + + get_fips_info(fips_, sortAndRemoveDuplicates, data_year = data_year) +} + +#' @rdname fips_info +#' @export +fips_info.character <- function(fips, sortAndRemoveDuplicates = FALSE, data_year = NULL) { + if (all(nchar(fips) %in% 4:5)) { + fips_ <- sprintf("%05s", fips) + } else if (all(nchar(fips) %in% 1:2)) { + fips_ <- sprintf("%02s", fips) + } else { + stop("Invalid FIPS code, must be either 2 digit (states) or 5 digit (counties), but not both.") + } + + get_fips_info(fips_, sortAndRemoveDuplicates, data_year = data_year) +} + +#' Gets FIPS info for either states or counties depending on input. +#' Helper function for S3 method [fips_info()]. +#' @keywords internal +get_fips_info <- function(fips, sortAndRemoveDuplicates, data_year = NULL) { + if (all(nchar(fips) == 2)) { + df <- usmapdata::fips_data(data_year = data_year) + columns <- c("abbr", "fips", "full") + } else if (all(nchar(fips) == 5)) { + df <- usmapdata::fips_data("counties", data_year = data_year) + columns <- c("full", "abbr", "county", "fips") + } + + if (sortAndRemoveDuplicates) { + result <- df[df$fips %in% fips, ] + } else { + result <- static_merge(data.frame(fips = fips), df) + } + + if (nrow(result) == 0) { + # Present warning if no results found. + warning(paste("FIPS code(s)", toString(fips), "not found, returned 0 results.")) + } else if (!all(fips %in% result$fips)) { + # Present warning if any FIPS codes included are not found. + excluded_fips <- fips[which(!fips %in% result$fips)] + warning(paste("FIPS code(s)", toString(excluded_fips), "not found")) + } + + rownames(result) <- NULL + result[, columns] +} + +#' Merge while maintaining original sort order +#' +#' Internal function used by [fips_info()]. +#' +#' @seealso \url{https://stackoverflow.com/a/61560405/7264964} +#' @keywords internal +static_merge <- function(x, y, ...) { + x$join_id_ <- seq_len(nrow(x)) + joined <- merge(x = x, y = y, sort = FALSE, ...) + joined[order(joined$join_id), colnames(joined) != "join_id_"] +} diff --git a/check/usmap.Rcheck/00_pkg_src/usmap/R/join-data.R b/check/usmap.Rcheck/00_pkg_src/usmap/R/join-data.R new file mode 100644 index 0000000..49ae945 --- /dev/null +++ b/check/usmap.Rcheck/00_pkg_src/usmap/R/join-data.R @@ -0,0 +1,101 @@ +#' Join county or state level data to US map data +#' +#' @inheritParams us_map +#' @param data The data that should be joined to a US map. This +#' parameter should be a data frame consisting of two columns, +#' a fips code (2 characters for state, 5 characters for county) +#' and the value that should be associated with that region. The +#' columns of `data` _must_ be `fips` or `state` and +#' the value of the `values` parameter. If both `fips` and `state` +#' are provided, this function uses the `fips`. +#' @param values The name of the column that contains the values to be associated +#' with a given region. The default is `"values"`. +#' @param na The value to be inserted for states or counties that don't have +#' a value in `data`. This value must be of the same type as the `value` +#' column of `data`. +#' +#' @return A data frame composed of the map data frame (from [us_map()]) except +#' an extra column containing the values in `data` is included. +#' +#' The result can be plotted using [ggplot2::ggplot()] or [plot_usmap()]. +#' +#' @seealso [plot_usmap()] +#' +#' @examples +#' state_data <- data.frame(fips = c("01", "02", "04"), values = c(1, 5, 8)) +#' df <- map_with_data(state_data, na = 0) +#' +#' state_data <- data.frame(state = c("AK", "CA", "Utah"), values = c(6, 9, 3)) +#' df <- map_with_data(state_data, na = 0) +#' +#' @export +map_with_data <- function( + data, + values = "values", + include = c(), + exclude = c(), + na = NA, + data_year = NULL +) { + if (!is.data.frame(data)) { + stop("`data` must be a data frame") + } + + if (nrow(data) == 0) { + if (length(include) == 0) { + region_type <- "state" + } else { + region_type <- ifelse(nchar(include[1]) == 2, "state", "county") + } + + warning(paste("`data` is empty, returning basic", region_type, "US map data frame")) + return(usmap::us_map(regions = region_type, include = include, exclude = exclude, data_year = data_year)) + } + + if (!(values %in% names(data))) { + stop(paste0("\"", values, "\" column not found in `data`.")) + } + + if ("fips" %in% names(data)) { + # do nothing + } else if ("state" %in% names(data)) { + # convert to fips + data$fips <- usmap::fips(data$state, data_year = data_year) + } else { + # error + stop("`data` must be a data.frame containing either a `state` or `fips` column.") + } + + data$fips <- as.character(data$fips) + + region_type <- ifelse(nchar(data$fips[1]) <= 2, "state", "county") + map_df <- usmap::us_map( + regions = region_type, + include = include, + exclude = exclude, + data_year = data_year + ) + + # Remove columns in data that are already in map_df + data$abbr <- NULL + data$full <- NULL + data$county <- NULL + data$geom <- NULL + # + + padding <- ifelse(region_type == "state", 2, 5) + data$fips <- sprintf(paste0("%0", padding, "d"), as.numeric(data$fips)) + + result <- merge(map_df, data, by = "fips", all.x = TRUE, sort = FALSE) + result[is.na(result[, values]), values] <- na + + result <- result[, c(setdiff(names(result), names(data)), names(data))] + + if (region_type == "state") { + result <- result[order(result$full), ] + } else { + result <- result[order(result$full, result$county), ] + } + + result +} diff --git a/check/usmap.Rcheck/00_pkg_src/usmap/R/plot-map.R b/check/usmap.Rcheck/00_pkg_src/usmap/R/plot-map.R new file mode 100644 index 0000000..8926ab8 --- /dev/null +++ b/check/usmap.Rcheck/00_pkg_src/usmap/R/plot-map.R @@ -0,0 +1,197 @@ +#' Conveniently plot basic US map +#' +#' @inheritParams us_map +#' @param data A data frame containing values to plot on the map. This +#' parameter should be a data frame consisting of two columns, +#' a FIPS code (2 characters for state, 5 characters for county) +#' and the value that should be associated with that region. The +#' columns of `data` _must_ be `fips` or `state` and +#' the value of the `values` parameter. +#' @param values The name of the column that contains the values to be associated +#' with a given region. The default is `"value"`. +#' @param theme The theme that should be used for plotting the map. The default +#' is `theme_map` from [ggthemes](https://github.com/jrnold/ggthemes). +#' @param labels Whether or not to display labels on the map. Labels are not displayed +#' by default. +#' @param label_color The color of the labels to display. Corresponds to the `color` +#' option in the [ggplot2::aes()] mapping. The default is `"black"`. +#' [Click here](https://usmap.dev/docs/Rcolor.pdf) +#' for more color options. +#' @param ... Other arguments to pass to [ggplot2::aes()]. These are +#' often aesthetics, used to set an aesthetic to a fixed value, like `color = "red"` +#' or `linewidth = 3`. They affect the appearance of the polygons used to render +#' the map (for example fill color, line color, line thickness, etc.). If any of +#' `color`/`colour`, `fill`, or `linewidth` are not specified they +#' are set to their default values of `color="black"`, `fill="white"`, +#' and `linewidth=0.4`. +#' +#' @return A [ggplot2::ggplot] object that contains a basic +#' US map with the described parameters. Since the result is a `ggplot` +#' object, it can be extended with more [ggplot2::Geom] layers, scales, labels, +#' themes, etc. +#' +#' @details +#' By default, Puerto Rico is not plotted unless it is specifically included +#' via `include = c("PR")` etc. The default behavior can be changed by setting +#' the environment variable `USMAP_DEFAULT_EXCLUDE_PR = FALSE`. +#' +#' @seealso [usmap], [ggplot2::theme()] +#' +#' @examples +#' plot_usmap() +#' plot_usmap(regions = "states") +#' plot_usmap(regions = "counties") +#' plot_usmap(regions = "state") +#' plot_usmap(regions = "county") +#' +#' # Output is ggplot object so it can be extended +#' # with any number of ggplot layers +#' library(ggplot2) +#' plot_usmap(include = c("CA", "NV", "ID", "OR", "WA")) + +#' labs(title = "Western States") +#' +#' # Color maps with data +#' plot_usmap(data = statepop, values = "pop_2022") +#' +#' # Include labels on map (e.g. state abbreviations) +#' plot_usmap(data = statepop, values = "pop_2022", labels = TRUE) +#' # Choose color for labels +#' plot_usmap(data = statepop, values = "pop_2022", labels = TRUE, label_color = "white") +#' +#' @importFrom rlang .data +#' @export +plot_usmap <- function( + regions = c("states", "state", "counties", "county"), + include = c(), + exclude = c(), + data = data.frame(), + values = "values", + theme = theme_map(), + labels = FALSE, + label_color = "black", + data_year = NULL, + ... +) { + # check for ggplot2 + if (!requireNamespace("ggplot2", quietly = TRUE)) { + stop("`ggplot2` must be installed to use `plot_usmap`. + Use: install.packages(\"ggplot2\") and try again.") + } + + .data <- ggplot2::.data + + # exclude PR by default if env variable is not `FALSE` + if (Sys.getenv("USMAP_DEFAULT_EXCLUDE_PR", unset = TRUE) == TRUE && + !("PR" %in% include || "72" %in% include)) { + exclude <- unique(c(exclude, "PR", "72")) + } + + # parse parameters + regions <- match.arg(regions) + geom_args <- list(...) + + # set geom_polygon defaults + if (is.null(geom_args[["colour"]]) && is.null(geom_args[["color"]])) { + geom_args[["color"]] <- "black" + } + + if (is.null(geom_args[["linewidth"]])) { + geom_args[["linewidth"]] <- 0.4 + } + + # set default "fill" if data is not included + if (is.null(geom_args[["fill"]]) && nrow(data) == 0) { + geom_args[["fill"]] <- "white" + } + + # create polygon layer + if (nrow(data) == 0) { + map_df <- usmap::us_map(regions = regions, include = include, exclude = exclude, data_year = data_year) + geom_args[["mapping"]] <- ggplot2::aes() + } else { + map_df <- usmap::map_with_data(data, values = values, include = include, exclude = exclude, data_year = data_year) + + if (!is.null(map_df$county)) regions <- "counties" + geom_args[["mapping"]] <- ggplot2::aes(fill = .data[[values]]) + } + + polygon_layer <- do.call(ggplot2::geom_sf, geom_args) + + # create label layer + if (labels) { + if (regions == "state") regions <- "states" + else if (regions == "county") regions <- "counties" + + centroid_labels <- usmapdata::centroid_labels(regions, data_year = data_year) + + # remove excluded items that are in `include` + exclude <- setdiff(exclude, include) + + # remove excludes + if (length(exclude) > 0) { + centroid_labels <- centroid_labels[!( + centroid_labels$full %in% exclude | + centroid_labels$abbr %in% exclude | + centroid_labels$fips %in% exclude | + substr(centroid_labels$fips, 1, 2) %in% exclude + ), ] + } + + # remove non-includes + if (length(include) > 0) { + centroid_labels <- centroid_labels[ + centroid_labels$full %in% include | + centroid_labels$abbr %in% include | + centroid_labels$fips %in% include, + ] + } + + if (regions == "county" || regions == "counties") { + label_layer <- ggplot2::geom_sf_text( + data = centroid_labels, + ggplot2::aes(label = sub(" County", "", .data$county)), + color = label_color + ) + } else { + label_layer <- ggplot2::geom_sf_text( + data = centroid_labels, + ggplot2::aes(label = .data$abbr), color = label_color + ) + } + } else { + label_layer <- ggplot2::geom_blank() + } + + # construct final plot + ggplot2::ggplot(data = map_df) + polygon_layer + label_layer + theme +} + +#' Convenient theme map +#' +#' @description +#' This creates a nice map theme for use in [plot_usmap()]. +#' It originated from the `ggthemes` package located at this repository: +#' \url{https://github.com/jrnold/ggthemes}. +#' +#' This function was manually rewritten here to avoid the need for +#' another package import. +#' +#' @keywords internal +theme_map <- function(base_size = 9, base_family = "") { + element_blank <- ggplot2::element_blank() + `%+replace%` <- ggplot2::`%+replace%` # nolint: object_name_linter + unit <- ggplot2::unit + + ggplot2::theme_bw(base_size = base_size, base_family = base_family) %+replace% + ggplot2::theme(axis.line = element_blank, + axis.text = element_blank, + axis.ticks = element_blank, + axis.title = element_blank, + panel.background = element_blank, + panel.border = element_blank, + panel.grid = element_blank, + panel.spacing = unit(0, "lines"), + plot.background = element_blank, + legend.position = "inside", + legend.justification.inside = c(0, 0)) +} diff --git a/check/usmap.Rcheck/00_pkg_src/usmap/R/regions.R b/check/usmap.Rcheck/00_pkg_src/usmap/R/regions.R new file mode 100644 index 0000000..cac48dd --- /dev/null +++ b/check/usmap.Rcheck/00_pkg_src/usmap/R/regions.R @@ -0,0 +1,202 @@ +#' New England census division +#' +#' @description +#' US Census Bureau regional division containing Connecticut, Maine, +#' Massachusetts, New Hampshire, Rhode Island, and Vermont. +#' +#' @details +#' See +#' \url{https://www2.census.gov/geo/pdfs/maps-data/maps/reference/us_regdiv.pdf} +#' +#' @examples +#' plot_usmap(include = .new_england, labels = TRUE) +#' @export +.new_england <- c("CT", "MA", "ME", "NH", "RI", "VT") +#' Mid-Atlantic census division +#' +#' @description +#' US Census Bureau regional division containing New Jersey, New York, +#' and Pennsylvania. +#' +#' @details +#' See +#' \url{https://www2.census.gov/geo/pdfs/maps-data/maps/reference/us_regdiv.pdf} +#' +#' @examples +#' plot_usmap(include = .mid_atlantic, labels = TRUE) +#' @export +.mid_atlantic <- c("NJ", "NY", "PA") + +#' East North Central census division +#' +#' @description +#' US Census Bureau regional division containing Illinois, Indiana, Michigan, +#' Ohio, and Wisconsin. +#' +#' @details +#' See +#' \url{https://www2.census.gov/geo/pdfs/maps-data/maps/reference/us_regdiv.pdf} +#' +#' @examples +#' plot_usmap(include = .east_north_central, labels = TRUE) +#' @export +.east_north_central <- c("IL", "IN", "MI", "OH", "WI") +#' West North Central census division +#' +#' @description +#' US Census Bureau regional division containing Iowa, Kansas, Minnesota, +#' Missouri, Nebraska, North Dakota, and South Dakota. +#' +#' @details +#' See +#' \url{https://www2.census.gov/geo/pdfs/maps-data/maps/reference/us_regdiv.pdf} +#' +#' @examples +#' plot_usmap(include = .west_north_central, labels = TRUE) +#' @export +.west_north_central <- c("IA", "KS", "MN", "MO", "NE", "ND", "SD") + +#' South Atlantic census division +#' +#' @description +#' US Census Bureau regional division containing Delaware, Florida, Georgia, +#' Maryland, North Carolina, South Carolina, Virginia, +#' District of Columbia, and West Virginia. +#' +#' @details +#' See +#' \url{https://www2.census.gov/geo/pdfs/maps-data/maps/reference/us_regdiv.pdf} +#' +#' @examples +#' plot_usmap(include = .south_atlantic, labels = TRUE) +#' @export +.south_atlantic <- c("DC", "DE", "FL", "GA", "MD", "NC", "SC", "VA", "WV") +#' East South Central census division +#' +#' @description +#' US Census Bureau regional division containing Alabama, Kentucky, +#' Mississippi, and Tennessee. +#' +#' @details +#' See +#' \url{https://www2.census.gov/geo/pdfs/maps-data/maps/reference/us_regdiv.pdf} +#' +#' @examples +#' plot_usmap(include = .east_south_central, labels = TRUE) +#' @export +.east_south_central <- c("AL", "KY", "MS", "TN") +#' West South Central census division +#' +#' @description +#' US Census Bureau regional division containing Arkansas, Louisiana, Oklahoma, +#' and Texas. +#' +#' @details +#' See +#' \url{https://www2.census.gov/geo/pdfs/maps-data/maps/reference/us_regdiv.pdf} +#' +#' @examples +#' plot_usmap(include = .west_south_central, labels = TRUE) +#' @export +.west_south_central <- c("AR", "LA", "OK", "TX") + +#' Mountain census division +#' +#' @description +#' US Census Bureau regional division containing Arizona, Colorado, Idaho, +#' Montana, Nevada, New Mexico, Utah, and Wyoming. +#' +#' @details +#' See +#' \url{https://www2.census.gov/geo/pdfs/maps-data/maps/reference/us_regdiv.pdf} +#' +#' @examples +#' plot_usmap(include = .mountain, labels = TRUE) +#' @export +.mountain <- c("AZ", "CO", "ID", "MT", "NV", "NM", "UT", "WY") +#' Pacific census division +#' +#' @description +#' US Census Bureau regional division containing Alaska, California, Hawaii, +#' Oregon, and Washington. +#' +#' @details +#' See +#' \url{https://www2.census.gov/geo/pdfs/maps-data/maps/reference/us_regdiv.pdf} +#' +#' @examples +#' plot_usmap(include = .pacific, labels = TRUE) +#' @export +.pacific <- c("AK", "CA", "HI", "OR", "WA") + +#' Northeast census region +#' +#' @description +#' US Census Bureau region containing the New England and Mid-Atlantic +#' divisions. +#' +#' @details +#' See +#' \url{https://www2.census.gov/geo/pdfs/maps-data/maps/reference/us_regdiv.pdf} +#' +#' @examples +#' plot_usmap(include = .northeast_region, labels = TRUE) +#' @export +.northeast_region <- c(.new_england, .mid_atlantic) +#' North-Central census region +#' +#' @description +#' Former US Census Bureau region containing the East North Central and West +#' North Central divisions. This region has been designated as "Midwest" +#' since June 1984. +#' +#' @details +#' See +#' \url{https://www2.census.gov/geo/pdfs/maps-data/maps/reference/us_regdiv.pdf} +#' +#' @examples +#' plot_usmap(include = .north_central_region, labels = TRUE) +#' @export +.north_central_region <- c(.east_north_central, .west_north_central) +#' Midwest census region +#' +#' @description +#' US Census Bureau region containing the East North Central and West +#' North Central divisions. This region was designated as "North Central Region" +#' prior to June 1984. +#' +#' @details +#' See +#' \url{https://www2.census.gov/geo/pdfs/maps-data/maps/reference/us_regdiv.pdf} +#' +#' @examples +#' plot_usmap(include = .midwest_region, labels = TRUE) +#' @export +.midwest_region <- .north_central_region +#' South census region +#' +#' @description +#' US Census Bureau region containing the South Atlantic, East South Central, +#' and West South Central divisions. +#' +#' @details +#' See +#' \url{https://www2.census.gov/geo/pdfs/maps-data/maps/reference/us_regdiv.pdf} +#' +#' @examples +#' plot_usmap(include = .midwest_region, labels = TRUE) +#' @export +.south_region <- c(.south_atlantic, .east_south_central, .west_south_central) +#' West census region +#' +#' @description +#' US Census Bureau region containing the Mountain and Pacific divisions. +#' +#' @details +#' See +#' \url{https://www2.census.gov/geo/pdfs/maps-data/maps/reference/us_regdiv.pdf} +#' +#' @examples +#' plot_usmap(include = .midwest_region, labels = TRUE) +#' @export +.west_region <- c(.mountain, .pacific) diff --git a/check/usmap.Rcheck/00_pkg_src/usmap/R/transform.R b/check/usmap.Rcheck/00_pkg_src/usmap/R/transform.R new file mode 100644 index 0000000..f4765a4 --- /dev/null +++ b/check/usmap.Rcheck/00_pkg_src/usmap/R/transform.R @@ -0,0 +1,161 @@ +#' Convert spatial data to usmap projection +#' +#' @description Converting a spatial object of map coordinates will +#' allow those points to line up with the regular usmap plot by applying +#' the same US National Atlas Equal Area projection (including Alaska and +#' Hawaii of course) to those points as well. +#' +#' The input `data` is assumed to contain longitude and latitude coordinates +#' by default. If this is not the case, provide an [sf::st_crs] object +#' to the `crs` parameter with the appropriate coordinate reference system. +#' +#' @param data A data frame containing coordinates in a two column format +#' where the first column represents longitude and the second data frame +#' represents latitude. The names of the data frame column do not matter, +#' just that the order of the columns is kept intact. +#' +#' @param ... Additional parameters passed onto [sf::st_as_sf]. +#' By default, `crs = sf::st_crs(4326)` is used, implying longitude and latitude +#' coordinates. +#' +#' @param input_names A character vector of length two which specifies the +#' longitude and latitude columns of the input data (the ones that should be +#' transformed), respectively. Only required if the input data is +#' a `data.frame` object. Defaults to `c("lon", "lat")`. +#' +#' @param output_names Defunct, this parameter is no longer used. The output +#' of this function will have a column named `"geometry"` with the transformed +#' coordinates. This parameter may be removed in a future version. +#' +#' @return An `sf` object containing the transformed coordinates from the +#' input data frame with the US National Atlas Equal Area projection applied. +#' The transformed columns will be appended to the data frame so that all +#' original columns should remain intact. + +#' @examples +#' data <- data.frame( +#' lon = c(-74.01, -95.36, -118.24, -87.65, -134.42, -157.86), +#' lat = c(40.71, 29.76, 34.05, 41.85, 58.30, 21.31), +#' pop = c(8398748, 2325502, 3990456, 2705994, 32113, 347397) +#' ) +#' +#' # Transform data +#' transformed_data <- usmap_transform(data) +#' +#' # Plot transformed data on map +#' library(ggplot2) +#' +#' plot_usmap() + geom_sf( +#' data = transformed_data, +#' aes(size = pop), +#' color = "red", alpha = 0.5 +#' ) +#' +#' @rdname usmap_transform +#' @export +usmap_transform <- function(data, ...) { + UseMethod("usmap_transform") +} + +#' @rdname usmap_transform +#' @export +usmap_transform.sf <- function(data, ...) { + perform_transform(data, ...) +} + +#' @rdname usmap_transform +#' @export +usmap_transform.data.frame <- function( + data, + ..., + input_names = c("lon", "lat"), + output_names = NULL +) { + # ensure input is data.frame + data <- as.data.frame(data) + + # validation + if (length(input_names) != 2 && !any(is.na(as.character(input_names)))) { + stop("`input_names` must be a character vector of length 2.") + } else { + input_names <- as.character(input_names) + } + + if (!all(input_names %in% colnames(data))) { + stop("All `input_names` must exist as column names in `data`.") + } + + if (ncol(data) < 2 || + !is.numeric(data[, input_names[1]]) || + !is.numeric(data[, input_names[2]])) { + stop("`data` must contain at least two numeric columns.") + } + + if (!is.null(output_names)) { + warning("`output_names` is no longer used. This parameter will be removed in a future version of `usmap`.") + } + + # convert to sf and perform transformation + data <- sf::st_as_sf(data, coords = input_names) + perform_transform(data, ...) +} + +#' Transform `sf` coordinates to `usmap` transform +#' +#' Internal function with common functionality for transforming coordinates. +#' Using this function directly is not recommended. +#' +#' @keywords internal +perform_transform <- function(data, ...) { + data_sf <- sf::st_as_sf(data, ...) + + if (is.na(sf::st_crs(data_sf))) { + crs <- list(...)[["crs"]] + if (is.null(crs)) crs <- sf::st_crs(4326) + sf::st_crs(data_sf) <- crs + } + + # Transform to canonical projection + transformed <- sf::st_transform(data_sf, usmap_crs()) + sf::st_agr(transformed) <- "constant" + + # Transform Alaska points + ak_bbox <- usmapdata:::alaska_bbox() + alaska <- sf::st_intersection(transformed, ak_bbox) + alaska <- usmapdata:::transform_alaska(alaska) + + # Transform Hawaii points + hi_bbox <- usmapdata:::hawaii_bbox() + hawaii <- sf::st_intersection(transformed, hi_bbox) + hawaii <- usmapdata:::transform_hawaii(hawaii) + + # Transform Hawaii points + pr_bbox <- usmapdata:::puerto_rico_bbox() + puerto_rico <- sf::st_intersection(transformed, pr_bbox) + puerto_rico <- usmapdata:::transform_puerto_rico(puerto_rico) + + # Re-combine all points + transformed_excl_ak <- sf::st_difference(transformed, ak_bbox) + sf::st_agr(transformed_excl_ak) <- "constant" + + transformed_excl_ak_hi <- sf::st_difference(transformed_excl_ak, hi_bbox) + sf::st_agr(transformed_excl_ak_hi) <- "constant" + + transformed_excl_ak_hi_pr <- sf::st_difference(transformed_excl_ak_hi, pr_bbox) + sf::st_agr(transformed_excl_ak_hi_pr) <- "constant" + + rbind(transformed_excl_ak_hi_pr, alaska, hawaii, puerto_rico) +} + +#' usmap coordinate reference system +#' +#' @description This coordinate reference system (CRS) represents +#' the canonical projection used by the \code{usmap} package. It can +#' be used to transform shape files, spatial points, spatial data +#' frames, etc. to the same coordinate representation that is used +#' by the \code{plot_usmap} function. +#' +#' @export +usmap_crs <- function() { + usmapdata:::ea_crs() +} diff --git a/check/usmap.Rcheck/00_pkg_src/usmap/R/us-map.R b/check/usmap.Rcheck/00_pkg_src/usmap/R/us-map.R new file mode 100644 index 0000000..140eb37 --- /dev/null +++ b/check/usmap.Rcheck/00_pkg_src/usmap/R/us-map.R @@ -0,0 +1,51 @@ +#' Retrieve US map data +#' +#' @param regions The region breakdown for the map, can be one of +#' (`"states"`, `"state"`, `"counties"`, `"county"`). +#' The default is `"states"`. +#' @param include The regions to include in the resulting map. If `regions` is +#' `"states"`/`"state"`, the value can be either a state name, abbreviation or FIPS code. +#' For counties, the FIPS must be provided as there can be multiple counties with the +#' same name. If states are provided in the county map, only counties in the included states +#' will be returned. +#' @param exclude The regions to exclude in the resulting map. If `regions` is +#' `"states"`/`"state"`, the value can be either a state name, abbreviation or FIPS code. +#' For counties, the FIPS must be provided as there can be multiple counties with the +#' same name. The regions listed in the `include` parameter take precedence over +#' regions listed in `exclude`. If both parameters include the same region(s) they +#' will be included in the map. +#' @param data_year The year for which to obtain map data. +#' If the value is `NULL`, the most recent year's data is used. If the +#' provided year is not found from the available map data sets, the next most +#' recent year's data is used. This can be used if an older data set is being +#' plotted on the US map so that the data matches the map more accurately. +#' Therefore, the provided value should match the year of the plotted data set. +#' The default is `NULL`, i.e. the most recent available year is used. +#' +#' @seealso [usmapdata::us_map()] of which this function is a wrapper for. +#' +#' @return An `sf` data frame of US map coordinates divided by the desired `regions`. +#' +#' @examples +#' str(us_map()) +#' +#' df <- us_map(regions = "counties") +#' west_coast <- us_map(include = c("CA", "OR", "WA")) +#' +#' excl_west_coast <- us_map(exclude = c("CA", "OR", "WA")) +#' +#' ct_counties_as_of_2022 <- us_map(regions = "counties", include = "CT", data_year = 2022) +#' @export +us_map <- function( + regions = c("states", "state", "counties", "county"), + include = c(), + exclude = c(), + data_year = NULL +) { + usmapdata::us_map( + regions = regions, + include = include, + exclude = exclude, + data_year = data_year + ) +} diff --git a/check/usmap.Rcheck/00_pkg_src/usmap/R/usmap-package.R b/check/usmap.Rcheck/00_pkg_src/usmap/R/usmap-package.R new file mode 100644 index 0000000..e167a42 --- /dev/null +++ b/check/usmap.Rcheck/00_pkg_src/usmap/R/usmap-package.R @@ -0,0 +1,76 @@ +#' usmap: US maps including Alaska and Hawaii +#' +#' @description +#' It is usually difficult or inconvenient to create US maps that +#' include Alaska, Hawaii, and even Puerto Rico in a convenient spot. All map +#' data frames produced by this package use the US National Atlas Equal Area +#' projection. +#' +#' @section Map data: +#' Alaska, Hawaii, and Puerto Rico have been manually moved to a new location so that +#' their new coordinates place them to the bottom-left corner of +#' the map. These maps can be accessed by using the [us_map()] function. +#' +#' The function provides the ability to retrieve maps with either +#' state borders or county borders using the \code{regions} parameter +#' for convenience. +#' +#' States (or counties) can be included and excluded using the provided +#' \code{include} and \code{exclude} parameters. These parameters can be used +#' together with any combination of names, abbreviations, or FIPS code to +#' create more complex maps. +#' +#' @section FIPS lookup tools: +#' Several functions have been included to lookup the US state or county +#' pertaining to a FIPS code. +#' +#' Likewise a reverse lookup can be done where a FIPS code can be used to +#' retrieve the associated states or counties. This can be useful when +#' preparing data to be merged with the map data frame. +#' +#' @section Plot US map data: +#' A convenience function [plot_usmap()] has been included which +#' takes similar parameters to [us_map()] and returns a [ggplot2::ggplot2] +#' object. Since the output is a `ggplot` object, other layers can be +#' added such as scales, themes, and labels. Including data in the function call +#' will color the map according to the values in the data, creating a choropleth. +#' +#' @section Transforming data: +#' It is also possible to add spatial data to the map, in the form of either +#' data frames or simple features ([sf::sf]) objects. If necessary, the +#' data can be transformed to be in the same coordinate reference system as +#' [usmap] by using [usmap_transform()] and then plotted using [ggplot2::geom_sf()]. +#' +#' @author Paolo Di Lorenzo \cr +#' \itemize{ +#' \item Email: \email{dilorenzo@@hey} +#' \item GitHub: \url{https://github.com/pdil/} +#' } +#' +#' @seealso +#' Helpful links: +#' \itemize{ +#' \item FIPS code information \cr +#' \url{https://en.wikipedia.org/wiki/FIPS_county_code} +#' \url{https://en.wikipedia.org/wiki/FIPS_state_code} +#' \item US Census Shapefiles \cr +#' \url{https://www.census.gov/geographies/mapping-files/time-series/geo/cartographic-boundary.html} +#' \item Map Features \cr +#' \url{https://en.wikipedia.org/wiki/Map_projection} \cr +#' \url{https://en.wikipedia.org/wiki/Equal-area_projection} \cr +#' \url{https://en.wikipedia.org/wiki/Choropleth} \cr +#' \url{https://epsg.io/9311} (US National Atlas Equal Area) +#' } +#' +#' @references +#' Rudis, Bob. "Moving The Earth (well, Alaska & Hawaii) With R." +#' Blog post. Rud.is., 16 Nov. 2014. Web. 10 Aug. 2015. +#' \url{https://rud.is/b/2014/11/16/moving-the-earth-well-alaska-hawaii-with-r/}. +#' +#' @docType package +#' @name usmap +"_PACKAGE" + +## usethis namespace: start +## usethis namespace: end +NULL diff --git a/check/usmap.Rcheck/00_pkg_src/usmap/README.md b/check/usmap.Rcheck/00_pkg_src/usmap/README.md new file mode 100644 index 0000000..48242fd --- /dev/null +++ b/check/usmap.Rcheck/00_pkg_src/usmap/README.md @@ -0,0 +1,368 @@ + + + +# 🗺 usmap + + + +[![CRAN](https://www.r-pkg.org/badges/version/usmap?color=blue)](https://cran.r-project.org/package=usmap) +[![Downloads](https://cranlogs.r-pkg.org/badges/grand-total/usmap)](https://cran.r-project.org/package=usmap) +[![check](https://github.com/pdil/usmap/actions/workflows/check.yaml/badge.svg)](https://github.com/pdil/usmap/actions/workflows/check.yaml) +[![codecov](https://codecov.io/gh/pdil/usmap/branch/master/graph/badge.svg)](https://app.codecov.io/gh/pdil/usmap) + + + + +## Purpose + +Typically in R it is difficult to create nice US +[choropleths](https://en.wikipedia.org/wiki/Choropleth_map) that include +Alaska and Hawaii. The functions presented here attempt to elegantly +solve this problem by manually moving these states to a new location and +providing a simple features ([`sf`](https://github.com/r-spatial/sf)) +object for mapping and visualization. This allows the user to easily add +spatial data or features to the US map. + +## Available Map Data + +The map data files that we use to plot the maps in R are located in the +[`usmapdata`](https://github.com/pdil/usmapdata) package. These are +generated from the [US Census Bureau cartographic boundary +files](https://www.census.gov/geographies/mapping-files/time-series/geo/cartographic-boundary.html). +Maps at both the state and county levels are included for convenience. + +In `usmap v0.8.0` the `data_year` parameter was added to most package +functions, allowing the user to select from multiple available years. +Since data is now stored in `usmapdata`, updates are no longer tied to +`usmap` versions. + +#### Update History + +| Date | Available Years | +|----|:--:| +| May 28, 2025 | [2021](https://www.census.gov/geographies/mapping-files/time-series/geo/cartographic-boundary.2021.html), [2022](https://www.census.gov/geographies/mapping-files/time-series/geo/cartographic-boundary.2022.html), [2023](https://www.census.gov/geographies/mapping-files/time-series/geo/cartographic-boundary.2023.html), [2024](https://www.census.gov/geographies/mapping-files/time-series/geo/cartographic-boundary.2024.html) | + +Prior to `usmap v0.8.0`: + +| Date | `usmap` version | Available Year | +|----|:--:|:--:| +| May 10, 2024 | 0.7.1 | [2023](https://www.census.gov/geographies/mapping-files/time-series/geo/cartographic-boundary.2023.html) | +| January 20, 2024 | 0.7.0 | [2022](https://www.census.gov/geographies/mapping-files/time-series/geo/cartographic-boundary.2022.html) | +| February 27, 2022 | 0.6.0 | [2020](https://www.census.gov/geographies/mapping-files/time-series/geo/cartographic-boundary.2020.html) | +| June 3, 2018 | 0.3.0 | [2017](https://www.census.gov/geographies/mapping-files/time-series/geo/carto-boundary-file.2017.html) | +| January 29, 2017 | 0.1.0 | [2015](https://www.census.gov/geographies/mapping-files/time-series/geo/carto-boundary-file.2015.html) | + +## Installation + +📦 To install from CRAN (recommended), run the following code in an R +console: + +``` r +install.packages("usmap") +``` + +### Developer Build + +⚠️ The developer build may be unstable and not function correctly, use +with caution. + +To install the package from this repository, run the following code in +an R console: + +``` r +install.package("devtools") +devtools::install_github("pdil/usmap") +``` + +This method will provide the most recent developer build of `usmap`. + +To begin using `usmap`, import the package using the `library` command: + +``` r +library(usmap) +``` + +## Documentation + +To read the package vignettes, which explain helpful uses of the +package, use `vignette`: + +``` r +vignette(package = "usmap") +vignette("usmap1", package = "usmap") # 1. Introduction +vignette("usmap2", package = "usmap") # 2. Mapping the US +vignette("usmap3", package = "usmap") # 3. Advanced Mapping +``` + +For further help with this package, open an +[issue](https://github.com/pdil/usmap/issues) or ask a question on Stack +Overflow with the [usmap +tag](https://stackoverflow.com/questions/tagged/usmap). + +## Features + +### Map Plots + +- Plot US maps + +``` r +states <- plot_usmap("states") +counties <- plot_usmap("counties") + +cowplot::plot_grid(states, counties, nrow = 1) +``` + + + +- Display only certain states, counties, or regions + +``` r +library(ggplot2) + +mt <- plot_usmap("states", include = .mountain, labels = TRUE) + +fl <- plot_usmap("counties", data = countypov, values = "pct_pov_2021", include = "FL", data_year = 2021) + + scale_fill_continuous(low = "green", high = "red", guide = "none") + +ne <- plot_usmap("counties", data = countypop, values = "pop_2022", include = .new_england, data_year = 2022) + + scale_fill_continuous(low = "blue", high = "yellow", guide = "none") + +cowplot::plot_grid(mt, fl, ne, nrow = 1) +``` + + + +- Transform and add spatial data to map + +``` r +library(ggplot2) + +# Transform included `usrivers` data set +rivers_transformed <- usmap_transform(usrivers) + +river_map <- plot_usmap("counties", color = "gray80") + + geom_sf(data = rivers_transformed, aes(linewidth = Shape_Length), color = "blue") + + scale_linewidth_continuous(range = c(0.3, 1.5), guide = "none") + +# Transform included `earthquakes` data set +earthquakes_above_mag_3 <- earthquakes[earthquakes$mag > 3, ] +eq_transformed <- usmap_transform(earthquakes_above_mag_3) + +earthquake_map <- plot_usmap() + + geom_sf(data = eq_transformed, aes(size = mag), color = "red", alpha = 0.25) + + scale_size_continuous(guide = "none") + +cowplot::plot_grid(river_map, earthquake_map, nrow = 1) +``` + + + +### Map Data + +- Obtain map data with certain region breakdown + +``` r +us_map(regions = "states") +#> Simple feature collection with 52 features and 3 fields +#> Geometry type: MULTIPOLYGON +#> Dimension: XY +#> Bounding box: xmin: -2584074 ymin: -2602555 xmax: 2516258 ymax: 731628.1 +#> Projected CRS: NAD27 / US National Atlas Equal Area +#> First 10 features: +#> fips abbr full geom +#> 1 02 AK Alaska MULTIPOLYGON (((-2390688 -2... +#> 2 01 AL Alabama MULTIPOLYGON (((1091785 -13... +#> 3 05 AR Arkansas MULTIPOLYGON (((482022.2 -9... +#> 4 04 AZ Arizona MULTIPOLYGON (((-1386064 -1... +#> 5 06 CA California MULTIPOLYGON (((-1716581 -1... +#> 6 08 CO Colorado MULTIPOLYGON (((-787705.6 -... +#> 7 09 CT Connecticut MULTIPOLYGON (((2156162 -83... +#> 8 11 DC District of Columbia MULTIPOLYGON (((1950799 -40... +#> 9 10 DE Delaware MULTIPOLYGON (((2037480 -28... +#> 10 12 FL Florida MULTIPOLYGON (((1853163 -20... +``` + +``` r +us_map(regions = "counties") +#> Simple feature collection with 3222 features and 4 fields +#> Geometry type: MULTIPOLYGON +#> Dimension: XY +#> Bounding box: xmin: -2584074 ymin: -2602555 xmax: 2516258 ymax: 731628.1 +#> Projected CRS: NAD27 / US National Atlas Equal Area +#> First 10 features: +#> fips abbr full county +#> 1 02013 AK Alaska Aleutians East Borough +#> 2 02016 AK Alaska Aleutians West Census Area +#> 3 02020 AK Alaska Anchorage Municipality +#> 4 02050 AK Alaska Bethel Census Area +#> 5 02060 AK Alaska Bristol Bay Borough +#> 6 02063 AK Alaska Chugach Census Area +#> 7 02066 AK Alaska Copper River Census Area +#> 8 02068 AK Alaska Denali Borough +#> 9 02070 AK Alaska Dillingham Census Area +#> 10 02090 AK Alaska Fairbanks North Star Borough +#> geom +#> 1 MULTIPOLYGON (((-1757988 -2... +#> 2 MULTIPOLYGON (((-2390688 -2... +#> 3 MULTIPOLYGON (((-1513326 -2... +#> 4 MULTIPOLYGON (((-1899724 -2... +#> 5 MULTIPOLYGON (((-1681144 -2... +#> 6 MULTIPOLYGON (((-1472549 -2... +#> 7 MULTIPOLYGON (((-1452955 -2... +#> 8 MULTIPOLYGON (((-1581283 -1... +#> 9 MULTIPOLYGON (((-1788018 -2... +#> 10 MULTIPOLYGON (((-1508063 -1... +``` + +### FIPS Codes + +- Look up FIPS codes for states and counties + +``` r +fips("New Jersey") +#> [1] "34" + +fips(c("AZ", "CA", "New Hampshire")) +#> [1] "04" "06" "33" + +fips("NJ", county = "Mercer") +#> [1] "34021" + +fips("NJ", county = c("Bergen", "Hudson", "Mercer")) +#> [1] "34003" "34017" "34021" +``` + +- Retrieve states or counties with FIPS codes + +``` r +fips_info(c("34", "35")) +#> abbr fips full +#> 1 NJ 34 New Jersey +#> 2 NM 35 New Mexico + +fips_info(c("34021", "35021")) +#> full abbr county fips +#> 1 New Jersey NJ Mercer County 34021 +#> 2 New Mexico NM Harding County 35021 +``` + +- Add FIPS codes to data frame + +``` r +library(dplyr) + +data <- data.frame( + state = c("NJ", "NJ", "NJ", "PA"), + county = c("Bergen", "Hudson", "Mercer", "Allegheny") +) + +data %>% rowwise %>% mutate(fips = fips(state, county)) +#> # A tibble: 4 × 3 +#> # Rowwise: +#> state county fips +#> +#> 1 NJ Bergen 34003 +#> 2 NJ Hudson 34017 +#> 3 NJ Mercer 34021 +#> 4 PA Allegheny 42003 +``` + +## Additional Information + +### Citation Information + +The images generated by `usmap` are not under any copyright restrictions +and may be used and distributed freely in any publication or otherwise. + +The underlying shapefiles used to generate the map data are derived from +the [US Census Bureau’s TIGER/Line +Shapefiles](https://www.census.gov/geographies/mapping-files/time-series/geo/tiger-line-file.2023.html#list-tab-790442341) +which are not copyrighted but do suggest citation. See [section 1.2 of +this +document](https://www2.census.gov/geo/pdfs/maps-data/data/tiger/tgrshp2023/TGRSHP2023_TechDoc_Ch1.pdf). + +If you wish to cite `usmap` in a publication (appreciated but never +required!), you may do so in the following way: + +``` r +citation("usmap") +#> Warning in citation("usmap"): could not determine year for 'usmap' from package +#> DESCRIPTION file +#> To cite package 'usmap' in publications use: +#> +#> Di Lorenzo P (????). _usmap: US Maps Including Alaska and Hawaii_. R +#> package version 0.8.0.9000, . +#> +#> A BibTeX entry for LaTeX users is +#> +#> @Manual{, +#> title = {usmap: US Maps Including Alaska and Hawaii}, +#> author = {Paolo {Di Lorenzo}}, +#> note = {R package version 0.8.0.9000}, +#> url = {https://usmap.dev}, +#> } +``` + +### Coordinate System + +`usmap` uses the [US National Atlas Equal Area](https://epsg.io/9311) +coordinate system: + +
+ + + +sf::st_crs(9311) + + + #> Coordinate Reference System: + #> User input: EPSG:9311 + #> wkt: + #> PROJCRS["NAD27 / US National Atlas Equal Area", + #> BASEGEOGCRS["NAD27", + #> DATUM["North American Datum 1927", + #> ELLIPSOID["Clarke 1866",6378206.4,294.978698213898, + #> LENGTHUNIT["metre",1]]], + #> PRIMEM["Greenwich",0, + #> ANGLEUNIT["degree",0.0174532925199433]], + #> ID["EPSG",4267]], + #> CONVERSION["US National Atlas Equal Area", + #> METHOD["Lambert Azimuthal Equal Area (Spherical)", + #> ID["EPSG",1027]], + #> PARAMETER["Latitude of natural origin",45, + #> ANGLEUNIT["degree",0.0174532925199433], + #> ID["EPSG",8801]], + #> PARAMETER["Longitude of natural origin",-100, + #> ANGLEUNIT["degree",0.0174532925199433], + #> ID["EPSG",8802]], + #> PARAMETER["False easting",0, + #> LENGTHUNIT["metre",1], + #> ID["EPSG",8806]], + #> PARAMETER["False northing",0, + #> LENGTHUNIT["metre",1], + #> ID["EPSG",8807]]], + #> CS[Cartesian,2], + #> AXIS["easting (X)",east, + #> ORDER[1], + #> LENGTHUNIT["metre",1]], + #> AXIS["northing (Y)",north, + #> ORDER[2], + #> LENGTHUNIT["metre",1]], + #> USAGE[ + #> SCOPE["Statistical analysis."], + #> AREA["United States (USA) - onshore and offshore."], + #> BBOX[15.56,167.65,74.71,-65.69]], + #> ID["EPSG",9311]] + +
+ +This [coordinate reference system +(CRS)](https://www.nceas.ucsb.edu/sites/default/files/2020-04/OverviewCoordinateReferenceSystems.pdf) +can also be obtained with `usmap::usmap_crs()`. + +## Acknowledgments + +The code used to generate the map files was based on this blog post by +[Bob Rudis](https://github.com/hrbrmstr): [Moving The Earth (well, +Alaska & Hawaii) With +R](https://rud.is/b/2014/11/16/moving-the-earth-well-alaska-hawaii-with-r/). diff --git a/check/usmap.Rcheck/00_pkg_src/usmap/build/vignette.rds b/check/usmap.Rcheck/00_pkg_src/usmap/build/vignette.rds new file mode 100644 index 0000000000000000000000000000000000000000..045a71839244118da681fde0ec74a0980ce59901 GIT binary patch literal 260 zcmV+f0sHyCgCzg~HDf!EdyxGVy_B%JJ!-604Zt7j~s0;Y?SIMm{P-sVs5> zMNcM^oNMR@^>YVR KwHN7 literal 0 HcmV?d00001 diff --git a/check/usmap.Rcheck/00_pkg_src/usmap/data/citypop.rda b/check/usmap.Rcheck/00_pkg_src/usmap/data/citypop.rda new file mode 100644 index 0000000000000000000000000000000000000000..b6bece77bd50fc068933c69a1c46bbf9c43e019d GIT binary patch literal 1910 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 aOSy-{U;xHI6ZnPi{x0N-aG@cuD)UO&uDPrL literal 0 HcmV?d00001 diff --git a/check/usmap.Rcheck/00_pkg_src/usmap/data/countypov.rda b/check/usmap.Rcheck/00_pkg_src/usmap/data/countypov.rda new file mode 100644 index 0000000000000000000000000000000000000000..bc52e15c21718fa6f58b97b4ed6045ce662d7065 GIT binary patch literal 21385 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 QFaL|VBAh5lRO~wl0KEM>NdN!< literal 0 HcmV?d00001 diff --git a/check/usmap.Rcheck/00_pkg_src/usmap/data/earthquakes.rda b/check/usmap.Rcheck/00_pkg_src/usmap/data/earthquakes.rda new file mode 100644 index 0000000000000000000000000000000000000000..2160c15d0392795e5b40c7190295752043fb4a1f GIT binary patch literal 23191 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +pop_2022 + + + + + + + + + +1e+06 +2e+06 +3e+06 +4e+06 +countypop + + diff --git a/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/data/countypov.svg b/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/data/countypov.svg new file mode 100644 index 0000000..53b1d3e --- /dev/null +++ b/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/data/countypov.svg @@ -0,0 +1,313 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +pct_pov_2021 + + + + + + + + + + + +10 +15 +20 +25 +30 +countypov + + diff --git a/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/data/statepop.svg b/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/data/statepop.svg new file mode 100644 index 0000000..9de5d20 --- /dev/null +++ b/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/data/statepop.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +pop_2022 + + + + + + + +1e+07 +2e+07 +3e+07 +statepop + + diff --git a/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/data/statepov.svg b/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/data/statepov.svg new file mode 100644 index 0000000..e26364d --- /dev/null +++ b/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/data/statepov.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +pct_pov_2021 + + + + + + + +12.5 +15.0 +17.5 +statepov + + diff --git a/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/plot/arizona-county-map-with-labels-and-fill.svg b/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/plot/arizona-county-map-with-labels-and-fill.svg new file mode 100644 index 0000000..7a93ea3 --- /dev/null +++ b/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/plot/arizona-county-map-with-labels-and-fill.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Apache +Cochise +Coconino +Gila +Graham +Greenlee +La Paz +Maricopa +Mohave +Navajo +Pima +Pinal +Santa Cruz +Yavapai +Yuma + + +Arizona county map with labels and fill + + diff --git a/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/plot/example-data-state-map-with-custom-linewidth.svg b/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/plot/example-data-state-map-with-custom-linewidth.svg new file mode 100644 index 0000000..2f729e1 --- /dev/null +++ b/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/plot/example-data-state-map-with-custom-linewidth.svg @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +values + + + + + + + + + +5 +6 +7 +8 +Example data state map with custom linewidth + + diff --git a/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/plot/new-england-state-map-with-labels-excluding-maine.svg b/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/plot/new-england-state-map-with-labels-excluding-maine.svg new file mode 100644 index 0000000..193c9a7 --- /dev/null +++ b/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/plot/new-england-state-map-with-labels-excluding-maine.svg @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +CT +MA +NH +RI +VT + + +New England state map with labels excluding Maine + + diff --git a/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/plot/pr-county-map-with-labels-and-excludes.svg b/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/plot/pr-county-map-with-labels-and-excludes.svg new file mode 100644 index 0000000..b07e556 --- /dev/null +++ b/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/plot/pr-county-map-with-labels-and-excludes.svg @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Aguadilla Municipio +Aguas Buenas Municipio +Aibonito Municipio +Arecibo Municipio +Arroyo Municipio +Añasco Municipio +Barceloneta Municipio +Barranquitas Municipio +Bayamón Municipio +Cabo Rojo Municipio +Caguas Municipio +Camuy Municipio +Canóvanas Municipio +Carolina Municipio +Cataño Municipio +Cayey Municipio +Ceiba Municipio +Ciales Municipio +Cidra Municipio +Coamo Municipio +Comerío Municipio +Corozal Municipio +Culebra Municipio +Dorado Municipio +Fajardo Municipio +Florida Municipio +Guayama Municipio +Guayanilla Municipio +Guaynabo Municipio +Gurabo Municipio +Guánica Municipio +Hatillo Municipio +Hormigueros Municipio +Humacao Municipio +Isabela Municipio +Jayuya Municipio +Juana Díaz Municipio +Juncos Municipio +Lajas Municipio +Lares Municipio +Las Marías Municipio +Las Piedras Municipio +Loíza Municipio +Luquillo Municipio +Manatí Municipio +Maricao Municipio +Maunabo Municipio +Mayagüez Municipio +Moca Municipio +Morovis Municipio +Naguabo Municipio +Naranjito Municipio +Orocovis Municipio +Patillas Municipio +Peñuelas Municipio +Ponce Municipio +Quebradillas Municipio +Rincón Municipio +Río Grande Municipio +Sabana Grande Municipio +Salinas Municipio +San Germán Municipio +San Juan Municipio +San Lorenzo Municipio +San Sebastián Municipio +Santa Isabel Municipio +Toa Alta Municipio +Toa Baja Municipio +Trujillo Alto Municipio +Utuado Municipio +Vega Alta Municipio +Vega Baja Municipio +Vieques Municipio +Villalba Municipio +Yabucoa Municipio +Yauco Municipio + + +PR county map with labels and excludes + + diff --git a/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/plot/southeastern-states-map-with-labels.svg b/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/plot/southeastern-states-map-with-labels.svg new file mode 100644 index 0000000..5bb00bb --- /dev/null +++ b/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/plot/southeastern-states-map-with-labels.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +AL +FL +GA + + +Southeastern states map with labels + + diff --git a/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/plot/state-map-with-labels.svg b/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/plot/state-map-with-labels.svg new file mode 100644 index 0000000..ed1d587 --- /dev/null +++ b/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/plot/state-map-with-labels.svg @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +AK +AL +AR +AZ +CA +CO +CT +DC +DE +FL +GA +HI +IA +ID +IL +IN +KS +KY +LA +MA +MD +ME +MI +MN +MO +MS +MT +NC +ND +NE +NH +NJ +NM +NV +NY +OH +OK +OR +PA +PR +RI +SC +SD +TN +TX +UT +VA +VT +WA +WI +WV +WY + + +State map with labels + + diff --git a/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/plot/state-map-with-major-rivers.svg b/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/plot/state-map-with-major-rivers.svg new file mode 100644 index 0000000..bda40bf --- /dev/null +++ b/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/plot/state-map-with-major-rivers.svg @@ -0,0 +1,246 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +State map with major rivers + + diff --git a/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/plot/state-population-map-with-blue-outlines.svg b/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/plot/state-population-map-with-blue-outlines.svg new file mode 100644 index 0000000..97ab17f --- /dev/null +++ b/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/_snaps/plot/state-population-map-with-blue-outlines.svg @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +pop_2022 + + + + + + + +1e+07 +2e+07 +3e+07 +State population map with blue outlines + + diff --git a/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/helper-requireNamespace-mock.R b/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/helper-requireNamespace-mock.R new file mode 100644 index 0000000..ec0d4bf --- /dev/null +++ b/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/helper-requireNamespace-mock.R @@ -0,0 +1,12 @@ + +# Mocks `requireNamespace` to return `FALSE` for +# provided dependency package "pkg" to test that +# error occurs when it's not installed. +expect_package_error <- function(pkg, code, msg) { + testthat::with_mocked_bindings({ + testthat::expect_error(code, paste0("`", pkg, "` must be installed")) + }, + requireNamespace = function(package, ...) package != pkg, + .package = "base" + ) +} diff --git a/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/test-data.R b/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/test-data.R new file mode 100644 index 0000000..c6ba2fc --- /dev/null +++ b/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/test-data.R @@ -0,0 +1,13 @@ +test_that("provided data sets plot correctly", { + skip_on_ci() + + a <- plot_usmap(data = countypop, values = "pop_2022", include = "TX") + b <- plot_usmap(data = countypov, values = "pct_pov_2021", include = "TX") + c <- plot_usmap(data = statepop, values = "pop_2022", include = .south_region) + d <- plot_usmap(data = statepov, values = "pct_pov_2021", include = .south_region) + + vdiffr::expect_doppelganger("countypop", a) + vdiffr::expect_doppelganger("countypov", b) + vdiffr::expect_doppelganger("statepop", c) + vdiffr::expect_doppelganger("statepov", d) +}) diff --git a/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/test-fips-info.R b/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/test-fips-info.R new file mode 100644 index 0000000..92f0b8f --- /dev/null +++ b/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/test-fips-info.R @@ -0,0 +1,75 @@ +test_that("all states returned when no FIPS specified", { + expect_equal(fips_info()$fips, fips()) +}) + +test_that("returns correct state FIPS information", { + ak_result <- data.frame( + abbr = c("AK", "NJ", "AK"), + fips = c("02", "34", "02"), + full = c("Alaska", "New Jersey", "Alaska"), + stringsAsFactors = FALSE + ) + + expect_equal(fips_info(c(2, 34, 2)), ak_result, ignore_attr = TRUE) + expect_equal(fips_info(c("02", "34", "02")), ak_result, ignore_attr = TRUE) + + ak_result_sorted <- data.frame( + abbr = c("AK", "NJ"), + fips = c("02", "34"), + full = c("Alaska", "New Jersey"), + stringsAsFactors = FALSE + ) + + expect_equal(fips_info(c(2, 34, 2), sortAndRemoveDuplicates = TRUE), + ak_result_sorted, + ignore_attr = TRUE) + expect_equal(fips_info(c("02", "34", "02"), sortAndRemoveDuplicates = TRUE), + ak_result_sorted, + ignore_attr = TRUE) +}) + +test_that("returns correct county FIPS information", { + ak_result <- data.frame( + full = rep("Alaska", 3), + abbr = rep("AK", 3), + county = c("Anchorage Municipality", "Aleutians West Census Area", + "Anchorage Municipality"), + fips = c("02020", "02016", "02020"), + stringsAsFactors = FALSE + ) + + expect_equal(fips_info(c(2020, 2016, 2020)), ak_result, ignore_attr = TRUE) + expect_equal(fips_info(c("02020", "02016", "02020")), ak_result, ignore_attr = TRUE) + + ak_result_sorted <- data.frame( + full = rep("Alaska", 2), + abbr = rep("AK", 2), + county = c("Aleutians West Census Area", "Anchorage Municipality"), + fips = c("02016", "02020"), + stringsAsFactors = FALSE + ) + + expect_equal(fips_info(c(2020, 2016, 2020), sortAndRemoveDuplicates = TRUE), + ak_result_sorted, + ignore_attr = TRUE) + expect_equal(fips_info(c("02020", "02016", "02020"), sortAndRemoveDuplicates = TRUE), + ak_result_sorted, + ignore_attr = TRUE) +}) + +# non-existent yet valid means a FIPS such as "03", which falls +# within the prescribed boundaries yet is not assigned to any US state +# and therefore returns a warning +test_that("warning occurs for non-existent yet valid FIPS", { + expect_warning(fips_info(c("03", "04"))) + expect_warning(fips_info("03055")) +}) + +test_that("error occurs for non-numeric/character FIPS", { + expect_error(fips_info(data.frame())) +}) + +test_that("error occurs for invalid FIPS", { + expect_error(fips_info("999999")) + expect_error(fips_info(999)) +}) diff --git a/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/test-fips.R b/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/test-fips.R new file mode 100644 index 0000000..9d03262 --- /dev/null +++ b/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/test-fips.R @@ -0,0 +1,84 @@ +test_that("all FIPS codes returned when no state specified", { + expect_equal(fips(), + c("02", "01", "05", "04", "06", "08", "09", "11", + "10", "12", "13", "15", "19", "16", "17", "18", + "20", "21", "22", "25", "24", "23", "26", "27", + "29", "28", "30", "37", "38", "31", "33", "34", + "35", "32", "36", "39", "40", "41", "42", "72", + "44", "45", "46", "47", "48", "49", "51", "50", + "53", "55", "54", "56")) +}) + +test_that("returns correct FIPS code for state", { + expect_equal(fips(state = "nj"), "34") + expect_equal(fips(state = "NJ"), "34") + expect_equal(fips(state = "New Jersey"), "34") + expect_equal(fips(state = "new jersey"), "34") +}) + +test_that("multiple states return appropriate FIPS codes", { + expect_equal(fips(c("CA", "NJ", "AL", "XX", "SD")), c("06", "34", "01", NA, "46")) + expect_equal(fips(c("CA", "New jersey", "AL", "XX", "sOutH dAkoTA")), c("06", "34", "01", NA, "46")) +}) + +test_that("returns correct FIPS code for county", { + expect_equal(fips(state = "NJ", county = "mercer"), "34021") + expect_equal(fips(state = "NJ", county = "mercer county"), "34021") + expect_equal(fips(state = "NJ", county = "Mercer County"), "34021") + expect_equal(fips(state = "new jersey", county = "mercer"), "34021") + expect_equal(fips(state = "New Jersey", county = "Mercer County"), "34021") +}) + +test_that("multiple counties in same state return appropriate FIPS codes", { + expect_equal(fips(state = "NJ", county = c("Bergen", "Hudson")), c("34003", "34017")) + expect_equal(fips(state = "NJ", county = c("Hudson", "Bergen")), c("34017", "34003")) + expect_equal(fips(state = "NJ", county = c("Bergen County", "Hudson")), c("34003", "34017")) + expect_equal(fips(state = "NJ", county = c("bergen", "hudson county")), c("34003", "34017")) +}) + +test_that("returns correct FIPS if it starts with a 0", { + expect_equal(fips(state = "AL"), "01") + expect_equal(fips(state = "CA"), "06") + expect_equal(fips(state = "AL", county = "autauga"), "01001") + expect_equal(fips(state = "AL", county = "baldwin"), "01003") + expect_equal(fips(state = "AL", county = "barbour"), "01005") +}) + +test_that("NA is returned for invalid state", { + expect_true(is.na(fips(state = "Guam"))) +}) + +test_that("error occurs for missing state", { + expect_error(fips(county = "Mercer County")) +}) + +test_that("error occurs for county with list of states", { + expect_error(fips(state = c("CA", "NJ"), county = "Mercer")) +}) + +test_that("error occurs for invalid counties", { + expect_error(fips(state = "CA", county = "Fake County")) + expect_error(fips(state = "CA", county = c("Fake County 1", "Fake County 2"))) +}) + +# This is to ensure that the Shannon County -> Oglala Lakota County +# change that occurred in South Dakota (May 1, 2015) is properly reflected. +test_that("Oglala Lakota County is correctly in the data", { + expect_error(fips(state = "SD", county = "Shannon County")) + expect_equal(fips(state = "SD", county = "Oglala Lakota County"), "46102") +}) + +# This is to ensure that the Wade Hampton Census Area -> Kusilvak Census Area +# change that occurred in Alaska (July 1, 2015) is properly reflected. +test_that("Kusilvak Census Area is correctly in the data", { + expect_error(fips(state = "AK", county = "Wade Hampton Census Area")) + expect_equal(fips(state = "AK", county = "Kusilvak Census Area"), "02158") +}) + +# This is to ensure that the Valdez-Cordova Census Area -> Chugach Census Area / Copper River Census Area +# change that occurred in Alaska (January 2, 2019) is properly reflected. +test_that("Chugach Census Area and Copper River Census Area are correctly in the data", { + expect_error(fips(state = "AK", county = "Valdez-Cordova Census Area")) + expect_equal(fips(state = "AK", county = "Chugach Census Area"), "02063") + expect_equal(fips(state = "AK", county = "Copper River Census Area"), "02066") +}) diff --git a/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/test-join-data.R b/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/test-join-data.R new file mode 100644 index 0000000..00a99cf --- /dev/null +++ b/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/test-join-data.R @@ -0,0 +1,56 @@ +state_data <- data.frame(fips = c("01", "02", "04"), values = c(3, 5, 10)) +county_data <- data.frame(fips = c("01001", "01003", "01005"), values = c(3, 5, 10)) + +test_that("values are assigned to states correctly", { + df <- map_with_data(state_data) + + expect_equal(unique(state_data$value[state_data$fips == "01"]), unique(df$value[df$fips == "01"])) + expect_equal(unique(state_data$value[state_data$fips == "02"]), unique(df$value[df$fips == "02"])) + expect_equal(unique(state_data$value[state_data$fips == "04"]), unique(df$value[df$fips == "04"])) +}) + +test_that("values are assigned to counties correctly", { + df <- map_with_data(county_data) + + expect_equal(unique(county_data$value[county_data$fips == "01001"]), unique(df$value[df$fips == "01001"])) + expect_equal(unique(county_data$value[county_data$fips == "01003"]), unique(df$value[df$fips == "01003"])) + expect_equal(unique(county_data$value[county_data$fips == "01005"]), unique(df$value[df$fips == "01005"])) +}) + +test_that("values are appropriately assigned if county FIPS codes are missing leading zeroes", { + county_data2 <- data.frame(fips = c(1001, 1003, 1005), values = c(3, 5, 10)) + df <- map_with_data(county_data2) + + expect_equal(unique(county_data2$value[county_data2$fips == 1001]), unique(df$value[df$fips == "01001"])) + expect_equal(unique(county_data2$value[county_data2$fips == 1003]), unique(df$value[df$fips == "01003"])) + expect_equal(unique(county_data2$value[county_data2$fips == 1005]), unique(df$value[df$fips == "01005"])) +}) + +test_that("values are appropriately assigned if state FIPS codes are missing leading zeroes", { + state_data2 <- data.frame(fips = c(1, 2, 4), values = c(3, 5, 10)) + df <- map_with_data(state_data2) + + expect_equal(unique(state_data2$value[state_data2$fips == 1]), unique(df$value[df$fips == "01"])) + expect_equal(unique(state_data2$value[state_data2$fips == 2]), unique(df$value[df$fips == "02"])) + expect_equal(unique(state_data2$value[state_data2$fips == 4]), unique(df$value[df$fips == "04"])) +}) + +test_that("error occurs for invalid column names", { + bad_data_states <- data.frame(state_fips <- c("01", "02"), values = c(3, 5)) + bad_data_values <- data.frame(fips <- c("01", "02"), the_values = c(3, 5)) + + expect_error(map_with_data(bad_data_states)) + expect_error(map_with_data(bad_data_values)) +}) + +test_that("error occurs for non-data frame input", { + expect_error(map_with_data(data = "1")) +}) + +test_that("warning occurs for empty (yet valid) data frame", { + expect_warning(map_with_data(data.frame(fips = c(), values = c()))) + expect_equal(suppressWarnings(map_with_data(data.frame(fips = c(), values = c()))), us_map()) + + expect_warning(map_with_data(data.frame(fips = c(), values = c()), include = c("01")), "*state*") + expect_warning(map_with_data(data.frame(fips = c(), values = c()), include = c("01001")), "*county*") +}) diff --git a/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/test-plot.R b/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/test-plot.R new file mode 100644 index 0000000..5f7f1da --- /dev/null +++ b/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/test-plot.R @@ -0,0 +1,186 @@ +withr::local_envvar(c("USMAP_DEFAULT_EXCLUDE_PR" = FALSE)) + +test_that("dependencies are verified", { + expect_package_error("ggplot2", plot_usmap()) +}) + +library(proto) + +example_data <- data.frame( + state = c("AK", "CA", "New Jersey"), + values = c(5, 8, 7) +) + +p <- plot_usmap("counties", fill = "red") +q <- plot_usmap(data = statepop, values = "pop_2022", color = "blue") +r <- plot_usmap(data = example_data, linewidth = 0.8) +s <- plot_usmap(include = c("AL", "FL", "GA"), labels = TRUE, label_color = "blue") +t <- plot_usmap("county", include = "AZ", labels = TRUE, fill = "yellow", linewidth = 0.6) +u <- plot_usmap(include = c("CT", "MA", "NH", "RI", "VT"), labels = TRUE) +v <- plot_usmap("state", labels = TRUE) +w <- plot_usmap("counties", include = "PR", exclude = c("72001", "72003"), labels = TRUE) + +test_that("ggplot object is returned", { + expect_s3_class(p, "ggplot") + expect_s3_class(q, "ggplot") + expect_s3_class(r, "ggplot") + expect_s3_class(s, "ggplot") + expect_s3_class(t, "ggplot") + expect_s3_class(u, "ggplot") + expect_s3_class(v, "ggplot") + expect_s3_class(w, "ggplot") +}) + +test_that("no warnings are produced", { + expect_silent(p) + expect_silent(q) + expect_silent(r) + expect_silent(s) + expect_silent(t) + expect_silent(u) + expect_silent(v) + expect_silent(w) +}) + +test_that("correct data is used", { + p_map_data <- us_map(regions = "counties") + expect_identical(p$data, p_map_data) + + q_map_data <- map_with_data(statepop, values = "pop_2022") + expect_identical(q$data, q_map_data) + + r_map_data <- map_with_data(example_data) + expect_identical(r$data, r_map_data) + + s_map_data <- us_map(regions = "states", include = c("AL", "FL", "GA")) + expect_identical(s$data, s_map_data) + + t_map_data <- us_map(regions = "counties", include = "AZ") + expect_identical(t$data, t_map_data) + + u_map_data <- us_map(include = setdiff(.new_england, "ME")) + expect_identical(u$data, u_map_data) + + v_map_data <- us_map() + expect_identical(v$data, v_map_data) + + w_map_data <- us_map("counties", include = "PR", exclude = c("72001", "72003")) + expect_identical(w$data, w_map_data) +}) + +test_that("plots are stable", { + skip_on_ci() + + vdiffr::expect_doppelganger("State population map with blue outlines", q) + vdiffr::expect_doppelganger("Example data state map with custom linewidth", r) + vdiffr::expect_doppelganger("Southeastern states map with labels", s) + vdiffr::expect_doppelganger("Arizona county map with labels and fill", t) + vdiffr::expect_doppelganger("New England state map with labels excluding Maine", u) + vdiffr::expect_doppelganger("State map with labels", v) + vdiffr::expect_doppelganger("PR county map with labels and excludes", w) + + rivers_t <- usmap_transform(usrivers) + river_map <- plot_usmap() + ggplot2::geom_sf(data = rivers_t, color = "blue") + vdiffr::expect_doppelganger("State map with major rivers", river_map) +}) + +test_that("layer parameters are correct", { + expect_s3_class(p$layers[[1]], "ggproto") + expect_s3_class(p$layers[[1]]$geom, "GeomSf") + expect_equal(as.character(p$layers[[1]]$aes_params$colour), "black") + expect_equal(as.character(p$layers[[1]]$aes_params$fill), "red") + expect_equal(p$layers[[1]]$aes_params$linewidth, 0.4) + + expect_s3_class(q$layers[[1]], "ggproto") + expect_s3_class(q$layers[[1]]$geom, "GeomSf") + expect_equal(deparse(q$layers[[1]]$mapping$fill), "~.data[[\"pop_2022\"]]") + expect_equal(as.character(q$layers[[1]]$aes_params$colour), "blue") + expect_equal(q$layers[[1]]$aes_params$linewidth, 0.4) + + expect_s3_class(r$layers[[1]], "ggproto") + expect_s3_class(r$layers[[1]]$geom, "GeomSf") + expect_equal(deparse(r$layers[[1]]$mapping$fill), "~.data[[\"values\"]]") + expect_equal(as.character(r$layers[[1]]$aes_params$colour), "black") + expect_equal(r$layers[[1]]$aes_params$linewidth, 0.8) + + expect_s3_class(s$layers[[1]], "ggproto") + expect_s3_class(s$layers[[1]]$geom, "GeomSf") + expect_equal(as.character(s$layers[[1]]$aes_params$fill), "white") + expect_equal(as.character(s$layers[[1]]$aes_params$colour), "black") + expect_equal(s$layers[[1]]$aes_params$linewidth, 0.4) + expect_s3_class(s$layers[[2]], "ggproto") + expect_s3_class(s$layers[[2]]$geom, "GeomText") + expect_equal(deparse(s$layers[[2]]$mapping$label), "~.data$abbr") + expect_equal(as.character(s$layers[[2]]$aes_params$colour), "blue") + + expect_s3_class(t$layers[[1]], "ggproto") + expect_s3_class(s$layers[[1]]$geom, "GeomSf") + expect_equal(as.character(t$layers[[1]]$aes_params$fill), "yellow") + expect_equal(as.character(t$layers[[1]]$aes_params$colour), "black") + expect_equal(t$layers[[1]]$aes_params$linewidth, 0.6) + expect_s3_class(t$layers[[2]], "ggproto") + expect_s3_class(t$layers[[2]]$geom, "GeomText") + expect_equal(deparse(t$layers[[2]]$mapping$label), + "~sub(\" County\", \"\", .data$county)") + + expect_s3_class(u$layers[[1]], "ggproto") + expect_s3_class(u$layers[[1]]$geom, "GeomSf") + expect_equal(as.character(u$layers[[1]]$aes_params$fill), "white") + expect_equal(as.character(u$layers[[1]]$aes_params$colour), "black") + expect_equal(u$layers[[1]]$aes_params$linewidth, 0.4) + expect_s3_class(u$layers[[2]], "ggproto") + expect_s3_class(u$layers[[2]]$geom, "GeomText") + expect_equal(deparse(u$layers[[2]]$mapping$label), "~.data$abbr") + + expect_s3_class(v$layers[[1]], "ggproto") + expect_s3_class(v$layers[[1]]$geom, "GeomSf") + expect_equal(as.character(v$layers[[1]]$aes_params$fill), "white") + expect_equal(as.character(v$layers[[1]]$aes_params$colour), "black") + expect_equal(v$layers[[1]]$aes_params$linewidth, 0.4) + expect_s3_class(v$layers[[2]], "ggproto") + expect_s3_class(v$layers[[2]]$geom, "GeomText") + expect_equal(deparse(v$layers[[2]]$mapping$label), "~.data$abbr") + + expect_s3_class(w$layers[[1]], "ggproto") + expect_s3_class(w$layers[[1]]$geom, "GeomSf") + expect_equal(as.character(w$layers[[1]]$aes_params$fill), "white") + expect_equal(as.character(w$layers[[1]]$aes_params$colour), "black") + expect_equal(w$layers[[1]]$aes_params$linewidth, 0.4) + expect_s3_class(w$layers[[2]], "ggproto") + expect_s3_class(w$layers[[2]]$geom, "GeomText") + expect_equal(deparse(w$layers[[2]]$mapping$label), + "~sub(\" County\", \"\", .data$county)") +}) + +test_that("county data works without specifying `region`", { + data <- data.frame( + fips = c("36001", "36003", "36005", "36007"), + values = c(1, 3, 3, 5) + ) + + p <- plot_usmap(data = data, include = "NY", labels = TRUE) + expect_equal(deparse(p$layers[[2]]$mapping$label), + "~sub(\" County\", \"\", .data$county)") +}) + +test_that("plot excludes Puerto Rico based one environment variable", { + withr::with_envvar(c("USMAP_DEFAULT_EXCLUDE_PR" = TRUE), { + p <- plot_usmap() + expect_false("PR" %in% p$data$abbr) + }) + + withr::with_envvar(c("USMAP_DEFAULT_EXCLUDE_PR" = TRUE), { + p <- plot_usmap(include = "PR") + expect_contains(p$data$abbr, "PR") + }) + + withr::with_envvar(c("USMAP_DEFAULT_EXCLUDE_PR" = FALSE), { + p <- plot_usmap() + expect_contains(p$data$abbr, "PR") + }) + + withr::with_envvar(c("USMAP_DEFAULT_EXCLUDE_PR" = FALSE), { + p <- plot_usmap(exclude = "PR", labels = TRUE) + expect_false("PR" %in% p$data$abbr) + }) +}) diff --git a/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/test-transform.R b/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/test-transform.R new file mode 100644 index 0000000..6a27786 --- /dev/null +++ b/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/test-transform.R @@ -0,0 +1,203 @@ +test_that("data frame with AK and HI points is transformed", { + data <- data.frame( + lon = c(-74.01, -95.36, -118.24, -87.65, -134.42, -157.86), + lat = c(40.71, 29.76, 34.05, 41.85, 58.30, 21.31) + ) + + result <- sf::st_as_sf( + data.frame( + geometry = sf::st_sfc( + sf::st_point(c(2152550, -133046.5)), + sf::st_point(c(452399.8, -1674650)), + sf::st_point(c(-1675528, -1033610)), + sf::st_point(c(1021166, -273151.2)), + sf::st_point(c(-1062738, -2125993)), + sf::st_point(c(-618107.8, -1962880)) + ) + ), + crs = usmap_crs() + ) + + expect_equal(usmap_transform(data), result, tolerance = 1e-02) +}) + +test_that("data frame with AK points is transformed", { + data <- data.frame( + lon = c(-74.01, -95.36, -118.24, -87.65, -134.42), + lat = c(40.71, 29.76, 34.05, 41.85, 58.30) + ) + + result <- sf::st_as_sf( + data.frame( + geometry = sf::st_sfc( + sf::st_point(c(2152550, -133046.5)), + sf::st_point(c(452399.8, -1674650)), + sf::st_point(c(-1675528, -1033610)), + sf::st_point(c(1021166, -273151.2)), + sf::st_point(c(-1062738, -2125993)) + ) + ), + crs = usmap_crs() + ) + + expect_equal(usmap_transform(data), result, tolerance = 1e-02) +}) + +test_that("data frame with HI points is transformed", { + data <- data.frame( + lon = c(-74.01, -95.36, -118.24, -87.65, -157.86), + lat = c(40.71, 29.76, 34.05, 41.85, 21.31) + ) + + result <- sf::st_as_sf( + data.frame( + geometry = sf::st_sfc( + sf::st_point(c(2152550, -133046.5)), + sf::st_point(c(452399.8, -1674650)), + sf::st_point(c(-1675528, -1033610)), + sf::st_point(c(1021166, -273151.2)), + sf::st_point(c(-618107.8, -1962880)) + ) + ), + crs = usmap_crs() + ) + + expect_equal(usmap_transform(data), result, tolerance = 1e-02) +}) + +test_that("data frame with no AK or HI points is transformed", { + data <- data.frame( + lon = c(-74.01, -95.36, -118.24, -87.65), + lat = c(40.71, 29.76, 34.05, 41.85) + ) + + result <- sf::st_as_sf( + data.frame( + geometry = sf::st_sfc( + sf::st_point(c(2152550, -133046.5)), + sf::st_point(c(452399.8, -1674650)), + sf::st_point(c(-1675528, -1033610)), + sf::st_point(c(1021166, -273151.2)) + ) + ), + crs = usmap_crs() + ) + + expect_equal(usmap_transform(data), result, tolerance = 1e-02) +}) + +test_that("sf object is transformed", { + sf <- sf::st_as_sf( + data.frame( + geometry = sf::st_sfc( + sf::st_point(c(-74.01, 40.71)), + sf::st_point(c(-95.36, 29.76)), + sf::st_point(c(-118.24, 34.05)), + sf::st_point(c(-87.65, 41.85)), + sf::st_point(c(-134.42, 58.30)), + sf::st_point(c(-157.86, 21.31)) + ) + ), + crs = sf::st_crs(4326) + ) + + result <- sf::st_as_sf( + data.frame( + geometry = sf::st_sfc( + sf::st_point(c(2152550, -133046.5)), + sf::st_point(c(452399.8, -1674650)), + sf::st_point(c(-1675528, -1033610)), + sf::st_point(c(1021166, -273151.2)), + sf::st_point(c(-1062738, -2125993)), + sf::st_point(c(-618107.8, -1962880)) + ) + ), + crs = usmap_crs() + ) + + expect_equal(usmap_transform(sf), result, tolerance = 1e-02) +}) + +test_that("sf object with non-lon/lat CRS is transformed", { + sf <- sf::st_as_sf( + data.frame( + geometry = sf::st_sfc( + sf::st_point(c(-8238756, 4969660)), + sf::st_point(c(-10615427, 3472737)), + sf::st_point(c(-13162417, 4035518)), + sf::st_point(c(-9757153, 5138537)), + sf::st_point(c(-14963566, 8030604)), + sf::st_point(c(-17572895, 2428881)) + ) + ), + crs = sf::st_crs(3857) + ) + + result <- sf::st_as_sf( + data.frame( + geometry = sf::st_sfc( + sf::st_point(c(2152550, -133046.5)), + sf::st_point(c(452399.8, -1674650)), + sf::st_point(c(-1675528, -1033610)), + sf::st_point(c(1021166, -273151.2)), + sf::st_point(c(-1062738, -2125993)), + sf::st_point(c(-618107.8, -1962880)) + ) + ), + crs = usmap_crs() + ) + + # test without explicit CRS + expect_equal(usmap_transform(sf), result, tolerance = 1e-02) + # test with explicit CRS + expect_equal(usmap_transform(sf, crs = sf::st_crs(3857)), result, tolerance = 1e-02) +}) + +test_that("error occurs for data with less than 2 columns", { + invalid_data <- data.frame( + lon = c(-74.01, -95.36, -118.24, -87.65) + ) + + expect_error(usmap_transform(invalid_data)) + expect_error(usmap_transform(data.frame())) +}) + +test_that("error occurs for invalid input names", { + data <- data.frame( + lon = c(-74.01, -95.36, -118.24, -87.65), + lat = c(40.71, 29.76, 34.05, 41.85) + ) + + expect_error(usmap_transform(data, input_names = c("longitude"))) + expect_error(usmap_transform(data, input_names = c("longitude", "latitude"))) +}) + +test_that("error occurs for data with non-numeric columns", { + invalid_data1 <- data.frame( + lon = c("a", "b", "c"), + lat = c("d", "e", "f") + ) + + invalid_data2 <- data.frame( + lon = c("a", "b", "c"), + lat = c(1, 2, 3) + ) + + invalid_data3 <- data.frame( + lon = c(1, 2, 3), + lat = c("d", "e", "f") + ) + + expect_error(usmap_transform(invalid_data1)) + expect_error(usmap_transform(invalid_data2)) + expect_error(usmap_transform(invalid_data3)) +}) + +test_that("warning occurs for use of defunct output_names", { + data <- data.frame( + lon = c(-74.01, -95.36, -118.24, -87.65), + lat = c(40.71, 29.76, 34.05, 41.85) + ) + + expect_warning(usmap_transform(data, output_names = c("x", "y"))) +}) diff --git a/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/test-usmap.R b/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/test-usmap.R new file mode 100644 index 0000000..2471a30 --- /dev/null +++ b/check/usmap.Rcheck/00_pkg_src/usmap/tests/testthat/test-usmap.R @@ -0,0 +1,18 @@ +test_that("state data frame is returned", { + data <- us_map() + + expect_equal(ncol(data), 4) + expect_equal(nrow(data), 52) + + expect_identical(us_map("state"), data) + expect_identical(us_map("states"), data) +}) + +test_that("county data frame is returned", { + data <- us_map("counties") + + expect_equal(ncol(data), 5) + expect_equal(nrow(data), 3222) + + expect_identical(us_map("county"), data) +}) diff --git a/check/usmap.Rcheck/00_pkg_src/usmap/vignettes/usmap1.Rmd b/check/usmap.Rcheck/00_pkg_src/usmap/vignettes/usmap1.Rmd new file mode 100644 index 0000000..8e4e929 --- /dev/null +++ b/check/usmap.Rcheck/00_pkg_src/usmap/vignettes/usmap1.Rmd @@ -0,0 +1,83 @@ +--- +title: "1. Introduction" +author: "Paolo Di Lorenzo" +date: "`r Sys.Date()`" +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{1. Introduction} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r setup, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>" +) +``` + +## Plotting + +Plots of US maps in R usually lack Alaska, Hawaii, and Puerto Rico. The reason is plotting takes the literal longitude and latitude coordinates and maps it to a cartesian x-y coordinate graph. Alaska, Hawaii, and Puerto Rico are very far from the mainland US when using this so it can be unwieldy to include them. The `usmap` package solves this issue by providing data frames which have Alaska, Hawaii, and Puerto Rico moved to a convenient spot just to the bottom left of the contiguous United States. + +#### Blank US state map + +```{r, fig.align='center', fig.width=7} +usmap::plot_usmap() +``` + +#### Blank US county map + +```{r, fig.align='center', fig.width=7} +usmap::plot_usmap(regions = "counties") +``` + +## Raw map data + +The raw US map data for counties or states can be obtained for further manipulation (and joining with data). The default `regions` is `"states"`. + +```{r, eval = FALSE} +states_df <- usmap::us_map() +counties_df <- usmap::us_map(regions = "counties") +``` + + +## FIPS codes + +FIPS codes are defined in the Federal Information Processing Standards by the US government. One usage is uniquely identifying US states and counties. Downloaded data sets from the [US Census](https://www.census.gov/data.html) will often include FIPS codes as identifiers so it can be helpful to know what a FIPS code represents. The functions in `usmap` are built around the FIPS code identification system and so convenience methods for accessing them and performing reverse-lookups have been included. + +#### State/County FIPS lookup + +```{r} +# Get FIPS code for a state +usmap::fips(state = "MA") +usmap::fips(state = "Massachusetts") + +# Get FIPS code for a county +usmap::fips(state = "NJ", county = "Bergen") +usmap::fips(state = "CA", county = "Orange County") + +# The parameters are NOT case sensitive! +usmap::fips(state = "ca", county = "oRanGe cOUNty") +``` + +#### FIPS reverse lookup + +If the FIPS code is known and want to see what state/county it corresponds to, use the reverse lookup function `fips_info`. + +```{r} +usmap::fips_info(c("30", "33", "34")) +``` + +```{r} +usmap::fips_info(c("01001", "01003", "01005", "01007")) +``` + +#### Further reading + +More information about FIPS can be read [here](https://en.wikipedia.org/wiki/Federal_Information_Processing_Standards). + +--- + +> “A map is the greatest of all epic poems. Its lines and colors show the realization of great dreams.” +> - _Gilbert H. Grosvenor, Editor of National Geographic (1903 - 1954)_ diff --git a/check/usmap.Rcheck/00_pkg_src/usmap/vignettes/usmap2.Rmd b/check/usmap.Rcheck/00_pkg_src/usmap/vignettes/usmap2.Rmd new file mode 100644 index 0000000..e2fff16 --- /dev/null +++ b/check/usmap.Rcheck/00_pkg_src/usmap/vignettes/usmap2.Rmd @@ -0,0 +1,211 @@ +--- +title: "2. Mapping the US" +author: "Paolo Di Lorenzo" +date: "`r Sys.Date()`" +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{2. Mapping the US} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r setup, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>" +) +``` + +## Extending `plot_usmap` with `ggplot2` + +The nice thing about `usmap::plot_usmap` is it returns a [ggplot object](https://ggplot2.tidyverse.org/index.html) object, which means we can add `ggplot` layers to the plot right out of the box. + +```{r, fig.align='center', fig.width=7, message=FALSE, warning=FALSE} +library(usmap) +library(ggplot2) + +plot_usmap(regions = "counties") + + labs(title = "US Counties", + subtitle = "This is a blank map of the counties of the United States.") + + theme(panel.background = element_rect(color = "black", fill = "lightblue")) +``` + +#### Plot only certain states + +```{r, fig.align='center', fig.width=7, message=FALSE, warning=FALSE} +library(usmap) +library(ggplot2) + +plot_usmap(include = c("CA", "ID", "NV", "OR", "WA")) + + labs(title = "Western US States", + subtitle = "These are the states in the Pacific Timezone.") +``` + +#### Add some data to the map + +```{r, fig.align='center', fig.width=7, message=FALSE, warning=FALSE} +library(usmap) +library(ggplot2) + +plot_usmap(data = statepop, values = "pop_2022", color = "red") + + scale_fill_continuous(name = "Population (2022)", label = scales::comma) + + theme(legend.position = "right") +``` + +Notice the comprehensive expandability that can be applied to the map using `ggplot2` layers. For example, we might want to use a different color scheme. + +#### Change fill color scale + +```{r, fig.align='center', fig.width=7, message=FALSE, warning=FALSE} +library(usmap) +library(ggplot2) + +plot_usmap(data = statepop, values = "pop_2022", color = "red") + + scale_fill_continuous( + low = "white", high = "red", name = "Population (2022)", label = scales::comma + ) + theme(legend.position = "right") +``` + +The data-filled map can also be filtered to show certain regions only, like the western states shown above. + +#### Show data in certain states + +```{r, fig.align='center', fig.width=7, message=FALSE, warning=FALSE} +library(usmap) +library(ggplot2) + +plot_usmap( + data = statepop, values = "pop_2022", include = c("CA", "ID", "NV", "OR", "WA"), color = "red" + ) + + scale_fill_continuous( + low = "white", high = "red", name = "Population (2022)", label = scales::comma + ) + + labs(title = "Western US States", subtitle = "These are the states in the Pacific Timezone.") + + theme(legend.position = "right") +``` + +### Required Data Format + +The data passed to the `data` parameter in `plot_usmap()` must be a data frame +with at least two columns. One of the columns must be named `"fips"` or `"state"` and contain +either the FIPS code, the state abbreviation, or the state name (for county maps +only the FIPS code is supported). The second column must be the values to be plotted +for each region. The default name of the values column is `"values"`. If a different +name is used in the data frame, the name can be specified in the `values` parameter +of `plot_usmap`. Any extra columns in the data frame will be ignored. + +#### FIPS column with default `values` column +```{r, fig.show='hide', message=FALSE, warning=FALSE} +df <- data.frame( + fips = c("02", "01", "05", "04"), + values = c(14, 18, 19, 8) +) + +plot_usmap(data = df) +``` + +#### FIPS column with custom `values` column +Name of values column must be specified in `values` parameter if it is not `"values"`. +```{r, fig.show='hide', message=FALSE, warning=FALSE} +df <- data.frame( + fips = c("02", "01", "05", "04"), + population = c(14, 18, 19, 8) +) + +plot_usmap(data = df, values = "population") +``` + +#### States +Abbreviations and full names can be mixed if desired. +```{r, fig.show='hide', message=FALSE, warning=FALSE} +df <- data.frame( + state = c("AL", "Alaska", "AR", "AZ"), + values = c(14, 18, 19, 8) +) + +plot_usmap(data = df) +``` + +#### Counties +County names are not supported in `plot_usmap` data frames. Use `fips` instead. +```{r, fig.show='hide', message=FALSE, warning=FALSE} +df <- data.frame( + fips = c("10001", "10003", "10005"), + values = c(93, 98, 41) +) + +plot_usmap(data = df) +``` + +## Built-in Regions + +`usmap` provides some built-in regions based on the [US Census Bureau Regions and Divisions](https://www2.census.gov/geo/pdfs/maps-data/maps/reference/us_regdiv.pdf). These can be used in place of the `include`/`exclude` parameters when using `us_map` or `plot_usmap` and start with a `.` (dot): + +```{r, fig.align='center', fig.width=7, message=FALSE, warning=FALSE} +usmap::plot_usmap(include = .south_region) +``` + +```{r, fig.align='center', fig.width=7, message=FALSE, warning=FALSE} +usmap::plot_usmap(include = .east_south_central) +``` + +```{r, fig.align='center', fig.width=7, message=FALSE, warning=FALSE} +usmap::plot_usmap(include = .south_region, exclude = .east_south_central) +``` + +This also works with county maps. The regions can also be combined with actual state or FIPS values within the `include`/`exclude` parameters: + +```{r, fig.align='center', fig.width=7, message=FALSE, warning=FALSE} +usmap::plot_usmap("counties", + include = c(.south_region, "IA"), + exclude = c(.east_south_central, "12")) # 12 = FL +``` + +You can even include or exclude individual counties (county-level inclusions/exclusions can only be done via their FIPS codes due to duplicate county names across states; for example eight different states have an "Orange County"): + +```{r, fig.align='center', fig.width=7, message=FALSE, warning=FALSE} +usmap::plot_usmap("counties", fill = "yellow", alpha = 0.25, + # 06065 = Riverside County, CA + include = c(.south_region, "IA", "06065"), + # 12 = FL, 48141 = El Paso County, TX + exclude = c(.east_south_central, "12", "48141")) +``` + +These parameters therefore allow for the possibility of some complex compositions of states and counties, to create the exact map that is desired. + +#### Supported US Census Regions and Divisions + +The following divisions are supported: +```{r} +.new_england +.mid_atlantic +.east_north_central +.west_north_central +.south_atlantic +.east_south_central +.west_south_central +.mountain +.pacific +``` + +Regions are composed of multiple divisions, and the following are supported: +```{r} +.northeast_region # c(.new_england, .mid_atlantic) +.north_central_region # c(.east_north_central, .west_north_central) +.midwest_region # .north_central_region (renamed in June 1984) +.south_region # c(.south_atlantic, .east_south_central, .west_south_central) +.west_region # c(.mountain, .pacific) +``` + +## Raw map data + +The raw US map data for counties or states can be obtained for further manipulation (and joining with data). + +```{r} +usmap::us_map() +``` +```{r} +usmap::us_map(regions = "counties") +``` + +You can also include only certain states and counties just like in `plot_usmap`. In fact, the `regions` and `include` parameters of `plot_usmap` are derived directly from their usage in `us_map`. diff --git a/check/usmap.Rcheck/00_pkg_src/usmap/vignettes/usmap3.Rmd b/check/usmap.Rcheck/00_pkg_src/usmap/vignettes/usmap3.Rmd new file mode 100644 index 0000000..8fa0244 --- /dev/null +++ b/check/usmap.Rcheck/00_pkg_src/usmap/vignettes/usmap3.Rmd @@ -0,0 +1,152 @@ +--- +title: "3. Advanced Mapping" +author: "Paolo Di Lorenzo" +date: "`r Sys.Date()`" +output: rmarkdown::html_vignette +vignette: > + %\VignetteIndexEntry{3. Advanced Mapping} + %\VignetteEngine{knitr::rmarkdown} + %\VignetteEncoding{UTF-8} +--- + +```{r setup, include = FALSE} +knitr::opts_chunk$set( + collapse = TRUE, + comment = "#>" +) +``` + +This vignette will explore some of the more advanced mapping features of `usmap`. Before continuing, be sure to check out [Mapping the US](usmap2.html) as that will cover more of the basics of plotting US maps and styling them with `ggplot2`. + +## Labels + +As of `usmap 0.4.0`, maps with state labels can be created: + +```{r, fig.align='center', fig.width=7, fig.height=5, message=FALSE, warning=FALSE} +usmap::plot_usmap("states", labels = TRUE) +``` + +`usmap 0.5.0` adds the ability to add county labels: + +```{r, fig.align='center', fig.width=7, fig.height=5, message=FALSE, warning=FALSE} +usmap::plot_usmap("counties", include = c("MA", "CT", "RI"), labels = TRUE) +``` + +Labels can be colored using the `label_color` parameter: + +```{r, fig.align='center', fig.width=7, fig.height=5, message=FALSE, warning=FALSE} +usmap::plot_usmap("counties", + include = c("MA", "CT", "RI"), + labels = TRUE, label_color = "blue") +``` + +## `ggplot2` aesthetic mapping parameters + +Parameters used by the map's aesthetic mapping (`ggplot2::aes`) can be passed directly via `plot_usmap` by adding the parameters anywhere at the call site: + +```{r, fig.align='center', fig.width=7, fig.height=5, message=FALSE, warning=FALSE} +usmap::plot_usmap("counties", + include = c("MA", "CT", "RI"), + labels = TRUE, label_color = "blue", + fill = "yellow", alpha = 0.25, color = "orange", linewidth = 2) +``` + +Notice in this case we set the `fill` and `alpha` parameters to fill in the counties with a semi-transparent yellow color. + +The following parameters are supported: + +- `fill`: fill color of the state/county polygons +- `alpha`: transparency of the state/county polygon fill colors +- `color`/`colour`: line color of the state/county polygons +- `linewidth`: thickness of the state/county polygon lines + +## Transform data frames to match `usmap` projection + +Data sets with longitude and latitude coordinates can be transformed to match the projection used in `usmap` (Albers Equal Area projection). This is convenient for plotting location-specific data and values using `ggplot2` layers such as `geom_point` and `geom_label`. + +#### Projection + +The projection used by `usmap` can also be accessed by using `usmap_crs()`: + +```{r, warning=FALSE} +usmap::usmap_crs() +``` + +A convenience method called `usmap_transform` is provided that transforms a `data.frame` containing longitude/latitude columns to use this projection. (Currently, only `data.frame`s are supported. Other structures may be supported in the future.) + +#### Example: earthquakes + +Here is an example using the provided `earthquakes` dataset: + +```{r, fig.align='center', fig.width=8, fig.height=5, message=FALSE, warning=FALSE} +library(usmap) +library(ggplot2) + +eq_transformed <- usmap_transform(earthquakes) + +plot_usmap() + + geom_sf(data = eq_transformed, aes(size = mag), + color = "red", alpha = 0.25) + + labs(title = "US Earthquakes", + subtitle = "Source: USGS, Jan 1 to Jun 30 2019", + size = "Magnitude") + + theme(legend.position = "right") +``` + +#### Example: most populous city in each state + +And a more comprehensive example using the provided `citypop` data set: + +```{r fig.align='center', fig.height=5, fig.width=8, message=FALSE, warning=FALSE} +library(usmap) +library(ggplot2) + +cities_t <- usmap_transform(citypop) + +plot_usmap(fill = "yellow", alpha = 0.25) + + geom_sf(data = cities_t, + aes(size = city_pop), + color = "purple", alpha = 0.5) + + ggrepel::geom_label_repel(data = cities_t, + aes(label = most_populous_city, geometry = geometry), + size = 3, alpha = 0.8, + label.r = unit(0.5, "lines"), label.size = 0.5, + segment.color = "red", segment.size = 1, + stat = "sf_coordinates", seed = 1002, + max.overlaps = 20) + + scale_size_continuous(range = c(1, 16), + label = scales::comma) + + labs(title = "Most Populous City in Each US State", + subtitle = "Source: US Census 2010", + size = "City Population") + + theme(legend.position = "right") +``` + +#### Example: major rivers in the United States + +Here is an example of transforming and plotting another `sf` object on the map, +using the provided `rivers` dataset. In this example the width of the river +corresponds to its length, and the color indicates the river system it belongs +to. + +```{r fig.align='center', fig.height=5, fig.width=8, message=FALSE, warning=FALSE} +library(usmap) +library(ggplot2) + +rivers_t <- usmap_transform(usrivers) + +plot_usmap("counties", color = "gray80") + + geom_sf(data = rivers_t, aes(linewidth = Shape_Length, color = SYSTEM, fill = SYSTEM)) + + scale_linewidth_continuous(range = c(0.3, 1.8), guide = "none") + + scale_color_discrete(guide = "none") + + labs(title = "Major Rivers in the United States", + subtitle = "Source: ESRI 2010", + fill = "River System") + + theme(legend.position = "right") +``` + +


+ +The `usmap_transform` function, combined with the power of `ggplot2` layers can allow for some very unique and complex data visualizations on the US map. The `usmap_transform` function also handles transforming points in the Alaska/Hawaii area so that they are appropriately displayed on their respective states. + +









diff --git a/check/usmap.Rcheck/00check.log b/check/usmap.Rcheck/00check.log new file mode 100644 index 0000000..fa98c3b --- /dev/null +++ b/check/usmap.Rcheck/00check.log @@ -0,0 +1,71 @@ +* using log directory ‘/home/runner/work/usmap/usmap/check/usmap.Rcheck’ +* using R version 4.5.1 (2025-06-13) +* using platform: x86_64-pc-linux-gnu +* R was compiled by + gcc (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0 + GNU Fortran (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0 +* running under: Ubuntu 24.04.3 LTS +* using session charset: UTF-8 +* using options ‘--no-manual --as-cran’ +* checking for file ‘usmap/DESCRIPTION’ ... OK +* this is package ‘usmap’ version ‘0.8.0.9000’ +* package encoding: UTF-8 +* checking package namespace information ... OK +* checking package dependencies ... OK +* checking if this is a source package ... OK +* checking if there is a namespace ... OK +* checking for executable files ... OK +* checking for hidden files and directories ... OK +* checking for portable file names ... OK +* checking for sufficient/correct file permissions ... OK +* checking whether package ‘usmap’ can be installed ... OK +* checking installed package size ... OK +* checking package directory ... OK +* checking for future file timestamps ... OK +* checking ‘build’ directory ... OK +* checking DESCRIPTION meta-information ... OK +* checking top-level files ... OK +* checking for left-over files ... OK +* checking index information ... OK +* checking package subdirectories ... OK +* checking code files for non-ASCII characters ... OK +* checking R files for syntax errors ... OK +* checking whether the package can be loaded ... OK +* checking whether the package can be loaded with stated dependencies ... OK +* checking whether the package can be unloaded cleanly ... OK +* checking whether the namespace can be loaded with stated dependencies ... OK +* checking whether the namespace can be unloaded cleanly ... OK +* checking loading without being on the library search path ... OK +* checking dependencies in R code ... OK +* checking S3 generic/method consistency ... OK +* checking replacement functions ... OK +* checking foreign function calls ... OK +* checking R code for possible problems ... OK +* checking Rd files ... OK +* checking Rd metadata ... OK +* checking Rd line widths ... OK +* checking Rd cross-references ... OK +* checking for missing documentation entries ... OK +* checking for code/documentation mismatches ... OK +* checking Rd \usage sections ... OK +* checking Rd contents ... OK +* checking for unstated dependencies in examples ... OK +* checking contents of ‘data’ directory ... OK +* checking data for non-ASCII characters ... OK +* checking LazyData ... OK +* checking data for ASCII and uncompressed saves ... OK +* checking installed files from ‘inst/doc’ ... OK +* checking files in ‘vignettes’ ... OK +* checking examples ... OK +* checking for unstated dependencies in ‘tests’ ... OK +* checking tests ... OK + Running ‘spelling.R’ + Comparing ‘spelling.Rout’ to ‘spelling.Rout.save’ ... OK + Running ‘testthat.R’ +* checking for unstated dependencies in vignettes ... OK +* checking package vignettes ... OK +* checking re-building of vignette outputs ... [17s/16s] OK +* checking for non-standard things in the check directory ... OK +* checking for detritus in the temp directory ... OK +* DONE +Status: OK diff --git a/check/usmap.Rcheck/00install.out b/check/usmap.Rcheck/00install.out new file mode 100644 index 0000000..c32b98c --- /dev/null +++ b/check/usmap.Rcheck/00install.out @@ -0,0 +1,16 @@ +* installing *source* package ‘usmap’ ... +** this is package ‘usmap’ version ‘0.8.0.9000’ +** using staged installation +** R +** data +*** moving datasets to lazyload DB +** inst +** byte-compile and prepare package for lazy loading +** help +*** installing help indices +** building package indices +** installing vignettes +** testing if installed package can be loaded from temporary location +** testing if installed package can be loaded from final location +** testing if installed package keeps a record of temporary installation path +* DONE (usmap) diff --git a/check/usmap.Rcheck/R_check_bin/R b/check/usmap.Rcheck/R_check_bin/R new file mode 100755 index 0000000..3e289bc --- /dev/null +++ b/check/usmap.Rcheck/R_check_bin/R @@ -0,0 +1,2 @@ +echo "'R' should not be used without a path -- see par. 1.6 of the manual" +exit 1 diff --git a/check/usmap.Rcheck/R_check_bin/Rscript b/check/usmap.Rcheck/R_check_bin/Rscript new file mode 100755 index 0000000..6fead74 --- /dev/null +++ b/check/usmap.Rcheck/R_check_bin/Rscript @@ -0,0 +1,2 @@ +echo "'Rscript' should not be used without a path -- see par. 1.6 of the manual" +exit 1 diff --git a/check/usmap.Rcheck/tests/spelling.R b/check/usmap.Rcheck/tests/spelling.R new file mode 100644 index 0000000..1d74607 --- /dev/null +++ b/check/usmap.Rcheck/tests/spelling.R @@ -0,0 +1,6 @@ +if (requireNamespace("spelling", quietly = TRUE)) + spelling::spell_check_test( + vignettes = TRUE, + error = FALSE, + skip_on_cran = TRUE + ) diff --git a/check/usmap.Rcheck/tests/spelling.Rout b/check/usmap.Rcheck/tests/spelling.Rout new file mode 100644 index 0000000..f4fb2c6 --- /dev/null +++ b/check/usmap.Rcheck/tests/spelling.Rout @@ -0,0 +1,28 @@ + +R version 4.5.1 (2025-06-13) -- "Great Square Root" +Copyright (C) 2025 The R Foundation for Statistical Computing +Platform: x86_64-pc-linux-gnu + +R is free software and comes with ABSOLUTELY NO WARRANTY. +You are welcome to redistribute it under certain conditions. +Type 'license()' or 'licence()' for distribution details. + +R is a collaborative project with many contributors. +Type 'contributors()' for more information and +'citation()' on how to cite R or R packages in publications. + +Type 'demo()' for some demos, 'help()' for on-line help, or +'help.start()' for an HTML browser interface to help. +Type 'q()' to quit R. + +> if (requireNamespace("spelling", quietly = TRUE)) ++ spelling::spell_check_test( ++ vignettes = TRUE, ++ error = FALSE, ++ skip_on_cran = TRUE ++ ) +All Done! +> +> proc.time() + user system elapsed + 0.731 0.375 0.764 diff --git a/check/usmap.Rcheck/tests/spelling.Rout.save b/check/usmap.Rcheck/tests/spelling.Rout.save new file mode 100644 index 0000000..16a5e3a --- /dev/null +++ b/check/usmap.Rcheck/tests/spelling.Rout.save @@ -0,0 +1,28 @@ + +R version 3.4.1 (2017-06-30) -- "Single Candle" +Copyright (C) 2017 The R Foundation for Statistical Computing +Platform: x86_64-apple-darwin15.6.0 (64-bit) + +R is free software and comes with ABSOLUTELY NO WARRANTY. +You are welcome to redistribute it under certain conditions. +Type 'license()' or 'licence()' for distribution details. + +R is a collaborative project with many contributors. +Type 'contributors()' for more information and +'citation()' on how to cite R or R packages in publications. + +Type 'demo()' for some demos, 'help()' for on-line help, or +'help.start()' for an HTML browser interface to help. +Type 'q()' to quit R. + +> if (requireNamespace("spelling", quietly = TRUE)) ++ spelling::spell_check_test( ++ vignettes = TRUE, ++ error = FALSE, ++ skip_on_cran = TRUE ++ ) +All Done! +> +> proc.time() + user system elapsed + 0.372 0.039 0.408 diff --git a/check/usmap.Rcheck/tests/startup.Rs b/check/usmap.Rcheck/tests/startup.Rs new file mode 100644 index 0000000..8ad6d25 --- /dev/null +++ b/check/usmap.Rcheck/tests/startup.Rs @@ -0,0 +1,4 @@ +## A custom startup file for tests +## Run as if a system Rprofile, so no packages, no assignments +options(useFancyQuotes = FALSE) + diff --git a/check/usmap.Rcheck/tests/testthat.R b/check/usmap.Rcheck/tests/testthat.R new file mode 100644 index 0000000..ff30202 --- /dev/null +++ b/check/usmap.Rcheck/tests/testthat.R @@ -0,0 +1,12 @@ +# This file is part of the standard setup for testthat. +# It is recommended that you do not modify it. +# +# Where should you do additional test configuration? +# Learn more about the roles of various files in: +# * https://r-pkgs.org/testing-design.html#sec-tests-files-overview +# * https://testthat.r-lib.org/articles/special-files.html + +library(testthat) +library(usmap) + +test_check("usmap") diff --git a/check/usmap.Rcheck/tests/testthat.Rout b/check/usmap.Rcheck/tests/testthat.Rout new file mode 100644 index 0000000..b77ece0 --- /dev/null +++ b/check/usmap.Rcheck/tests/testthat.Rout @@ -0,0 +1,39 @@ + +R version 4.5.1 (2025-06-13) -- "Great Square Root" +Copyright (C) 2025 The R Foundation for Statistical Computing +Platform: x86_64-pc-linux-gnu + +R is free software and comes with ABSOLUTELY NO WARRANTY. +You are welcome to redistribute it under certain conditions. +Type 'license()' or 'licence()' for distribution details. + +R is a collaborative project with many contributors. +Type 'contributors()' for more information and +'citation()' on how to cite R or R packages in publications. + +Type 'demo()' for some demos, 'help()' for on-line help, or +'help.start()' for an HTML browser interface to help. +Type 'q()' to quit R. + +> # This file is part of the standard setup for testthat. +> # It is recommended that you do not modify it. +> # +> # Where should you do additional test configuration? +> # Learn more about the roles of various files in: +> # * https://r-pkgs.org/testing-design.html#sec-tests-files-overview +> # * https://testthat.r-lib.org/articles/special-files.html +> +> library(testthat) +> library(usmap) +> +> test_check("usmap") +[ FAIL 0 | WARN 0 | SKIP 2 | PASS 174 ] + +══ Skipped tests (2) ═══════════════════════════════════════════════════════════ +• On CI (2): 'test-data.R:2:3', 'test-plot.R:72:3' + +[ FAIL 0 | WARN 0 | SKIP 2 | PASS 174 ] +> +> proc.time() + user system elapsed + 4.022 0.534 4.214 diff --git a/check/usmap.Rcheck/tests/testthat/_snaps/data/countypop.svg b/check/usmap.Rcheck/tests/testthat/_snaps/data/countypop.svg new file mode 100644 index 0000000..a673fab --- /dev/null +++ b/check/usmap.Rcheck/tests/testthat/_snaps/data/countypop.svg @@ -0,0 +1,310 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +pop_2022 + + + + + + + + + +1e+06 +2e+06 +3e+06 +4e+06 +countypop + + diff --git a/check/usmap.Rcheck/tests/testthat/_snaps/data/countypov.svg b/check/usmap.Rcheck/tests/testthat/_snaps/data/countypov.svg new file mode 100644 index 0000000..53b1d3e --- /dev/null +++ b/check/usmap.Rcheck/tests/testthat/_snaps/data/countypov.svg @@ -0,0 +1,313 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +pct_pov_2021 + + + + + + + + + + + +10 +15 +20 +25 +30 +countypov + + diff --git a/check/usmap.Rcheck/tests/testthat/_snaps/data/statepop.svg b/check/usmap.Rcheck/tests/testthat/_snaps/data/statepop.svg new file mode 100644 index 0000000..9de5d20 --- /dev/null +++ b/check/usmap.Rcheck/tests/testthat/_snaps/data/statepop.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +pop_2022 + + + + + + + +1e+07 +2e+07 +3e+07 +statepop + + diff --git a/check/usmap.Rcheck/tests/testthat/_snaps/data/statepov.svg b/check/usmap.Rcheck/tests/testthat/_snaps/data/statepov.svg new file mode 100644 index 0000000..e26364d --- /dev/null +++ b/check/usmap.Rcheck/tests/testthat/_snaps/data/statepov.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +pct_pov_2021 + + + + + + + +12.5 +15.0 +17.5 +statepov + + diff --git a/check/usmap.Rcheck/tests/testthat/_snaps/plot/arizona-county-map-with-labels-and-fill.svg b/check/usmap.Rcheck/tests/testthat/_snaps/plot/arizona-county-map-with-labels-and-fill.svg new file mode 100644 index 0000000..7a93ea3 --- /dev/null +++ b/check/usmap.Rcheck/tests/testthat/_snaps/plot/arizona-county-map-with-labels-and-fill.svg @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Apache +Cochise +Coconino +Gila +Graham +Greenlee +La Paz +Maricopa +Mohave +Navajo +Pima +Pinal +Santa Cruz +Yavapai +Yuma + + +Arizona county map with labels and fill + + diff --git a/check/usmap.Rcheck/tests/testthat/_snaps/plot/example-data-state-map-with-custom-linewidth.svg b/check/usmap.Rcheck/tests/testthat/_snaps/plot/example-data-state-map-with-custom-linewidth.svg new file mode 100644 index 0000000..2f729e1 --- /dev/null +++ b/check/usmap.Rcheck/tests/testthat/_snaps/plot/example-data-state-map-with-custom-linewidth.svg @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +values + + + + + + + + + +5 +6 +7 +8 +Example data state map with custom linewidth + + diff --git a/check/usmap.Rcheck/tests/testthat/_snaps/plot/new-england-state-map-with-labels-excluding-maine.svg b/check/usmap.Rcheck/tests/testthat/_snaps/plot/new-england-state-map-with-labels-excluding-maine.svg new file mode 100644 index 0000000..193c9a7 --- /dev/null +++ b/check/usmap.Rcheck/tests/testthat/_snaps/plot/new-england-state-map-with-labels-excluding-maine.svg @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +CT +MA +NH +RI +VT + + +New England state map with labels excluding Maine + + diff --git a/check/usmap.Rcheck/tests/testthat/_snaps/plot/pr-county-map-with-labels-and-excludes.svg b/check/usmap.Rcheck/tests/testthat/_snaps/plot/pr-county-map-with-labels-and-excludes.svg new file mode 100644 index 0000000..b07e556 --- /dev/null +++ b/check/usmap.Rcheck/tests/testthat/_snaps/plot/pr-county-map-with-labels-and-excludes.svg @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Aguadilla Municipio +Aguas Buenas Municipio +Aibonito Municipio +Arecibo Municipio +Arroyo Municipio +Añasco Municipio +Barceloneta Municipio +Barranquitas Municipio +Bayamón Municipio +Cabo Rojo Municipio +Caguas Municipio +Camuy Municipio +Canóvanas Municipio +Carolina Municipio +Cataño Municipio +Cayey Municipio +Ceiba Municipio +Ciales Municipio +Cidra Municipio +Coamo Municipio +Comerío Municipio +Corozal Municipio +Culebra Municipio +Dorado Municipio +Fajardo Municipio +Florida Municipio +Guayama Municipio +Guayanilla Municipio +Guaynabo Municipio +Gurabo Municipio +Guánica Municipio +Hatillo Municipio +Hormigueros Municipio +Humacao Municipio +Isabela Municipio +Jayuya Municipio +Juana Díaz Municipio +Juncos Municipio +Lajas Municipio +Lares Municipio +Las Marías Municipio +Las Piedras Municipio +Loíza Municipio +Luquillo Municipio +Manatí Municipio +Maricao Municipio +Maunabo Municipio +Mayagüez Municipio +Moca Municipio +Morovis Municipio +Naguabo Municipio +Naranjito Municipio +Orocovis Municipio +Patillas Municipio +Peñuelas Municipio +Ponce Municipio +Quebradillas Municipio +Rincón Municipio +Río Grande Municipio +Sabana Grande Municipio +Salinas Municipio +San Germán Municipio +San Juan Municipio +San Lorenzo Municipio +San Sebastián Municipio +Santa Isabel Municipio +Toa Alta Municipio +Toa Baja Municipio +Trujillo Alto Municipio +Utuado Municipio +Vega Alta Municipio +Vega Baja Municipio +Vieques Municipio +Villalba Municipio +Yabucoa Municipio +Yauco Municipio + + +PR county map with labels and excludes + + diff --git a/check/usmap.Rcheck/tests/testthat/_snaps/plot/southeastern-states-map-with-labels.svg b/check/usmap.Rcheck/tests/testthat/_snaps/plot/southeastern-states-map-with-labels.svg new file mode 100644 index 0000000..5bb00bb --- /dev/null +++ b/check/usmap.Rcheck/tests/testthat/_snaps/plot/southeastern-states-map-with-labels.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +AL +FL +GA + + +Southeastern states map with labels + + diff --git a/check/usmap.Rcheck/tests/testthat/_snaps/plot/state-map-with-labels.svg b/check/usmap.Rcheck/tests/testthat/_snaps/plot/state-map-with-labels.svg new file mode 100644 index 0000000..ed1d587 --- /dev/null +++ b/check/usmap.Rcheck/tests/testthat/_snaps/plot/state-map-with-labels.svg @@ -0,0 +1,225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +AK +AL +AR +AZ +CA +CO +CT +DC +DE +FL +GA +HI +IA +ID +IL +IN +KS +KY +LA +MA +MD +ME +MI +MN +MO +MS +MT +NC +ND +NE +NH +NJ +NM +NV +NY +OH +OK +OR +PA +PR +RI +SC +SD +TN +TX +UT +VA +VT +WA +WI +WV +WY + + +State map with labels + + diff --git a/check/usmap.Rcheck/tests/testthat/_snaps/plot/state-map-with-major-rivers.svg b/check/usmap.Rcheck/tests/testthat/_snaps/plot/state-map-with-major-rivers.svg new file mode 100644 index 0000000..bda40bf --- /dev/null +++ b/check/usmap.Rcheck/tests/testthat/_snaps/plot/state-map-with-major-rivers.svg @@ -0,0 +1,246 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +State map with major rivers + + diff --git a/check/usmap.Rcheck/tests/testthat/_snaps/plot/state-population-map-with-blue-outlines.svg b/check/usmap.Rcheck/tests/testthat/_snaps/plot/state-population-map-with-blue-outlines.svg new file mode 100644 index 0000000..97ab17f --- /dev/null +++ b/check/usmap.Rcheck/tests/testthat/_snaps/plot/state-population-map-with-blue-outlines.svg @@ -0,0 +1,185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +pop_2022 + + + + + + + +1e+07 +2e+07 +3e+07 +State population map with blue outlines + + diff --git a/check/usmap.Rcheck/tests/testthat/helper-requireNamespace-mock.R b/check/usmap.Rcheck/tests/testthat/helper-requireNamespace-mock.R new file mode 100644 index 0000000..ec0d4bf --- /dev/null +++ b/check/usmap.Rcheck/tests/testthat/helper-requireNamespace-mock.R @@ -0,0 +1,12 @@ + +# Mocks `requireNamespace` to return `FALSE` for +# provided dependency package "pkg" to test that +# error occurs when it's not installed. +expect_package_error <- function(pkg, code, msg) { + testthat::with_mocked_bindings({ + testthat::expect_error(code, paste0("`", pkg, "` must be installed")) + }, + requireNamespace = function(package, ...) package != pkg, + .package = "base" + ) +} diff --git a/check/usmap.Rcheck/tests/testthat/test-data.R b/check/usmap.Rcheck/tests/testthat/test-data.R new file mode 100644 index 0000000..c6ba2fc --- /dev/null +++ b/check/usmap.Rcheck/tests/testthat/test-data.R @@ -0,0 +1,13 @@ +test_that("provided data sets plot correctly", { + skip_on_ci() + + a <- plot_usmap(data = countypop, values = "pop_2022", include = "TX") + b <- plot_usmap(data = countypov, values = "pct_pov_2021", include = "TX") + c <- plot_usmap(data = statepop, values = "pop_2022", include = .south_region) + d <- plot_usmap(data = statepov, values = "pct_pov_2021", include = .south_region) + + vdiffr::expect_doppelganger("countypop", a) + vdiffr::expect_doppelganger("countypov", b) + vdiffr::expect_doppelganger("statepop", c) + vdiffr::expect_doppelganger("statepov", d) +}) diff --git a/check/usmap.Rcheck/tests/testthat/test-fips-info.R b/check/usmap.Rcheck/tests/testthat/test-fips-info.R new file mode 100644 index 0000000..92f0b8f --- /dev/null +++ b/check/usmap.Rcheck/tests/testthat/test-fips-info.R @@ -0,0 +1,75 @@ +test_that("all states returned when no FIPS specified", { + expect_equal(fips_info()$fips, fips()) +}) + +test_that("returns correct state FIPS information", { + ak_result <- data.frame( + abbr = c("AK", "NJ", "AK"), + fips = c("02", "34", "02"), + full = c("Alaska", "New Jersey", "Alaska"), + stringsAsFactors = FALSE + ) + + expect_equal(fips_info(c(2, 34, 2)), ak_result, ignore_attr = TRUE) + expect_equal(fips_info(c("02", "34", "02")), ak_result, ignore_attr = TRUE) + + ak_result_sorted <- data.frame( + abbr = c("AK", "NJ"), + fips = c("02", "34"), + full = c("Alaska", "New Jersey"), + stringsAsFactors = FALSE + ) + + expect_equal(fips_info(c(2, 34, 2), sortAndRemoveDuplicates = TRUE), + ak_result_sorted, + ignore_attr = TRUE) + expect_equal(fips_info(c("02", "34", "02"), sortAndRemoveDuplicates = TRUE), + ak_result_sorted, + ignore_attr = TRUE) +}) + +test_that("returns correct county FIPS information", { + ak_result <- data.frame( + full = rep("Alaska", 3), + abbr = rep("AK", 3), + county = c("Anchorage Municipality", "Aleutians West Census Area", + "Anchorage Municipality"), + fips = c("02020", "02016", "02020"), + stringsAsFactors = FALSE + ) + + expect_equal(fips_info(c(2020, 2016, 2020)), ak_result, ignore_attr = TRUE) + expect_equal(fips_info(c("02020", "02016", "02020")), ak_result, ignore_attr = TRUE) + + ak_result_sorted <- data.frame( + full = rep("Alaska", 2), + abbr = rep("AK", 2), + county = c("Aleutians West Census Area", "Anchorage Municipality"), + fips = c("02016", "02020"), + stringsAsFactors = FALSE + ) + + expect_equal(fips_info(c(2020, 2016, 2020), sortAndRemoveDuplicates = TRUE), + ak_result_sorted, + ignore_attr = TRUE) + expect_equal(fips_info(c("02020", "02016", "02020"), sortAndRemoveDuplicates = TRUE), + ak_result_sorted, + ignore_attr = TRUE) +}) + +# non-existent yet valid means a FIPS such as "03", which falls +# within the prescribed boundaries yet is not assigned to any US state +# and therefore returns a warning +test_that("warning occurs for non-existent yet valid FIPS", { + expect_warning(fips_info(c("03", "04"))) + expect_warning(fips_info("03055")) +}) + +test_that("error occurs for non-numeric/character FIPS", { + expect_error(fips_info(data.frame())) +}) + +test_that("error occurs for invalid FIPS", { + expect_error(fips_info("999999")) + expect_error(fips_info(999)) +}) diff --git a/check/usmap.Rcheck/tests/testthat/test-fips.R b/check/usmap.Rcheck/tests/testthat/test-fips.R new file mode 100644 index 0000000..9d03262 --- /dev/null +++ b/check/usmap.Rcheck/tests/testthat/test-fips.R @@ -0,0 +1,84 @@ +test_that("all FIPS codes returned when no state specified", { + expect_equal(fips(), + c("02", "01", "05", "04", "06", "08", "09", "11", + "10", "12", "13", "15", "19", "16", "17", "18", + "20", "21", "22", "25", "24", "23", "26", "27", + "29", "28", "30", "37", "38", "31", "33", "34", + "35", "32", "36", "39", "40", "41", "42", "72", + "44", "45", "46", "47", "48", "49", "51", "50", + "53", "55", "54", "56")) +}) + +test_that("returns correct FIPS code for state", { + expect_equal(fips(state = "nj"), "34") + expect_equal(fips(state = "NJ"), "34") + expect_equal(fips(state = "New Jersey"), "34") + expect_equal(fips(state = "new jersey"), "34") +}) + +test_that("multiple states return appropriate FIPS codes", { + expect_equal(fips(c("CA", "NJ", "AL", "XX", "SD")), c("06", "34", "01", NA, "46")) + expect_equal(fips(c("CA", "New jersey", "AL", "XX", "sOutH dAkoTA")), c("06", "34", "01", NA, "46")) +}) + +test_that("returns correct FIPS code for county", { + expect_equal(fips(state = "NJ", county = "mercer"), "34021") + expect_equal(fips(state = "NJ", county = "mercer county"), "34021") + expect_equal(fips(state = "NJ", county = "Mercer County"), "34021") + expect_equal(fips(state = "new jersey", county = "mercer"), "34021") + expect_equal(fips(state = "New Jersey", county = "Mercer County"), "34021") +}) + +test_that("multiple counties in same state return appropriate FIPS codes", { + expect_equal(fips(state = "NJ", county = c("Bergen", "Hudson")), c("34003", "34017")) + expect_equal(fips(state = "NJ", county = c("Hudson", "Bergen")), c("34017", "34003")) + expect_equal(fips(state = "NJ", county = c("Bergen County", "Hudson")), c("34003", "34017")) + expect_equal(fips(state = "NJ", county = c("bergen", "hudson county")), c("34003", "34017")) +}) + +test_that("returns correct FIPS if it starts with a 0", { + expect_equal(fips(state = "AL"), "01") + expect_equal(fips(state = "CA"), "06") + expect_equal(fips(state = "AL", county = "autauga"), "01001") + expect_equal(fips(state = "AL", county = "baldwin"), "01003") + expect_equal(fips(state = "AL", county = "barbour"), "01005") +}) + +test_that("NA is returned for invalid state", { + expect_true(is.na(fips(state = "Guam"))) +}) + +test_that("error occurs for missing state", { + expect_error(fips(county = "Mercer County")) +}) + +test_that("error occurs for county with list of states", { + expect_error(fips(state = c("CA", "NJ"), county = "Mercer")) +}) + +test_that("error occurs for invalid counties", { + expect_error(fips(state = "CA", county = "Fake County")) + expect_error(fips(state = "CA", county = c("Fake County 1", "Fake County 2"))) +}) + +# This is to ensure that the Shannon County -> Oglala Lakota County +# change that occurred in South Dakota (May 1, 2015) is properly reflected. +test_that("Oglala Lakota County is correctly in the data", { + expect_error(fips(state = "SD", county = "Shannon County")) + expect_equal(fips(state = "SD", county = "Oglala Lakota County"), "46102") +}) + +# This is to ensure that the Wade Hampton Census Area -> Kusilvak Census Area +# change that occurred in Alaska (July 1, 2015) is properly reflected. +test_that("Kusilvak Census Area is correctly in the data", { + expect_error(fips(state = "AK", county = "Wade Hampton Census Area")) + expect_equal(fips(state = "AK", county = "Kusilvak Census Area"), "02158") +}) + +# This is to ensure that the Valdez-Cordova Census Area -> Chugach Census Area / Copper River Census Area +# change that occurred in Alaska (January 2, 2019) is properly reflected. +test_that("Chugach Census Area and Copper River Census Area are correctly in the data", { + expect_error(fips(state = "AK", county = "Valdez-Cordova Census Area")) + expect_equal(fips(state = "AK", county = "Chugach Census Area"), "02063") + expect_equal(fips(state = "AK", county = "Copper River Census Area"), "02066") +}) diff --git a/check/usmap.Rcheck/tests/testthat/test-join-data.R b/check/usmap.Rcheck/tests/testthat/test-join-data.R new file mode 100644 index 0000000..00a99cf --- /dev/null +++ b/check/usmap.Rcheck/tests/testthat/test-join-data.R @@ -0,0 +1,56 @@ +state_data <- data.frame(fips = c("01", "02", "04"), values = c(3, 5, 10)) +county_data <- data.frame(fips = c("01001", "01003", "01005"), values = c(3, 5, 10)) + +test_that("values are assigned to states correctly", { + df <- map_with_data(state_data) + + expect_equal(unique(state_data$value[state_data$fips == "01"]), unique(df$value[df$fips == "01"])) + expect_equal(unique(state_data$value[state_data$fips == "02"]), unique(df$value[df$fips == "02"])) + expect_equal(unique(state_data$value[state_data$fips == "04"]), unique(df$value[df$fips == "04"])) +}) + +test_that("values are assigned to counties correctly", { + df <- map_with_data(county_data) + + expect_equal(unique(county_data$value[county_data$fips == "01001"]), unique(df$value[df$fips == "01001"])) + expect_equal(unique(county_data$value[county_data$fips == "01003"]), unique(df$value[df$fips == "01003"])) + expect_equal(unique(county_data$value[county_data$fips == "01005"]), unique(df$value[df$fips == "01005"])) +}) + +test_that("values are appropriately assigned if county FIPS codes are missing leading zeroes", { + county_data2 <- data.frame(fips = c(1001, 1003, 1005), values = c(3, 5, 10)) + df <- map_with_data(county_data2) + + expect_equal(unique(county_data2$value[county_data2$fips == 1001]), unique(df$value[df$fips == "01001"])) + expect_equal(unique(county_data2$value[county_data2$fips == 1003]), unique(df$value[df$fips == "01003"])) + expect_equal(unique(county_data2$value[county_data2$fips == 1005]), unique(df$value[df$fips == "01005"])) +}) + +test_that("values are appropriately assigned if state FIPS codes are missing leading zeroes", { + state_data2 <- data.frame(fips = c(1, 2, 4), values = c(3, 5, 10)) + df <- map_with_data(state_data2) + + expect_equal(unique(state_data2$value[state_data2$fips == 1]), unique(df$value[df$fips == "01"])) + expect_equal(unique(state_data2$value[state_data2$fips == 2]), unique(df$value[df$fips == "02"])) + expect_equal(unique(state_data2$value[state_data2$fips == 4]), unique(df$value[df$fips == "04"])) +}) + +test_that("error occurs for invalid column names", { + bad_data_states <- data.frame(state_fips <- c("01", "02"), values = c(3, 5)) + bad_data_values <- data.frame(fips <- c("01", "02"), the_values = c(3, 5)) + + expect_error(map_with_data(bad_data_states)) + expect_error(map_with_data(bad_data_values)) +}) + +test_that("error occurs for non-data frame input", { + expect_error(map_with_data(data = "1")) +}) + +test_that("warning occurs for empty (yet valid) data frame", { + expect_warning(map_with_data(data.frame(fips = c(), values = c()))) + expect_equal(suppressWarnings(map_with_data(data.frame(fips = c(), values = c()))), us_map()) + + expect_warning(map_with_data(data.frame(fips = c(), values = c()), include = c("01")), "*state*") + expect_warning(map_with_data(data.frame(fips = c(), values = c()), include = c("01001")), "*county*") +}) diff --git a/check/usmap.Rcheck/tests/testthat/test-plot.R b/check/usmap.Rcheck/tests/testthat/test-plot.R new file mode 100644 index 0000000..5f7f1da --- /dev/null +++ b/check/usmap.Rcheck/tests/testthat/test-plot.R @@ -0,0 +1,186 @@ +withr::local_envvar(c("USMAP_DEFAULT_EXCLUDE_PR" = FALSE)) + +test_that("dependencies are verified", { + expect_package_error("ggplot2", plot_usmap()) +}) + +library(proto) + +example_data <- data.frame( + state = c("AK", "CA", "New Jersey"), + values = c(5, 8, 7) +) + +p <- plot_usmap("counties", fill = "red") +q <- plot_usmap(data = statepop, values = "pop_2022", color = "blue") +r <- plot_usmap(data = example_data, linewidth = 0.8) +s <- plot_usmap(include = c("AL", "FL", "GA"), labels = TRUE, label_color = "blue") +t <- plot_usmap("county", include = "AZ", labels = TRUE, fill = "yellow", linewidth = 0.6) +u <- plot_usmap(include = c("CT", "MA", "NH", "RI", "VT"), labels = TRUE) +v <- plot_usmap("state", labels = TRUE) +w <- plot_usmap("counties", include = "PR", exclude = c("72001", "72003"), labels = TRUE) + +test_that("ggplot object is returned", { + expect_s3_class(p, "ggplot") + expect_s3_class(q, "ggplot") + expect_s3_class(r, "ggplot") + expect_s3_class(s, "ggplot") + expect_s3_class(t, "ggplot") + expect_s3_class(u, "ggplot") + expect_s3_class(v, "ggplot") + expect_s3_class(w, "ggplot") +}) + +test_that("no warnings are produced", { + expect_silent(p) + expect_silent(q) + expect_silent(r) + expect_silent(s) + expect_silent(t) + expect_silent(u) + expect_silent(v) + expect_silent(w) +}) + +test_that("correct data is used", { + p_map_data <- us_map(regions = "counties") + expect_identical(p$data, p_map_data) + + q_map_data <- map_with_data(statepop, values = "pop_2022") + expect_identical(q$data, q_map_data) + + r_map_data <- map_with_data(example_data) + expect_identical(r$data, r_map_data) + + s_map_data <- us_map(regions = "states", include = c("AL", "FL", "GA")) + expect_identical(s$data, s_map_data) + + t_map_data <- us_map(regions = "counties", include = "AZ") + expect_identical(t$data, t_map_data) + + u_map_data <- us_map(include = setdiff(.new_england, "ME")) + expect_identical(u$data, u_map_data) + + v_map_data <- us_map() + expect_identical(v$data, v_map_data) + + w_map_data <- us_map("counties", include = "PR", exclude = c("72001", "72003")) + expect_identical(w$data, w_map_data) +}) + +test_that("plots are stable", { + skip_on_ci() + + vdiffr::expect_doppelganger("State population map with blue outlines", q) + vdiffr::expect_doppelganger("Example data state map with custom linewidth", r) + vdiffr::expect_doppelganger("Southeastern states map with labels", s) + vdiffr::expect_doppelganger("Arizona county map with labels and fill", t) + vdiffr::expect_doppelganger("New England state map with labels excluding Maine", u) + vdiffr::expect_doppelganger("State map with labels", v) + vdiffr::expect_doppelganger("PR county map with labels and excludes", w) + + rivers_t <- usmap_transform(usrivers) + river_map <- plot_usmap() + ggplot2::geom_sf(data = rivers_t, color = "blue") + vdiffr::expect_doppelganger("State map with major rivers", river_map) +}) + +test_that("layer parameters are correct", { + expect_s3_class(p$layers[[1]], "ggproto") + expect_s3_class(p$layers[[1]]$geom, "GeomSf") + expect_equal(as.character(p$layers[[1]]$aes_params$colour), "black") + expect_equal(as.character(p$layers[[1]]$aes_params$fill), "red") + expect_equal(p$layers[[1]]$aes_params$linewidth, 0.4) + + expect_s3_class(q$layers[[1]], "ggproto") + expect_s3_class(q$layers[[1]]$geom, "GeomSf") + expect_equal(deparse(q$layers[[1]]$mapping$fill), "~.data[[\"pop_2022\"]]") + expect_equal(as.character(q$layers[[1]]$aes_params$colour), "blue") + expect_equal(q$layers[[1]]$aes_params$linewidth, 0.4) + + expect_s3_class(r$layers[[1]], "ggproto") + expect_s3_class(r$layers[[1]]$geom, "GeomSf") + expect_equal(deparse(r$layers[[1]]$mapping$fill), "~.data[[\"values\"]]") + expect_equal(as.character(r$layers[[1]]$aes_params$colour), "black") + expect_equal(r$layers[[1]]$aes_params$linewidth, 0.8) + + expect_s3_class(s$layers[[1]], "ggproto") + expect_s3_class(s$layers[[1]]$geom, "GeomSf") + expect_equal(as.character(s$layers[[1]]$aes_params$fill), "white") + expect_equal(as.character(s$layers[[1]]$aes_params$colour), "black") + expect_equal(s$layers[[1]]$aes_params$linewidth, 0.4) + expect_s3_class(s$layers[[2]], "ggproto") + expect_s3_class(s$layers[[2]]$geom, "GeomText") + expect_equal(deparse(s$layers[[2]]$mapping$label), "~.data$abbr") + expect_equal(as.character(s$layers[[2]]$aes_params$colour), "blue") + + expect_s3_class(t$layers[[1]], "ggproto") + expect_s3_class(s$layers[[1]]$geom, "GeomSf") + expect_equal(as.character(t$layers[[1]]$aes_params$fill), "yellow") + expect_equal(as.character(t$layers[[1]]$aes_params$colour), "black") + expect_equal(t$layers[[1]]$aes_params$linewidth, 0.6) + expect_s3_class(t$layers[[2]], "ggproto") + expect_s3_class(t$layers[[2]]$geom, "GeomText") + expect_equal(deparse(t$layers[[2]]$mapping$label), + "~sub(\" County\", \"\", .data$county)") + + expect_s3_class(u$layers[[1]], "ggproto") + expect_s3_class(u$layers[[1]]$geom, "GeomSf") + expect_equal(as.character(u$layers[[1]]$aes_params$fill), "white") + expect_equal(as.character(u$layers[[1]]$aes_params$colour), "black") + expect_equal(u$layers[[1]]$aes_params$linewidth, 0.4) + expect_s3_class(u$layers[[2]], "ggproto") + expect_s3_class(u$layers[[2]]$geom, "GeomText") + expect_equal(deparse(u$layers[[2]]$mapping$label), "~.data$abbr") + + expect_s3_class(v$layers[[1]], "ggproto") + expect_s3_class(v$layers[[1]]$geom, "GeomSf") + expect_equal(as.character(v$layers[[1]]$aes_params$fill), "white") + expect_equal(as.character(v$layers[[1]]$aes_params$colour), "black") + expect_equal(v$layers[[1]]$aes_params$linewidth, 0.4) + expect_s3_class(v$layers[[2]], "ggproto") + expect_s3_class(v$layers[[2]]$geom, "GeomText") + expect_equal(deparse(v$layers[[2]]$mapping$label), "~.data$abbr") + + expect_s3_class(w$layers[[1]], "ggproto") + expect_s3_class(w$layers[[1]]$geom, "GeomSf") + expect_equal(as.character(w$layers[[1]]$aes_params$fill), "white") + expect_equal(as.character(w$layers[[1]]$aes_params$colour), "black") + expect_equal(w$layers[[1]]$aes_params$linewidth, 0.4) + expect_s3_class(w$layers[[2]], "ggproto") + expect_s3_class(w$layers[[2]]$geom, "GeomText") + expect_equal(deparse(w$layers[[2]]$mapping$label), + "~sub(\" County\", \"\", .data$county)") +}) + +test_that("county data works without specifying `region`", { + data <- data.frame( + fips = c("36001", "36003", "36005", "36007"), + values = c(1, 3, 3, 5) + ) + + p <- plot_usmap(data = data, include = "NY", labels = TRUE) + expect_equal(deparse(p$layers[[2]]$mapping$label), + "~sub(\" County\", \"\", .data$county)") +}) + +test_that("plot excludes Puerto Rico based one environment variable", { + withr::with_envvar(c("USMAP_DEFAULT_EXCLUDE_PR" = TRUE), { + p <- plot_usmap() + expect_false("PR" %in% p$data$abbr) + }) + + withr::with_envvar(c("USMAP_DEFAULT_EXCLUDE_PR" = TRUE), { + p <- plot_usmap(include = "PR") + expect_contains(p$data$abbr, "PR") + }) + + withr::with_envvar(c("USMAP_DEFAULT_EXCLUDE_PR" = FALSE), { + p <- plot_usmap() + expect_contains(p$data$abbr, "PR") + }) + + withr::with_envvar(c("USMAP_DEFAULT_EXCLUDE_PR" = FALSE), { + p <- plot_usmap(exclude = "PR", labels = TRUE) + expect_false("PR" %in% p$data$abbr) + }) +}) diff --git a/check/usmap.Rcheck/tests/testthat/test-transform.R b/check/usmap.Rcheck/tests/testthat/test-transform.R new file mode 100644 index 0000000..6a27786 --- /dev/null +++ b/check/usmap.Rcheck/tests/testthat/test-transform.R @@ -0,0 +1,203 @@ +test_that("data frame with AK and HI points is transformed", { + data <- data.frame( + lon = c(-74.01, -95.36, -118.24, -87.65, -134.42, -157.86), + lat = c(40.71, 29.76, 34.05, 41.85, 58.30, 21.31) + ) + + result <- sf::st_as_sf( + data.frame( + geometry = sf::st_sfc( + sf::st_point(c(2152550, -133046.5)), + sf::st_point(c(452399.8, -1674650)), + sf::st_point(c(-1675528, -1033610)), + sf::st_point(c(1021166, -273151.2)), + sf::st_point(c(-1062738, -2125993)), + sf::st_point(c(-618107.8, -1962880)) + ) + ), + crs = usmap_crs() + ) + + expect_equal(usmap_transform(data), result, tolerance = 1e-02) +}) + +test_that("data frame with AK points is transformed", { + data <- data.frame( + lon = c(-74.01, -95.36, -118.24, -87.65, -134.42), + lat = c(40.71, 29.76, 34.05, 41.85, 58.30) + ) + + result <- sf::st_as_sf( + data.frame( + geometry = sf::st_sfc( + sf::st_point(c(2152550, -133046.5)), + sf::st_point(c(452399.8, -1674650)), + sf::st_point(c(-1675528, -1033610)), + sf::st_point(c(1021166, -273151.2)), + sf::st_point(c(-1062738, -2125993)) + ) + ), + crs = usmap_crs() + ) + + expect_equal(usmap_transform(data), result, tolerance = 1e-02) +}) + +test_that("data frame with HI points is transformed", { + data <- data.frame( + lon = c(-74.01, -95.36, -118.24, -87.65, -157.86), + lat = c(40.71, 29.76, 34.05, 41.85, 21.31) + ) + + result <- sf::st_as_sf( + data.frame( + geometry = sf::st_sfc( + sf::st_point(c(2152550, -133046.5)), + sf::st_point(c(452399.8, -1674650)), + sf::st_point(c(-1675528, -1033610)), + sf::st_point(c(1021166, -273151.2)), + sf::st_point(c(-618107.8, -1962880)) + ) + ), + crs = usmap_crs() + ) + + expect_equal(usmap_transform(data), result, tolerance = 1e-02) +}) + +test_that("data frame with no AK or HI points is transformed", { + data <- data.frame( + lon = c(-74.01, -95.36, -118.24, -87.65), + lat = c(40.71, 29.76, 34.05, 41.85) + ) + + result <- sf::st_as_sf( + data.frame( + geometry = sf::st_sfc( + sf::st_point(c(2152550, -133046.5)), + sf::st_point(c(452399.8, -1674650)), + sf::st_point(c(-1675528, -1033610)), + sf::st_point(c(1021166, -273151.2)) + ) + ), + crs = usmap_crs() + ) + + expect_equal(usmap_transform(data), result, tolerance = 1e-02) +}) + +test_that("sf object is transformed", { + sf <- sf::st_as_sf( + data.frame( + geometry = sf::st_sfc( + sf::st_point(c(-74.01, 40.71)), + sf::st_point(c(-95.36, 29.76)), + sf::st_point(c(-118.24, 34.05)), + sf::st_point(c(-87.65, 41.85)), + sf::st_point(c(-134.42, 58.30)), + sf::st_point(c(-157.86, 21.31)) + ) + ), + crs = sf::st_crs(4326) + ) + + result <- sf::st_as_sf( + data.frame( + geometry = sf::st_sfc( + sf::st_point(c(2152550, -133046.5)), + sf::st_point(c(452399.8, -1674650)), + sf::st_point(c(-1675528, -1033610)), + sf::st_point(c(1021166, -273151.2)), + sf::st_point(c(-1062738, -2125993)), + sf::st_point(c(-618107.8, -1962880)) + ) + ), + crs = usmap_crs() + ) + + expect_equal(usmap_transform(sf), result, tolerance = 1e-02) +}) + +test_that("sf object with non-lon/lat CRS is transformed", { + sf <- sf::st_as_sf( + data.frame( + geometry = sf::st_sfc( + sf::st_point(c(-8238756, 4969660)), + sf::st_point(c(-10615427, 3472737)), + sf::st_point(c(-13162417, 4035518)), + sf::st_point(c(-9757153, 5138537)), + sf::st_point(c(-14963566, 8030604)), + sf::st_point(c(-17572895, 2428881)) + ) + ), + crs = sf::st_crs(3857) + ) + + result <- sf::st_as_sf( + data.frame( + geometry = sf::st_sfc( + sf::st_point(c(2152550, -133046.5)), + sf::st_point(c(452399.8, -1674650)), + sf::st_point(c(-1675528, -1033610)), + sf::st_point(c(1021166, -273151.2)), + sf::st_point(c(-1062738, -2125993)), + sf::st_point(c(-618107.8, -1962880)) + ) + ), + crs = usmap_crs() + ) + + # test without explicit CRS + expect_equal(usmap_transform(sf), result, tolerance = 1e-02) + # test with explicit CRS + expect_equal(usmap_transform(sf, crs = sf::st_crs(3857)), result, tolerance = 1e-02) +}) + +test_that("error occurs for data with less than 2 columns", { + invalid_data <- data.frame( + lon = c(-74.01, -95.36, -118.24, -87.65) + ) + + expect_error(usmap_transform(invalid_data)) + expect_error(usmap_transform(data.frame())) +}) + +test_that("error occurs for invalid input names", { + data <- data.frame( + lon = c(-74.01, -95.36, -118.24, -87.65), + lat = c(40.71, 29.76, 34.05, 41.85) + ) + + expect_error(usmap_transform(data, input_names = c("longitude"))) + expect_error(usmap_transform(data, input_names = c("longitude", "latitude"))) +}) + +test_that("error occurs for data with non-numeric columns", { + invalid_data1 <- data.frame( + lon = c("a", "b", "c"), + lat = c("d", "e", "f") + ) + + invalid_data2 <- data.frame( + lon = c("a", "b", "c"), + lat = c(1, 2, 3) + ) + + invalid_data3 <- data.frame( + lon = c(1, 2, 3), + lat = c("d", "e", "f") + ) + + expect_error(usmap_transform(invalid_data1)) + expect_error(usmap_transform(invalid_data2)) + expect_error(usmap_transform(invalid_data3)) +}) + +test_that("warning occurs for use of defunct output_names", { + data <- data.frame( + lon = c(-74.01, -95.36, -118.24, -87.65), + lat = c(40.71, 29.76, 34.05, 41.85) + ) + + expect_warning(usmap_transform(data, output_names = c("x", "y"))) +}) diff --git a/check/usmap.Rcheck/tests/testthat/test-usmap.R b/check/usmap.Rcheck/tests/testthat/test-usmap.R new file mode 100644 index 0000000..2471a30 --- /dev/null +++ b/check/usmap.Rcheck/tests/testthat/test-usmap.R @@ -0,0 +1,18 @@ +test_that("state data frame is returned", { + data <- us_map() + + expect_equal(ncol(data), 4) + expect_equal(nrow(data), 52) + + expect_identical(us_map("state"), data) + expect_identical(us_map("states"), data) +}) + +test_that("county data frame is returned", { + data <- us_map("counties") + + expect_equal(ncol(data), 5) + expect_equal(nrow(data), 3222) + + expect_identical(us_map("county"), data) +}) diff --git a/check/usmap.Rcheck/usmap-Ex.R b/check/usmap.Rcheck/usmap-Ex.R new file mode 100644 index 0000000..2a731a0 --- /dev/null +++ b/check/usmap.Rcheck/usmap-Ex.R @@ -0,0 +1,488 @@ +pkgname <- "usmap" +source(file.path(R.home("share"), "R", "examples-header.R")) +options(warn = 1) +base::assign(".ExTimings", "usmap-Ex.timings", pos = 'CheckExEnv') +base::cat("name\tuser\tsystem\telapsed\n", file=base::get(".ExTimings", pos = 'CheckExEnv')) +base::assign(".format_ptime", +function(x) { + if(!is.na(x[4L])) x[1L] <- x[1L] + x[4L] + if(!is.na(x[5L])) x[2L] <- x[2L] + x[5L] + options(OutDec = '.') + format(x[1L:3L], digits = 7L) +}, +pos = 'CheckExEnv') + +### * +library('usmap') + +base::assign(".oldSearch", base::search(), pos = 'CheckExEnv') +base::assign(".old_wd", base::getwd(), pos = 'CheckExEnv') +cleanEx() +nameEx("dot-east_north_central") +### * dot-east_north_central + +flush(stderr()); flush(stdout()) + +base::assign(".ptime", proc.time(), pos = "CheckExEnv") +### Name: .east_north_central +### Title: East North Central census division +### Aliases: .east_north_central +### Keywords: datasets + +### ** Examples + +plot_usmap(include = .east_north_central, labels = TRUE) + + + +base::assign(".dptime", (proc.time() - get(".ptime", pos = "CheckExEnv")), pos = "CheckExEnv") +base::cat("dot-east_north_central", base::get(".format_ptime", pos = 'CheckExEnv')(get(".dptime", pos = "CheckExEnv")), "\n", file=base::get(".ExTimings", pos = 'CheckExEnv'), append=TRUE, sep="\t") +cleanEx() +nameEx("dot-east_south_central") +### * dot-east_south_central + +flush(stderr()); flush(stdout()) + +base::assign(".ptime", proc.time(), pos = "CheckExEnv") +### Name: .east_south_central +### Title: East South Central census division +### Aliases: .east_south_central +### Keywords: datasets + +### ** Examples + +plot_usmap(include = .east_south_central, labels = TRUE) + + + +base::assign(".dptime", (proc.time() - get(".ptime", pos = "CheckExEnv")), pos = "CheckExEnv") +base::cat("dot-east_south_central", base::get(".format_ptime", pos = 'CheckExEnv')(get(".dptime", pos = "CheckExEnv")), "\n", file=base::get(".ExTimings", pos = 'CheckExEnv'), append=TRUE, sep="\t") +cleanEx() +nameEx("dot-mid_atlantic") +### * dot-mid_atlantic + +flush(stderr()); flush(stdout()) + +base::assign(".ptime", proc.time(), pos = "CheckExEnv") +### Name: .mid_atlantic +### Title: Mid-Atlantic census division +### Aliases: .mid_atlantic +### Keywords: datasets + +### ** Examples + +plot_usmap(include = .mid_atlantic, labels = TRUE) + + + +base::assign(".dptime", (proc.time() - get(".ptime", pos = "CheckExEnv")), pos = "CheckExEnv") +base::cat("dot-mid_atlantic", base::get(".format_ptime", pos = 'CheckExEnv')(get(".dptime", pos = "CheckExEnv")), "\n", file=base::get(".ExTimings", pos = 'CheckExEnv'), append=TRUE, sep="\t") +cleanEx() +nameEx("dot-midwest_region") +### * dot-midwest_region + +flush(stderr()); flush(stdout()) + +base::assign(".ptime", proc.time(), pos = "CheckExEnv") +### Name: .midwest_region +### Title: Midwest census region +### Aliases: .midwest_region +### Keywords: datasets + +### ** Examples + +plot_usmap(include = .midwest_region, labels = TRUE) + + + +base::assign(".dptime", (proc.time() - get(".ptime", pos = "CheckExEnv")), pos = "CheckExEnv") +base::cat("dot-midwest_region", base::get(".format_ptime", pos = 'CheckExEnv')(get(".dptime", pos = "CheckExEnv")), "\n", file=base::get(".ExTimings", pos = 'CheckExEnv'), append=TRUE, sep="\t") +cleanEx() +nameEx("dot-mountain") +### * dot-mountain + +flush(stderr()); flush(stdout()) + +base::assign(".ptime", proc.time(), pos = "CheckExEnv") +### Name: .mountain +### Title: Mountain census division +### Aliases: .mountain +### Keywords: datasets + +### ** Examples + +plot_usmap(include = .mountain, labels = TRUE) + + + +base::assign(".dptime", (proc.time() - get(".ptime", pos = "CheckExEnv")), pos = "CheckExEnv") +base::cat("dot-mountain", base::get(".format_ptime", pos = 'CheckExEnv')(get(".dptime", pos = "CheckExEnv")), "\n", file=base::get(".ExTimings", pos = 'CheckExEnv'), append=TRUE, sep="\t") +cleanEx() +nameEx("dot-new_england") +### * dot-new_england + +flush(stderr()); flush(stdout()) + +base::assign(".ptime", proc.time(), pos = "CheckExEnv") +### Name: .new_england +### Title: New England census division +### Aliases: .new_england +### Keywords: datasets + +### ** Examples + +plot_usmap(include = .new_england, labels = TRUE) + + + +base::assign(".dptime", (proc.time() - get(".ptime", pos = "CheckExEnv")), pos = "CheckExEnv") +base::cat("dot-new_england", base::get(".format_ptime", pos = 'CheckExEnv')(get(".dptime", pos = "CheckExEnv")), "\n", file=base::get(".ExTimings", pos = 'CheckExEnv'), append=TRUE, sep="\t") +cleanEx() +nameEx("dot-north_central_region") +### * dot-north_central_region + +flush(stderr()); flush(stdout()) + +base::assign(".ptime", proc.time(), pos = "CheckExEnv") +### Name: .north_central_region +### Title: North-Central census region +### Aliases: .north_central_region +### Keywords: datasets + +### ** Examples + +plot_usmap(include = .north_central_region, labels = TRUE) + + + +base::assign(".dptime", (proc.time() - get(".ptime", pos = "CheckExEnv")), pos = "CheckExEnv") +base::cat("dot-north_central_region", base::get(".format_ptime", pos = 'CheckExEnv')(get(".dptime", pos = "CheckExEnv")), "\n", file=base::get(".ExTimings", pos = 'CheckExEnv'), append=TRUE, sep="\t") +cleanEx() +nameEx("dot-northeast_region") +### * dot-northeast_region + +flush(stderr()); flush(stdout()) + +base::assign(".ptime", proc.time(), pos = "CheckExEnv") +### Name: .northeast_region +### Title: Northeast census region +### Aliases: .northeast_region +### Keywords: datasets + +### ** Examples + +plot_usmap(include = .northeast_region, labels = TRUE) + + + +base::assign(".dptime", (proc.time() - get(".ptime", pos = "CheckExEnv")), pos = "CheckExEnv") +base::cat("dot-northeast_region", base::get(".format_ptime", pos = 'CheckExEnv')(get(".dptime", pos = "CheckExEnv")), "\n", file=base::get(".ExTimings", pos = 'CheckExEnv'), append=TRUE, sep="\t") +cleanEx() +nameEx("dot-pacific") +### * dot-pacific + +flush(stderr()); flush(stdout()) + +base::assign(".ptime", proc.time(), pos = "CheckExEnv") +### Name: .pacific +### Title: Pacific census division +### Aliases: .pacific +### Keywords: datasets + +### ** Examples + +plot_usmap(include = .pacific, labels = TRUE) + + + +base::assign(".dptime", (proc.time() - get(".ptime", pos = "CheckExEnv")), pos = "CheckExEnv") +base::cat("dot-pacific", base::get(".format_ptime", pos = 'CheckExEnv')(get(".dptime", pos = "CheckExEnv")), "\n", file=base::get(".ExTimings", pos = 'CheckExEnv'), append=TRUE, sep="\t") +cleanEx() +nameEx("dot-south_atlantic") +### * dot-south_atlantic + +flush(stderr()); flush(stdout()) + +base::assign(".ptime", proc.time(), pos = "CheckExEnv") +### Name: .south_atlantic +### Title: South Atlantic census division +### Aliases: .south_atlantic +### Keywords: datasets + +### ** Examples + +plot_usmap(include = .south_atlantic, labels = TRUE) + + + +base::assign(".dptime", (proc.time() - get(".ptime", pos = "CheckExEnv")), pos = "CheckExEnv") +base::cat("dot-south_atlantic", base::get(".format_ptime", pos = 'CheckExEnv')(get(".dptime", pos = "CheckExEnv")), "\n", file=base::get(".ExTimings", pos = 'CheckExEnv'), append=TRUE, sep="\t") +cleanEx() +nameEx("dot-south_region") +### * dot-south_region + +flush(stderr()); flush(stdout()) + +base::assign(".ptime", proc.time(), pos = "CheckExEnv") +### Name: .south_region +### Title: South census region +### Aliases: .south_region +### Keywords: datasets + +### ** Examples + +plot_usmap(include = .midwest_region, labels = TRUE) + + + +base::assign(".dptime", (proc.time() - get(".ptime", pos = "CheckExEnv")), pos = "CheckExEnv") +base::cat("dot-south_region", base::get(".format_ptime", pos = 'CheckExEnv')(get(".dptime", pos = "CheckExEnv")), "\n", file=base::get(".ExTimings", pos = 'CheckExEnv'), append=TRUE, sep="\t") +cleanEx() +nameEx("dot-west_north_central") +### * dot-west_north_central + +flush(stderr()); flush(stdout()) + +base::assign(".ptime", proc.time(), pos = "CheckExEnv") +### Name: .west_north_central +### Title: West North Central census division +### Aliases: .west_north_central +### Keywords: datasets + +### ** Examples + +plot_usmap(include = .west_north_central, labels = TRUE) + + + +base::assign(".dptime", (proc.time() - get(".ptime", pos = "CheckExEnv")), pos = "CheckExEnv") +base::cat("dot-west_north_central", base::get(".format_ptime", pos = 'CheckExEnv')(get(".dptime", pos = "CheckExEnv")), "\n", file=base::get(".ExTimings", pos = 'CheckExEnv'), append=TRUE, sep="\t") +cleanEx() +nameEx("dot-west_region") +### * dot-west_region + +flush(stderr()); flush(stdout()) + +base::assign(".ptime", proc.time(), pos = "CheckExEnv") +### Name: .west_region +### Title: West census region +### Aliases: .west_region +### Keywords: datasets + +### ** Examples + +plot_usmap(include = .midwest_region, labels = TRUE) + + + +base::assign(".dptime", (proc.time() - get(".ptime", pos = "CheckExEnv")), pos = "CheckExEnv") +base::cat("dot-west_region", base::get(".format_ptime", pos = 'CheckExEnv')(get(".dptime", pos = "CheckExEnv")), "\n", file=base::get(".ExTimings", pos = 'CheckExEnv'), append=TRUE, sep="\t") +cleanEx() +nameEx("dot-west_south_central") +### * dot-west_south_central + +flush(stderr()); flush(stdout()) + +base::assign(".ptime", proc.time(), pos = "CheckExEnv") +### Name: .west_south_central +### Title: West South Central census division +### Aliases: .west_south_central +### Keywords: datasets + +### ** Examples + +plot_usmap(include = .west_south_central, labels = TRUE) + + + +base::assign(".dptime", (proc.time() - get(".ptime", pos = "CheckExEnv")), pos = "CheckExEnv") +base::cat("dot-west_south_central", base::get(".format_ptime", pos = 'CheckExEnv')(get(".dptime", pos = "CheckExEnv")), "\n", file=base::get(".ExTimings", pos = 'CheckExEnv'), append=TRUE, sep="\t") +cleanEx() +nameEx("fips") +### * fips + +flush(stderr()); flush(stdout()) + +base::assign(".ptime", proc.time(), pos = "CheckExEnv") +### Name: fips +### Title: Retrieve FIPS code for either a US state or county +### Aliases: fips + +### ** Examples + +fips() + +fips("NJ") +fips("California") + +fips(c("AK", "CA", "UT")) + +fips("CA", county = "orange") +fips(state = "AL", county = "autauga") +fips(state = "Alabama", county = "Autauga County") + + + +base::assign(".dptime", (proc.time() - get(".ptime", pos = "CheckExEnv")), pos = "CheckExEnv") +base::cat("fips", base::get(".format_ptime", pos = 'CheckExEnv')(get(".dptime", pos = "CheckExEnv")), "\n", file=base::get(".ExTimings", pos = 'CheckExEnv'), append=TRUE, sep="\t") +cleanEx() +nameEx("fips_info") +### * fips_info + +flush(stderr()); flush(stdout()) + +base::assign(".ptime", proc.time(), pos = "CheckExEnv") +### Name: fips_info +### Title: Retrieve states or counties using FIPS codes +### Aliases: fips_info fips_info.numeric fips_info.character + +### ** Examples + +fips_info(2) +fips_info("2") +fips_info(c("02", "03", "04")) + +fips_info(2016) +fips_info(c("02016", "02017"), sortAndRemoveDuplicates = TRUE) + + + + +base::assign(".dptime", (proc.time() - get(".ptime", pos = "CheckExEnv")), pos = "CheckExEnv") +base::cat("fips_info", base::get(".format_ptime", pos = 'CheckExEnv')(get(".dptime", pos = "CheckExEnv")), "\n", file=base::get(".ExTimings", pos = 'CheckExEnv'), append=TRUE, sep="\t") +cleanEx() +nameEx("map_with_data") +### * map_with_data + +flush(stderr()); flush(stdout()) + +base::assign(".ptime", proc.time(), pos = "CheckExEnv") +### Name: map_with_data +### Title: Join county or state level data to US map data +### Aliases: map_with_data + +### ** Examples + +state_data <- data.frame(fips = c("01", "02", "04"), values = c(1, 5, 8)) +df <- map_with_data(state_data, na = 0) + +state_data <- data.frame(state = c("AK", "CA", "Utah"), values = c(6, 9, 3)) +df <- map_with_data(state_data, na = 0) + + + + +base::assign(".dptime", (proc.time() - get(".ptime", pos = "CheckExEnv")), pos = "CheckExEnv") +base::cat("map_with_data", base::get(".format_ptime", pos = 'CheckExEnv')(get(".dptime", pos = "CheckExEnv")), "\n", file=base::get(".ExTimings", pos = 'CheckExEnv'), append=TRUE, sep="\t") +cleanEx() +nameEx("plot_usmap") +### * plot_usmap + +flush(stderr()); flush(stdout()) + +base::assign(".ptime", proc.time(), pos = "CheckExEnv") +### Name: plot_usmap +### Title: Conveniently plot basic US map +### Aliases: plot_usmap + +### ** Examples + +plot_usmap() +plot_usmap(regions = "states") +plot_usmap(regions = "counties") +plot_usmap(regions = "state") +plot_usmap(regions = "county") + +# Output is ggplot object so it can be extended +# with any number of ggplot layers +library(ggplot2) +plot_usmap(include = c("CA", "NV", "ID", "OR", "WA")) + + labs(title = "Western States") + +# Color maps with data +plot_usmap(data = statepop, values = "pop_2022") + +# Include labels on map (e.g. state abbreviations) +plot_usmap(data = statepop, values = "pop_2022", labels = TRUE) +# Choose color for labels +plot_usmap(data = statepop, values = "pop_2022", labels = TRUE, label_color = "white") + + + + +base::assign(".dptime", (proc.time() - get(".ptime", pos = "CheckExEnv")), pos = "CheckExEnv") +base::cat("plot_usmap", base::get(".format_ptime", pos = 'CheckExEnv')(get(".dptime", pos = "CheckExEnv")), "\n", file=base::get(".ExTimings", pos = 'CheckExEnv'), append=TRUE, sep="\t") +cleanEx() +nameEx("us_map") +### * us_map + +flush(stderr()); flush(stdout()) + +base::assign(".ptime", proc.time(), pos = "CheckExEnv") +### Name: us_map +### Title: Retrieve US map data +### Aliases: us_map + +### ** Examples + +str(us_map()) + +df <- us_map(regions = "counties") +west_coast <- us_map(include = c("CA", "OR", "WA")) + +excl_west_coast <- us_map(exclude = c("CA", "OR", "WA")) + +ct_counties_as_of_2022 <- us_map(regions = "counties", include = "CT", data_year = 2022) + + + +base::assign(".dptime", (proc.time() - get(".ptime", pos = "CheckExEnv")), pos = "CheckExEnv") +base::cat("us_map", base::get(".format_ptime", pos = 'CheckExEnv')(get(".dptime", pos = "CheckExEnv")), "\n", file=base::get(".ExTimings", pos = 'CheckExEnv'), append=TRUE, sep="\t") +cleanEx() +nameEx("usmap_transform") +### * usmap_transform + +flush(stderr()); flush(stdout()) + +base::assign(".ptime", proc.time(), pos = "CheckExEnv") +### Name: usmap_transform +### Title: Convert spatial data to usmap projection +### Aliases: usmap_transform usmap_transform.sf usmap_transform.data.frame + +### ** Examples + +data <- data.frame( + lon = c(-74.01, -95.36, -118.24, -87.65, -134.42, -157.86), + lat = c(40.71, 29.76, 34.05, 41.85, 58.30, 21.31), + pop = c(8398748, 2325502, 3990456, 2705994, 32113, 347397) +) + +# Transform data +transformed_data <- usmap_transform(data) + +# Plot transformed data on map +library(ggplot2) + +plot_usmap() + geom_sf( + data = transformed_data, + aes(size = pop), + color = "red", alpha = 0.5 +) + + + + +base::assign(".dptime", (proc.time() - get(".ptime", pos = "CheckExEnv")), pos = "CheckExEnv") +base::cat("usmap_transform", base::get(".format_ptime", pos = 'CheckExEnv')(get(".dptime", pos = "CheckExEnv")), "\n", file=base::get(".ExTimings", pos = 'CheckExEnv'), append=TRUE, sep="\t") +### *