r - 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)我想在百分比下方的括号中添加观察量,但我无法弄清楚如何确保深灰色和浅灰色条从不同列中获取观察结果。
谁能告诉我我做错了什么?
解决方案
问题是您的图层中没有分组美学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)
推荐阅读
- c# - 带有绑定和样式的 Toast 通知
- node.js - Discord bot 和 Node 服务器之间的通信
- ios - Honeywell Captuvo iOS SDK 的链接器命令失败
- ffmpeg - : 和 - 应用 drawtext 时不显示字符
- php - 如何在 PHP 中获取我的 PC 网卡的 IP 地址
- android - 错误:在项目“应用程序”中,解决了 Google Play 服务库依赖项
- apache-spark - 从合适的自定义 pyspark 变压器中获取参数
- swift - 扩展类中的字段 null
- javascript - 我可以在 JavaScript 中模拟文本选择吗?
- python - 从 RSA 512 的原始二进制字节中提取公钥