-
Notifications
You must be signed in to change notification settings - Fork 2k
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
Holed polygons #3128
Holed polygons #3128
Conversation
Thanks for making this happen! I can’t really test this right now, because I don’t want to touch my R install during the final stages of book production, in case I have to re-render any figures. I like the name I think winding order should be made available as an option. I originally thought I’d need it for isobands, but thinking some more about it it may not matter. Am I correct that for perfectly nested polygon rings running in alternating directions evenodd and winding order give the same result? It would be good to test this with the isoband output on some non-trivial datasets. Would you mind trying this out? The |
One question: Do the polygon paths need to be closed (last point = first point) or not? |
munched <- munched[order(munched$group), ] | ||
|
||
# For gpar(), there is one entry per polygon (not one entry per point). | ||
# We'll pull the first value from each group, and assume all these values |
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.
Other geoms check this assumption and issue a warning if an aesthetic changes where it’s not supposed to. See e.g. geom_area()
. Needed here?
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 think that may become prohibitly expensive to check for the kind of data that people will throw at this... Maybe make it more clear in the docs?
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.
Do you think a single call to unique()
is that much more expensive than, say, the ordering of the data that is also happening?
Lines 80 to 83 in 18be30e
aes <- unique(data[c("colour", "fill", "size", "linetype", "alpha")]) | |
if (nrow(aes) > 1) { | |
stop("Aesthetics can not vary with a ribbon") | |
} |
At a minimum, this might be worth a careful benchmark on a very large dataset, such as the output from isobands()
on a large raster image.
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’ll happily do the benchmark, but the big difference is that geom_ribbon uses a draw_group method whereas geom_polygon uses draw_panel. This means that geom_polygon would have to split up the data and call unique on each sub-data.frame all for the sake of a possible warning. For geom ribbon the split has already been done so it is rather cheap
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 see. In any case, it's your call. I won't insist.
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.
We may wanted to eventually tackle this problem by providing a new geom where there's one row per polygon and the vertices are stored in a nested data frame.
For the example you describe "evenodd" and "winding" should give the same result. I don't feel strongly about omitting it so I'll add a pathGrob uses the same open polygon spec as polygonGrob so no need to repeat the last point |
I just wanted to confirm that I tried "evenodd" with the current |
R/ggplot-global.R
Outdated
@@ -44,3 +44,5 @@ ggplot_global$all_aesthetics <- .all_aesthetics | |||
) | |||
|
|||
ggplot_global$base_to_ggplot <- .base_to_ggplot | |||
|
|||
grid_has_multipath <- packageVersion('grid') >= "3.6" |
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 don't think computing this value at build time is correct. Instead, I think you should just inline into geom_polygon()
.
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'm fine with subgroup
, and don't have particularly strong feelings otherwise (except that computing grid_has_multipath
when the package is built is not correct).
This old issue has been automatically locked. If you believe you have found a related problem, please file a new issue (with reprex) and link to this issue. https://reprex.tidyverse.org/ |
This PR adds the ability to draw polygons with holes to
geom_polygon
. It does so by adding a new, optional, aesthetic calledsubgroup
. If provided, and R >= 3.6 the geom will use the new improved pathGrob to draw the polygons.Questions to mull over:
subgroup
name. I've elected for a generic name so it can be reused elsewhere if secondary grouping is needed, rather than using something that signifies the "hole"-ness of itExample: