将整体 bar 和 perc 标签添加到 geom_bar

2024-02-28

我正在寻找以下问题的解决方案: 我有包含两个因子变量的数据EDU and LEVEL。可重现的数据样本在这里:

structure(list(EDU = structure(c(3L, 1L, 2L, 2L, 3L, 2L, 3L, 
2L, 3L, 1L, 1L, 1L, 1L, 1L, 3L, 1L, 2L, 3L, 3L, 1L, 2L, 3L, 2L, 
2L, 2L, 1L, 1L, 3L, 3L, 2L, 3L, 2L, 3L, 3L, 2L, 3L, 2L, 2L, 3L, 
3L, 1L, 1L, 3L, 3L, 3L, 3L, 2L, 1L, 3L, 1L), .Label = c("A", 
"B", "C"), class = "factor"), LEVEL = structure(c(3L, 3L, 4L, 
2L, 4L, 3L, 1L, 2L, 2L, 1L, 3L, 2L, 3L, 2L, 3L, 3L, 4L, 2L, 2L, 
4L, 1L, 2L, 3L, 3L, 1L, 4L, 2L, 3L, 1L, 1L, 2L, 3L, 1L, 2L, 1L, 
4L, 3L, 1L, 4L, 3L, 4L, 1L, 4L, 2L, 4L, 1L, 1L, 4L, 3L, 1L), .Label = c("1", 
"2", "3", "4"), class = "factor")), class = "data.frame", row.names = c(NA, 
-50L))

使用这些数据我想绘制一个条形图ggplot2显示分组变量EDUx 轴上的累积百分比LEVEL在 y 轴上。另外,我想添加第四个栏,其中包含LEVEL but not分组依据EDU——有点像“整体吧”。此外,我想在图中添加百分比标签,以便每个LEVEL标有相应的相对频率,如下所示thread https://stackoverflow.com/questions/22231124/how-to-draw-stacked-bars-in-ggplot2-that-show-percentages-based-on-group或这个thread https://stackoverflow.com/questions/58744507/how-to-show-percentages-in-stacked-column-with-ggplot-geom-bar。老实说,我尝试使用 stackoverflow 中的不同解决方案来调整我的代码,以将百分比标签放入绘图中,因为有很多关于此主题的线程(特别是当涉及百分比标签时),但卡住了。到目前为止,我的ggplot2代码如下所示:

library(tidyverse)

ggplot(df, aes(x=EDU, fill=LEVEL)) +
  geom_bar(position="fill") +
  scale_y_continuous(labels = scales::percent)

结果如下图:

到目前为止,该情节看起来不错。但如上所述,我的目标是添加百分比标签,可能是geom_text除了现有的三个栏之外,还有第四个“整体栏”。对于百分比标签我也尝试制作prop.table并添加带有相应道具的百分比标签和annotate:

props <- prop.table(table(df$EDU, df$LEVEL), margin=1)

ggplot(df, aes(x=EDU, fill=LEVEL)) +
  geom_bar(position="fill") +
  scale_y_continuous(labels = scales::percent) +
  annotate("text", x="A", y=.15, label=scales::percent(props[1,4])) +
  annotate("text", x="B", y=.10, label=scales::percent(props[2,4])) +
  annotate("text", x="C", y=.275, label=scales::percent(props[3,4])) +
  
  annotate("text", x="A", y=.375, label=scales::percent(props[1,3])) +
  annotate("text", x="B", y=.275, label=scales::percent(props[2,3])) +
  annotate("text", x="C", y=.625, label=scales::percent(props[3,3])) +
  
  annotate("text", x="A", y=.66, label=scales::percent(props[1,2])) +
  annotate("text", x="B", y=.5, label=scales::percent(props[2,2])) +
  annotate("text", x="C", y=.78, label=scales::percent(props[3,2])) +
  
  annotate("text", x="A", y=.9, label=scales::percent(props[1,1])) +
  annotate("text", x="B", y=.9, label=scales::percent(props[2,1])) +
  annotate("text", x="C", y=.9, label=scales::percent(props[3,1])) 

That results in the following plot: Example 2

这对我来说似乎很麻烦,特别是当我想创建多个绘图并且必须单独注释每个百分比时。在这里,问题可能是我如何设置 y 参数annotate以“自动”方式让 R 为我定位标签。

不幸的是,关于“整体酒吧”问题,我不知道如何解决。

我很感激任何帮助!


请放心:您的经验越多,您就越不会害怕提前准备数据。您会发现,首先将数据准备到您想要绘制的内容,然后再进行绘制通常会更容易、更清晰。不要尝试在 ggplot2 中完成所有事情,这会变得非常痛苦。

