-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Implement geom_sf_label() and geom_sf_text() #2761
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
27 commits
Select commit
Hold shift + click to select a range
0b466ef
Add geom_sf_label() and geom_sf_text()
yutannihilation 7b7be7b
Add a missing parenthesis
yutannihilation bc4383a
Merge remote-tracking branch 'upstream/master' into geom-sf-label
yutannihilation c968931
Add tests for stat_sf_coordinates()
yutannihilation fd1b069
Fix a typo
yutannihilation fc7ce69
Fix a typo in examples
yutannihilation 3e9121d
Add visual tests for geom_sf_label() and geom_sf_text()
yutannihilation 9764a95
Match args for stat_sf_coordinates() and StatSfCoordinates$compute_gr…
yutannihilation 9d540eb
Document stat_sf_coordinates()'s na.rm
yutannihilation a813230
Add documents about stat_sf_coordinats()
yutannihilation f22ee47
Set the default of fun.geometry to NULL
yutannihilation a240622
Set more fun.geometry to NULL
yutannihilation 6a280a9
Fix mistakenly passed sf::point_on_surface
yutannihilation bfe7f3a
Stop cross-referencing sf functions
yutannihilation 342c0c2
Ignore Z and M dimension
yutannihilation f89baf0
Fix the example of stat_sf_coordinates()
yutannihilation 67824e1
Remove Rplot001.png
yutannihilation 1407844
Fix doc of stat_sf_coordinates()
yutannihilation 721c83f
Fix an example of stat_sf_coordinates()
yutannihilation 1da6364
Fix default fun.geometry and tests
yutannihilation f50d883
Fix a typo in doc
yutannihilation 0a6fe1a
Add reference images for vdiffr tests
yutannihilation 2a67704
Disable stat-sf-coordinates test
yutannihilation 6ff3bc9
Merge remote-tracking branch 'upstream/master' into geom-sf-label
yutannihilation cab2b4f
Fix "texts" to "text", and move seealso
yutannihilation e60df8e
Add () to functions in ggsf.Rd for consitency
yutannihilation 5cd4d64
Add a news bullet
yutannihilation File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,112 @@ | ||
#' Extract coordinates from 'sf' objects | ||
#' | ||
#' `stat_sf_coordinates()` extracts the coordinates from 'sf' objects and | ||
#' summarises them to one pair of coordinates (x and y) per geometry. This is | ||
#' convenient when you draw an sf object as geoms like text and labels (so | ||
#' [geom_sf_text()] and [geom_sf_label()] relies on this). | ||
#' | ||
#' @rdname stat_sf_coordinates | ||
#' @details | ||
#' coordinates of an `sf` object can be retrieved by `sf::st_coordinates()`. | ||
#' But, we cannot simply use `sf::st_coordinates()` because, whereas text and | ||
#' labels require exactly one coordinate per geometry, it returns multiple ones | ||
#' for a polygon or a line. Thus, these two steps are needed: | ||
#' | ||
#' 1. Choose one point per geometry by some function like `sf::st_centroid()` | ||
#' or `sf::st_point_on_surface()`. | ||
#' 2. Retrieve coordinates from the points by `sf::st_coordinates()`. | ||
#' | ||
#' For the first step, you can use an arbitrary function via `fun.geometry`. | ||
#' By default, `function(x) sf::st_point_on_surface(sf::st_zm(x))` is used; | ||
#' `sf::st_point_on_surface()` seems more appropriate than `sf::st_centroid()` | ||
#' since lables and text usually are intended to be put within the polygon or | ||
#' the line. `sf::st_zm()` is needed to drop Z and M dimension beforehand, | ||
#' otherwise `sf::st_point_on_surface()` may fail when the geometries have M | ||
#' dimension. | ||
#' | ||
#' @section Computed variables: | ||
#' \describe{ | ||
#' \item{x}{X dimension of the simple feature} | ||
#' \item{y}{Y dimension of the simple feature} | ||
#' } | ||
#' | ||
#' @examples | ||
#' if (requireNamespace("sf", quietly = TRUE)) { | ||
#' nc <- sf::st_read(system.file("shape/nc.shp", package="sf")) | ||
#' | ||
#' ggplot(nc) + | ||
#' stat_sf_coordinates() | ||
#' | ||
#' ggplot(nc) + | ||
#' geom_errorbarh( | ||
#' aes(geometry = geometry, | ||
#' xmin = stat(x) - 0.1, | ||
#' xmax = stat(x) + 0.1, | ||
#' y = stat(y), | ||
#' height = 0.04), | ||
#' stat = "sf_coordinates" | ||
#' ) | ||
#' } | ||
#' | ||
#' @export | ||
#' @inheritParams stat_identity | ||
#' @inheritParams geom_point | ||
#' @param fun.geometry | ||
#' A function that takes a `sfc` object and returns a `sfc_POINT` with the | ||
#' same length as the input. If `NULL`, `function(x) sf::st_point_on_surface(sf::st_zm(x))` | ||
#' will be used. Note that the function may warn about the incorrectness of | ||
#' the result if the data is not projected, but you can ignore this except | ||
#' when you really care about the exact locations. | ||
stat_sf_coordinates <- function(mapping = aes(), data = NULL, geom = "point", | ||
position = "identity", na.rm = FALSE, | ||
show.legend = NA, inherit.aes = TRUE, | ||
fun.geometry = NULL, | ||
...) { | ||
# Automatically determin name of geometry column | ||
if (!is.null(data) && is_sf(data)) { | ||
geometry_col <- attr(data, "sf_column") | ||
} else { | ||
geometry_col <- "geometry" | ||
} | ||
if (is.null(mapping$geometry)) { | ||
mapping$geometry <- as.name(geometry_col) | ||
} | ||
|
||
layer( | ||
stat = StatSfCoordinates, | ||
data = data, | ||
mapping = mapping, | ||
geom = geom, | ||
position = position, | ||
show.legend = show.legend, | ||
inherit.aes = inherit.aes, | ||
params = list( | ||
na.rm = na.rm, | ||
fun.geometry = fun.geometry, | ||
... | ||
) | ||
) | ||
} | ||
|
||
#' @rdname stat_sf_coordinates | ||
#' @usage NULL | ||
#' @format NULL | ||
#' @export | ||
StatSfCoordinates <- ggproto( | ||
"StatSfCoordinates", Stat, | ||
compute_group = function(data, scales, fun.geometry = NULL) { | ||
if (is.null(fun.geometry)) { | ||
fun.geometry <- function(x) sf::st_point_on_surface(sf::st_zm(x)) | ||
} | ||
|
||
points_sfc <- fun.geometry(data$geometry) | ||
coordinates <- sf::st_coordinates(points_sfc) | ||
data$x <- coordinates[, "X"] | ||
data$y <- coordinates[, "Y"] | ||
|
||
data | ||
}, | ||
|
||
default_aes = aes(x = stat(x), y = stat(y)), | ||
required_aes = c("geometry") | ||
) |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The error message would be clearer if it specified what can't be done. E.g. "
position
andnudge_x
/nudge_y
cannot both be specified. Please specify only one."There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I just copied and pasted this line from here. Can I leave this for now so that we can change them both at the same time?
ggplot2/R/geom-label.R
Line 20 in c040a5b