How can I determine if labels will be removed from the chart area in the ggplot2 chart?

I have a code that I often use to create large batches of histograms. The bars are grouped by labels along the x axis, and then each individual bar has a label on top of the panel itself. Sometimes the text for a single hatch mark passes over the top of the chart area and is truncated, depending on the length of the x axis mark, the length of a separate bar mark and the height of the panel itself.

I can manually adjust scale_y_continuous(limits=c(0,100))for each chart to make it look beautiful. For example, if the bar is raised to 100% in height, but has a very long label, I can use: scale_y_continuous(limits=c(0,140),breaks=c(0,25,50,75,100)). This stops the y-axis label marks by 100%, but leaves an extra room at the top of the graph area for my label. If the bar rises to 40% and has a short mark, leaving the y limits at c (0.140), it looks bad, because there is too much white mileage above the 100% mark.

Since I am making tons of these graphs, I would like you to automatically determine how to set limits scale_y_continuousfor each graph. Doing this manually is too time consuming.

Is there a way to check if the label is trimmed or is the plot portion running? If so, I could just repeat my path to a beautiful plot, checking to see if the label is disabled, and then expanded a little to y until there is a truncation.

+4
source share
1 answer

I do not think it can be done. And I think it comes down to the fact that you do not fully understand the grammar on which it is based ggplot2. In particular, how it ggplotmaps data values ​​to aesthetic values.

This can be understood intuitively with a simple thought experiment:

library(ggplot2)
data(mtcars)
p <- ggplot(mtcars, aes(wt, mpg, label = rownames(mtcars)))
# consider
p + geom_text()
# vs 
p + geom_text(size= 15)

p + geom_text() p + geom_text(size=15)? () . , . , ; .

- ggplot:

p2 <- p + geom_text()
str(p2)
List of 9
 $ data       :'data.frame':    32 obs. of  11 variables:
  ..$ mpg : num [1:32] 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
  ..$ cyl : num [1:32] 6 6 4 6 8 6 8 4 4 6 ...
  ..$ disp: num [1:32] 160 160 108 258 360 ...
  ..$ hp  : num [1:32] 110 110 93 110 175 105 245 62 95 123 ...
  ..$ drat: num [1:32] 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
  ..$ wt  : num [1:32] 2.62 2.88 2.32 3.21 3.44 ...
  ..$ qsec: num [1:32] 16.5 17 18.6 19.4 17 ...
  ..$ vs  : num [1:32] 0 0 1 1 0 1 0 1 1 1 ...
  ..$ am  : num [1:32] 1 1 1 0 0 0 0 0 0 0 ...
  ..$ gear: num [1:32] 4 4 4 3 3 3 3 4 4 4 ...
  ..$ carb: num [1:32] 4 4 1 1 2 1 4 2 2 4 ...
 $ layers     :List of 2
  ..$ :Classes 'proto', 'environment' <environment: 0x0000000015eb15f8> 
  ..$ :Classes 'proto', 'environment' <environment: 0x0000000015f6d0a0> 
 $ scales     :Reference class 'Scales' [package "ggplot2"] with 1 field
  ..$ scales: list()
  ..and 23 methods, of which 9 are  possibly relevant:
  ..  add, clone, find, get_scales, has_scale, initialize, input, n, non_position_scales
 $ mapping    :List of 3
  ..$ x    : symbol wt
  ..$ y    : symbol mpg
  ..$ label: language rownames(mtcars)
 $ theme      : list()
 $ coordinates:List of 1
  ..$ limits:List of 2
  .. ..$ x: NULL
  .. ..$ y: NULL
  ..- attr(*, "class")= chr [1:2] "cartesian" "coord"
 $ facet      :List of 1
  ..$ shrink: logi TRUE
  ..- attr(*, "class")= chr [1:2] "null" "facet"
 $ plot_env   :<environment: R_GlobalEnv> 
 $ labels     :List of 3
  ..$ x    : chr "wt"
  ..$ y    : chr "mpg"
  ..$ label: chr "rownames(mtcars)"
 - attr(*, "class")= chr [1:2] "gg" "ggplot"

, ( ). , , ggplot2 , . . , , - ggsave grDevices (png ..), .

3.7 ggplot, , , , .

... - ggplot/ , -, , , .

+4

Source: https://habr.com/ru/post/1625389/


All Articles