代码中的注释

library(tidyverse)

##  create a percentage column manually
df_perc <- 
  df %>% 
  count(EDU, LEVEL) %>%
  group_by(EDU) %>%
  mutate(perc = n*100/sum(n)) 

## for the total, create a new data frame and bind to the old one
total <- 
  df_perc %>%
  group_by(LEVEL) %>%
  summarise(n = sum(n)) %>%
  ## ungroup for the total
  ungroup() %>%
  ## add EDU column called total, so you can bind it and plot it easily 
  mutate(perc= n*100/sum(n), EDU = "Total")

## now bind them and plot them
bind_rows(df_perc, total) %>%
ggplot(aes(x=EDU, y = perc, fill=LEVEL)) +
  ## use geom_col, and remove position = fill
  geom_col() +
  # now you can add the labels easily as per all those threads
  geom_text(aes(label = paste(round(perc, 2), "%")), position = position_stack(vjust = .5)) +
  ## you can either change the y values, or use a different scale factor
  scale_y_continuous("Percent", labels = function(x) scales::percent(x, scale = 1))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将整体 bar 和 perc 标签添加到 geom_bar 的相关文章

  • ODE 时间 Matlab 与 R

    如果在 matlab 中使用可变时间步长求解器 例如 ODE45 我会定义输出的时间跨度 即times 0 50 matlab 将返回 0 到 50 之间不同时间步长的结果 然而在 R 中 我似乎必须定义我希望 ODE 返回结果的时间点 即
  • 如果落在 R 中另一个数据集中的两个变量定义的范围内,则从一个数据集中获取变量值

    我有一个关于 R 中日期操作的问题 我已经查了好几天了 但在网上找不到任何帮助 我有一个数据集 其中有 id 和两个日期 另一个数据集具有相同的 id 变量 日期和价格 例如 x data frame id c A B C C date1
  • e_facet 在 echarts4r 问题中使用分组数据

    我真的很喜欢这个包提供的可能性 并且想在一个闪亮的应用程序中使用它 然而我正在努力重新创建从 ggplot 到 echarts4r 的情节 library tidyverse library echarts4r data tibble ti
  • R 子集 XTS 工作日

    如何对 xts 对象进行子集化以仅包含工作日 周一至周五 周六和周日除外 这就是我要做的 library xts data sample matrix sample xts lt as xts sample matrix descr my
  • 按新年拆分日期行

    我有来自一家医院的包含许多变量的数据 以及每行的起始日期和截止日期 这告诉我们每行何时 有效 每行的有效期最长为一年 test data frame ID c 10 10 10 12 12 Disease c P P P D P Pass
  • 是否可以创建根据输入对象名称自行命名的列表?

    能够创建 R 列表对象而无需指定每个元素的名称对我来说非常有帮助 例如 a1 lt 1 a2 lt 20 a3 lt 1 20 b lt list a1 a2 a3 inherit name TRUE gt b a1 1 1 a2 1 20
  • “x[] <- as.integer(x)”是什么意思

    当我阅读 R 手册时 我遇到了如下代码行 从 R 手册中的 colSums 复制 x lt cbind x1 3 x2 c 4 1 2 5 dimnames x 1 lt letters 1 8 x lt as integer x 有人能告
  • Pyspark - 一次聚合数据帧的所有列[重复]

    这个问题在这里已经有答案了 我想将数据框分组到单个列上 然后对所有列应用聚合函数 例如 我有一个包含 10 列的 df 我希望对第一列 1 进行分组 然后对所有剩余列 均为数字 应用聚合函数 sum 与此等效的 R 是 summarise
  • R闪亮:在渲染表格时显示“正在加载...”消息

    在 Rstudio Shiny 中 我得到了一些renderDataTable通过 RMySQL 从数据库获取信息的调用 有些查询可能需要几秒钟才能完成 我想添加一条 正在加载 消息 其中表格将在等待时最终呈现 这个问题与这个问题类似 R闪
  • 为什么我的 3D 绘图没有显示在 R Studio 绘图查看器中?

    我通常在 RStudio 版本 1 0 44 中查看绘图时没有问题 但是当我尝试查看使用 rgl 包创建的 3D 绘图时 我的 RStudio 绘图查看器中什么也没有出现 我能够毫无问题地绘制图 汽车 散点图 这是我正在使用的代码 inst
  • 使用服务器中的 Shiny Reactive 作为 UI 输入

    我正在努力使用反应函数的结果作为 UI 的输入 目前 我主要使用 renderUI 随着应用程序变得更加复杂 它会降低性能 Using DetailsList items filtered Accounts columns columns
  • ggplot:如何检索轴标签的值?

    如何提取下面的 ggplot 中用于标记 y 轴和 x 轴的数字 分别为20 30 40 and 10 15 20 25 30 35 Plot From r 统计公司 http r statistics co Top50 Ggplot2 V
  • 如何计算由离散数据定义的表面下的体积?

    我需要确定由离散数据点表示的一系列表面下方的体积 在我的数据中 每个样本都作为数据帧列表中的单独数据帧存储 这是一些 小 示例数据 df1 lt data frame x c 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 y
  • 一起使用 R6 类和 foreach() %dopar% 的问题

    当与 foreach 一起使用时 我在 R6 类上遇到问题 可能与环境有关 我使用的是 Windows 假设有两个 R6 类 class1 和 class2 class1 中的 method1 依赖于 class2 例如 请参见下面的示例代
  • R: pi[[j]] 中的错误:下标越界——数据帧列表上的 rbind

    我正在尝试重新绑定一个大的数据帧列表 outputDfList 它是通过将一个复杂的函数应用于一个大表而生成的 您可以通过以下方式重新创建outputDfList df1 data frame randomseq chr15q22 1 tr
  • R grep:有 AND 运算符吗?

    假设我有以下数据框 User Id Tags 34234 imageUploaded people jpg more comma separated stuff 34234 imageUploaded 12345 people jpg 我如
  • 使用 ggplot2 和 geom_area 堆叠负/正时间序列

    我正在尝试重现一个堆积的时间序列图 该图显示银行资产负债表的构成和规模如何随时间变化 它应该看起来像这样 资产位于 x 轴上方 负债位于 x 轴下方 到目前为止 我已经能够使用以下方法成功重现图表的每一半ggplot plot assets
  • 如何将表输出复制到剪贴板?

    我试图通过单击按钮将表输出复制到剪贴板 我尝试查看 rclipboard 包 但以我有限的理解 它似乎无法复制输出 我添加了一个actionButton屏幕截图中带有一个图标来显示我想要实现的目标 现在按钮没有任何作用 Code libra
  • 如何在R中将plot转换为ggplot?

    我是 R 新手 我正在尝试将绘图转换为 ggplot plot res s type n main title print lines res s res s output 2014 02 14 51 8460 2014 02 14 44
  • R数据表:将行值与组值进行比较,有条件

    这是问题的延伸 R数据表 将行值与组值进行比较 https stackoverflow com questions 33285050 r data table compare row value to group values 我现在有了

