首页 > 解决方案 > geom_text 定位同时应用于两个条,而不是分别应用于每个条

问题描述

我的数据如下:

library(ggplot2)
library(dplyr)
library(tidyverse)
library(ggsignif)

graph <- structure(list(Constraint = structure(c(4L, 2L, 3L, 1L, 5L, 4L, 
2L, 3L, 1L, 5L), .Label = c("Major Constraint", "Minor Constraint", 
"Moderate Constraint", "No Constraint", "Total"), class = "factor"), 
    `Observation for Crime = 0` = c(3124, 2484, 3511, 4646, 13765, 
    3124, 2484, 3511, 4646, 13765), `Observation for Crime = 1` = c(762, 
    629, 1118, 1677, 4186, 762, 629, 1118, 1677, 4186), `Total Observations` = c(3886, 
    3113, 4629, 6323, 17951, 3886, 3113, 4629, 6323, 17951), 
    variable = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
    2L), .Label = c("Crime = 0", "Crime = 1"), class = "factor"), 
    value = c(80.3911477097272, 79.79441053646, 75.847915316483, 
    73.4777795350308, 76.6809648487549, 19.6088522902728, 20.20558946354, 
    24.152084683517, 26.5222204649692, 23.3190351512451)), row.names = c(NA, 
-10L), class = "data.frame")

            Constraint Observation for Crime = 0 Observation for Crime = 1 Total Observations  variable    value
1        No Constraint                      3124                       762               3886 Crime = 0 80.39115
2     Minor Constraint                      2484                       629               3113 Crime = 0 79.79441
3  Moderate Constraint                      3511                      1118               4629 Crime = 0 75.84792
4     Major Constraint                      4646                      1677               6323 Crime = 0 73.47778
5                Total                     13765                      4186              17951 Crime = 0 76.68096
6        No Constraint                      3124                       762               3886 Crime = 1 19.60885
7     Minor Constraint                      2484                       629               3113 Crime = 1 20.20559
8  Moderate Constraint                      3511                      1118               4629 Crime = 1 24.15208
9     Major Constraint                      4646                      1677               6323 Crime = 1 26.52222
10               Total                     13765                      4186              17951 Crime = 1 23.31904

graph %>% 
  mutate(`Constraint` = fct_relevel(`Constraint`, "No Constraint", "Minor Constraint", "Moderate Constraint", "Major Constraint")) %>%
  ggplot(aes(x = `Constraint`, y = value)) + 
  geom_col(position = 'dodge', aes(fill = variable)) + 
  geom_text(position = position_dodge(width = .9),    # move to center of bars
            aes(label=sprintf("%.02f %%", round(value, digits = 1))),
            vjust = -2.5,    # nudge above top of bar
            hjust = - 0.2,
            size = 4) +        
  geom_text(position = position_dodge(width = .9),    # move to center of bars
            aes(label=`Observation for Crime = 0`),
            vjust = -0.6,    # nudge above top of bar
            hjust = - 0.2,
            size = 4) +     
  scale_fill_grey(start = 0.8, end = 0.5) +
  ylab("Percentage") + 
  xlab("Tax Constraint") + 
  theme_bw(base_size = 15)

导致:

在此处输入图像描述

以下是行不通的:

A) 尽管深灰色条的百分比位于中间,但浅灰色条的百分比不在中间。显然我以某种方式geom_text申请了两个酒吧的中间,而不是单独的酒吧。

B)我想在百分比下方的括号中添加观察量,但我无法弄清楚如何确保深灰色和浅灰色条从不同列中获取观察结果。

谁能告诉我我做错了什么?

标签: rggplot2

解决方案


问题是您的图层中没有分组美学geom_text,即您的条被分组和躲避fill=variable,您的标签不是。要解决此问题,请添加group=variable到您geom_text的 s. 您的第二个问题可以通过ifelse有条件地选择您的一列来解决。

library(ggplot2)
library(dplyr)
library(tidyverse)
library(ggsignif)

graph %>% 
  mutate(`Constraint` = fct_relevel(`Constraint`, "No Constraint", "Minor Constraint", "Moderate Constraint", "Major Constraint")) %>%
  ggplot(aes(x = `Constraint`, y = value)) + 
  geom_col(position = 'dodge', aes(fill = variable)) + 
  geom_text(position = position_dodge(width = .9),    # move to center of bars
            aes(label=sprintf("%.02f %%", round(value, digits = 1)), group = variable),
            vjust = -2.5,    # nudge above top of bar
            size = 4) +        
  geom_text(position = position_dodge(width = .9),    # move to center of bars
            aes(label= paste0("(", ifelse(variable == "Crime = 0", `Observation for Crime = 0`, `Observation for Crime = 1`), ")"), group = variable),
            vjust = -0.6,    # nudge above top of bar
            size = 4) +     
  scale_fill_grey(start = 0.8, end = 0.5) +
  ylab("Percentage") + 
  xlab("Tax Constraint") + 
  theme_bw(base_size = 15)


推荐阅读