Попробуйте это регулярное выражение:
^[^\s]+(\s.*)?$
Это означает один или несколько символов, которые не являются пробелами, а затем, возможно, пробелом, за которым следует что-либо.
Проще всего вычислить нужные вам величины за пределами ggplot, так как трудно отслеживать, что вычисляет ggplot и где эти величины хранятся и доступны.
Сначала суммируем ваши данные:
library(dplyr)
mtcars %>% count(cyl = factor(cyl), gear = factor(gear)) %>%
ungroup() %>% # drop if you want percentages per cylinder
mutate(pct = prop.table(n) * 100)
## # A tibble: 8 × 4
## cyl gear n pct
## <fctr> <fctr> <int> <dbl>
## 1 4 3 1 3.125
## 2 4 4 8 25.000
## 3 4 5 2 6.250
## 4 6 3 2 6.250
## 5 6 4 4 12.500
## 6 6 5 1 3.125
## 7 8 3 12 37.500
## 8 8 5 2 6.250
Сохраните это, если хотите, или прямо в ggplot:
mtcars %>% count(cyl = factor(cyl), gear = factor(gear)) %>%
ungroup() %>%
mutate(pct = prop.table(n) * 100) %>%
ggplot(aes(x = cyl, y = pct, fill = gear)) +
geom_bar(stat = 'identity', position = 'dodge') +
geom_text(aes(y = pct + .5, # nudge above top of bar
label = paste0(pct, '%')), # prettify
position = position_dodge(width = .9),
size = 3)
Если вы действительно хотите его сохранить все внутренние по отношению к ggplot, вы можете использовать geom_text
с stat = 'count'
(или stat_count
с geom = "text"
, если хотите):
ggplot(data = mtcars, aes(x = factor(cyl), fill = factor(gear))) +
geom_bar(aes(y = prop.table(..count..) * 100),
position = "dodge") +
geom_text(aes(y = prop.table(..count..) * 100 + 0.5,
label = paste0(prop.table(..count..) * 100, '%')),
stat = 'count',
position = position_dodge(.9),
size = 3) +
labs(x = 'cyl', y = 'pct', fill = 'gear')
, который изображает одно и то же.