随机推荐

  • 在选项卡式活动中将 sqlite 数据库中的所有数据显示到列表视图中

    作为 Android 开发的新手 我已经在这个问题上被困了几个星期了 而且越来越累了 在查看了每个教程并阅读了我能找到的每个问题和答案之后 我仍然不知道如何让 Android Studio 只获取 SQLite 数据库中的内容并将其内容粘贴
  • 未找到 EGLConfig

    我正在尝试使用 android 制作简单的游戏AndEngine教程 http www raywenderlich com 12065 how to create a simple android game 现在 当我运行该项目时 我收到错
  • AngularJS 只有 ng-repeat 动画中的第一个元素

    由于某种原因 使用下面的代码 ngRepeat 仅对第一个项目进行动画处理并立即显示其余项目 一旦scope categories项目已更新 模板中触发了 ng repeat dataSource getCategories then fu
  • C++ 复制构造函数和浅复制

    假设我有一个类 其中有许多显式 静态分配 成员和一些动态分配的指针 当我声明一个复制构造函数时 我对手动分配的成员进行了深层复制 我不想显式地复制每个静态分配的成员 如何在显式复制构造函数中使用隐式 默认 复制构造函数功能 Use 遏制 c
  • 如何使用 PKAddPassButton 添加“添加到 Apple 钱包”按钮 - swift

    抱歉 如果这听起来很愚蠢 这里完全是菜鸟 我正在尝试创建 添加到Apple Wallet 按钮 但我不知道怎么办 我已经尝试过代码片段here https stackoverflow com questions 49773184 how t
  • MFMessageComposeViewController 中 MessageComposeResult 的条件与 swift [重复]

    这个问题在这里已经有答案了 我正在尝试实现 MFMessageComposeViewControllerDelegate 所需的方法 func messageComposeViewController controller MFMessag
  • AngularJS http.post() 返回 404

    祝大家圣诞快乐 我正在使用 Phonegap AngularJS 应用程序 我正在尝试创建一个 http Post 但它返回 404 错误 我尝试使用 jquery 1 10 2 进行 POST 它有效 我已经为此花费了几天时间 这是完成应
  • 试图阻止 jQuery Mobile 滑动手势冒泡,但它不起作用

    我正在使用 jQuery Mobile 并创建了一些类似于 Android Holo Tabs 的东西 http note io 18RNMRk http note io 18RNMRk 为了使滑动手势能够在选项卡之间切换 这是我添加的代码
  • 设置 MimeMessage 的内容类型?

    我对哑剧消息的内容类型有一个困惑 假设我有一条哑剧消息 这是一条多部分消息 正文部分如下 Mime 正文部分包含纯文本 html 文本 如中的一些字母 正文加粗 第二个哑剧身体部分包含附件 第三个哑剧正文部分包含一张内联图像 通过 cid
  • 使用图表构建交易平台 - 对 Python GUI 库的建议

    我正在构建一个小程序来从市场检索数据并实时绘制图表 虽然交易决策将在很大程度上自动化 但图表会不断更新 以便有人可以跟踪决策的制定方式 并在必要时进行手动干预 对于该任务 对于 Python 来说 什么是一个好的 GUI 库 以下是考虑因素
  • 在 Selenium 中使用无头 Chrome 设置用户数据目录 [重复]

    这个问题在这里已经有答案了 我试图让无头 Chrome 工作 同时使用以下命令设置用户数据目录 from selenium import webdriver options webdriver ChromeOptions options a
  • 简单的“数组中的最大值”和复杂性计算

    我对这些东西还很陌生 我需要你的帮助 我应该构建一个高效的简单算法 该算法返回大小为 n 的数组中的最大值 其中包含重复的数字 1 2 n 然后我必须确定最佳运行时间 平均运行时间和最差运行时间 所以我有两个问题 首先 我试图理解这个简单算
  • 在 Android 中设置 TextView 从另一个线程或 BeginInvoke 可见

    我正在开发一个 Android 2 2 应用程序 我在活动上有一个事件侦听器 并且我想在收到事件时设置可见的 TextView 但有一个错误 我只能将其设置为从 UI 线程可见 在 C 和 Windows Mobile 中 有一个 Begi
  • 使用 javascript 从 itemprop 读取值

    是否可以使用 javascript 读取价格 span span 178 00 span span 我只想定价 178 00 我只能使用javascript 任何建议将不胜感激 如果您有产品元素product并且您使用的是现代浏览器 这应该
  • 当我按下 return/enter 键时,h:inputText 可以调用托管 bean 内的方法吗

    所以我有一个inputText有它的价值挂钩myBean text 我希望如果我单击 Enter Return 键 inputText 将调用内部的方法myBean做某事 谁能帮我 根据您的问题历史记录 我知道您正在使用 JSF 2 0 因
  • 如何使用 Gradle Bulid Tool 解决依赖关系并编译 Junit 测试类

    我是 Gradle 新手 目前我添加了一个小型 java 项目并且执行得很好 如果我的理解是正确的 请纠正我 因为 java 可用 我们能够编译 java 项目并执行得很好 为了测试 我在 junit 的帮助下编写了一个测试类 但我无法编译
  • 将控制字符应用于字符串 - Python

    我正在尝试将控制字符 例如应删除前面的字符的 x08 x08 应用于字符串 向后移动 写入空格 向后移动 例如 当我输入 python 控制台时 s test x08 x08 print s print repr s 我进入我的终端 tes
  • 如何将 git status 限制为仅当前目录中的常规文件?

    我想查看当前目录的状态 因为子目录有很多变化 我就是这么做的not我想看看 下面的命令并不能解决问题 git status 有没有办法获得这种报告 除了 grep 的输出之外git status Use git status
  • 如何在 WSGI 处理程序中捕获“[Errno 32] 管道损坏”

    WSGI 对于构建高度并发的 HTTP 服务器以支持例如然而 长轮询通常会在某个时刻被客户端结束长时间运行的 HTTP 请求 要清理任何资源并打开句柄 应该向 WSGI 服务器后端通知任何此类事件 但是 目前似乎无法在 WSGI 处理程序中
  • 将整体 bar 和 perc 标签添加到 geom_bar

    我正在寻找以下问题的解决方案 我有包含两个因子变量的数据EDU and LEVEL 可重现的数据样本在这里 structure list EDU structure c 3L 1L 2L 2L 3L 2L 3L 2L 3L 1L 1L 1L