thomasp85 / ggforce

Accelerating ggplot2
https://ggforce.data-imaginist.com
Other
916 stars 105 forks source link

Adjusting shape with geom_mark_rect #304

Closed meghanmshea closed 7 months ago

meghanmshea commented 1 year ago

I've been trying to make a reproducible version of a diagram of the sampling scheme for a particular field project, mirroring this version that I made by hand in PowerPoint:

PowerPoint Figure Version

Geom_mark_rect has been super helpful for creating boxes around the collections of points. However, I've been having trouble making the boxes fit more tightly around the points (and not being forced to squares); when I try to make a similarly narrow version of the R figure, the boxes overlap:

R Figure Version

It would be great if there were a way to make the geom_mark_rect boxes tighter around the points; any advice on parameters to change or things to try would be greatly appreciated. The code used to produce the R figure is below, where data_forchart can be imported from the attached .csv:

facet.labs =  c("Tide Pool 1\n (S1)", "Tide Pool 2\n (S2)", "Nearshore\n (N)")
names(facet.labs) = c("S1", "S2", "N")

data_forchart$Location= factor(data_forchart$Location, levels=c("S1", "S2", "N"))
data_forchart$chart_num= factor(data_forchart$chart_num, levels=c("3", "2", "1"))

sample_schema = ggplot(data = data_forchart, aes(x = Time, y = chart_num, shape = Location, color = Time, fill = Time)) + 
  geom_beeswarm(cex= 2, size = 3) + 
  geom_mark_rect(expand = .03) +
  scale_shape_manual(values = c(15, 17, 16)) + 
  viridis::scale_color_viridis(discrete=TRUE, begin = 0, end = .97, direction = -1) +
  viridis::scale_fill_viridis(discrete=TRUE, begin = 0, end = .97, direction = -1) +
  facet_grid(Location ~., scales = "free_y", space = "free_y", switch = "y", labeller = labeller(Location = facet.labs)) +
  theme_void(base_size = 16) + 
  theme(legend.position = "none") +
theme(strip.text.y.left = element_text(angle = 0, hjust = 1, vjust = .9)) 

Chart_Data.csv 28-Jan-2022-TideChart.txt

thomasp85 commented 7 months ago

I'm afraid this is a case of the tool being used for the wrong job. Since the mark geoms always calculate expansion in the render dimension it will be eternally fiddly to try to make it match your vision.

You'd be better off calculating the right dimensions that fits the coordinates of your data and then using geom_shape() to round the corners