关于如何使用R和ggplot2绘制背对背图的问题

2024-03-08

我的目标是绘制一个金字塔图,如所附的那样。

我找到了几个使用 ggplot 的示例,但我仍然在努力将我的示例应用于我的数据(或我想要绘制的数据)。

structure(list(serial = c(40051004, 16160610, 16090310), DMSex = structure(c(2, 
2, 2), label = "Gender from household grid", labels = c(`No answer/refused` = -9, 
`Don't know` = -8, `Interview not achieved` = -7, `Schedule not applicable` = -2, 
`Item not applicable` = -1, Male = 1, Female = 2), class = "haven_labelled"), 
    dtotac = structure(c(-9, -9, -8), label = "DV: Total actual hours in all jobs and businesses", labels = c(`No answer/refused` = -9, 
    `Don't know` = -8, `Interview not achieved` = -7, `Item not applicable` = -1
    ), class = "haven_labelled")), row.names = c(NA, -3L), class = c("tbl_df", 
"tbl", "data.frame"))

如何转换数据并绘制背靠背图?或者如何在不进行子集化的情况下定义 Gender 和 dtotac 变量?

我正在使用的代码

library(ggplot2)
library(plyr)
library(gridExtra)

SerialGenderWorkN <- data.frame(Type = sample(c('Male', 'Female', 'Female'), 
                                              11421, replace=TRUE),
                                dtotac = sample (0:60, 11421, replace=TRUE))

WrkFactor <- ordered(cut(SerialGenderWork$dtotac, 
                         breaks = c(0, seq(20, 60, 10)), 
                         include.lowest = TRUE))

SerialGenderWorkN$dtotac <- WrkFactor 

ggplotWrk <- ggplot(data =SerialGenderWorkN, aes(x=dtotac))

ggplotWrk.female <- ggplotWrk + 
  geom_bar(data=subset(SerialGenderWorkN, Type == 'Female'), 
           aes( y = ..count../sum(..count..), fill = dtotac)) +
  scale_y_continuous('', labels = scales::percent) +
  theme(legend.position = 'none', 
        axis.title.y = element_blank(),
        plot.title = element_text(size = 11.5),
        plot.margin=unit(c(0.1,0.2,0.1,-.1),"cm"), 
        axis.ticks.y = element_blank(), 
        axis.text.y = theme_bw()$axis.text.y) + 
  ggtitle("Female") + 
  theme(plot.title = element_text(hjust = 0.5)) + 
  coord_flip()

ggplotWrk.male <- ggplotWrk + 
  geom_bar(data=subset(SerialGenderWorkN,Type == 'Male'), 
           aes( y = ..count../sum(..count..), fill = dtotac)) +
  scale_y_continuous('', labels = scales::percent, 
                     trans = 'reverse') + 
  theme(legend.position = 'none',
        axis.text.y = element_blank(),
        axis.ticks.y = element_blank(), 
        plot.title = element_text(size = 11.5),
        plot.margin=unit(c(0.1,0.2,0.1,-.1),"cm")) + 
  ggtitle("Male") + 
  theme(plot.title = element_text(hjust = 0.5)) + 
  coord_flip() + 
  xlab("Work Hours")

## Plutting it together
grid.arrange(ggplotWrk.male, ggplotWrk.female,
             widths=c(0.4, 0.4), ncol=2)

这是输出

如何移动“工作时间”以在“男性”和“女性”图之间显示?


我觉得这个问题很有趣,而且我认为没有完美的解决方案。就我个人而言,我希望一切看起来整洁且对齐,所以gridExtra::grid.arrange's top (or bottom对于轴标签)参数并不真正令我满意。

另一个解决方案是使用构面并使用包编辑绘图gtable and grid。这也不完美,因为我没有找到单独调整面的比例的解决方案。唯一的选择是通过添加来释放秤scales = "free_x"到侧面。如果双方的最大百分比彼此接近,则效果非常好。如果不是,也许不是这样。

首先,我编写了一个用于删除 grob 中的列的函数。我们将使用它将轴标签移动到中心。

library(tidyverse)
library(grid)
library(gtable)

delete_col <- function(x, pattern) {
  t <- x$layout %>% 
    filter(str_detect(name, pattern)) %>% 
    pull(l)

  x <- gtable_filter(x, pattern, invert = TRUE)

  x$widths[t] <- unit(0, "cm")

  x
}

然后我们将创建数据和基础图。需要两个主题选项来将轴文本设置在面的中间。

test_data <- rnorm(500, 50, 15) %>% 
  crossing(sex = c("M", "F")) %>% 
  transmute(sex, value = cut(., c(min(.), 20, 40, 60, max(.)), include.lowest = TRUE))

test_data <- test_data %>% 
  count(sex, value) %>% 
  group_by(sex) %>% 
  mutate(p = n/sum(n)) %>% 
  ungroup() %>% 
  mutate(p = if_else(sex == "F", -p, p)) # negative values for the left-hand side.

p1 <- test_data %>% 
  ggplot(aes(value, p)) + 
  facet_wrap(~ sex, scales = "free_x") + 
  geom_col() +
  coord_flip() +
  theme(axis.text.y = element_text(hjust = 0.5, margin = margin(0, 0, 0, 0)),
        axis.ticks.length = unit(0, "pt")) +
  scale_y_continuous(labels = function(x) paste0(abs(x) * 100, "%")) +
  labs(x = NULL)

现在它变得有点复杂了。首先,我们将从 ggplot 对象创建一个 grob 对象。

p1_g <- ggplotGrob(p1)

然后,我们将通过轴文本占用的现有空间并添加一些空白来扩大面之间的空间。我查看了 grob 对象,通过使用查看哪些列是哪些gtable_show_layout(p1_g).

p1_g$widths[7] <- p1_g$widths[4] + unit(0.5, "cm")

接下来,我们将把轴文本分离到它自己的对象以供以后使用。

p1g_axis <- gtable_filter(p1_g, "axis-l-1-1") 

最后我们将把它们加在一起。我现在通过查看布局知道将所有东西放在哪里。l是左侧范围并且t是针对最高范围的。

p1_g %>% 
  gtable_add_grob(p1g_axis, l = 7, t = 8, name = "middle_axis") %>% # add the axis to the middle
  delete_col("axis-l-1-1") %>% # delete the original axis
  gtable_add_grob(textGrob("Label", gp = gpar(fontsize = 11)), l = 7, t = 7) %>% # add the top label
  grid.draw() # draw the result
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于如何使用R和ggplot2绘制背对背图的问题 的相关文章

  • 如何返回包含最大值标签的向量

    我有一个 4 列数组 我想获得一个向量 其中每行包含包含该行最大值的列的标签 我可以在循环中执行此操作 但我想使用矩阵函数来提高速度 我怎样才能在不编写自己的库函数的情况下做到这一点 有一个函数可以做到这一点 如果x是你的矩阵 尝试max
  • 如何在 R 中绘制一列与其余列的关系图

    我有一个数据集 其中 1 是时间 接下来的 14 个是幅度 我想在一张图表上散布所有大小与时间的关系 其中每个不同的列都是网格化的 分层在另一个之上 我想使用原始数据来制作这些图表 并单独制作它们 但只想执行此过程一次 数据集A 唯一的自变
  • 在 igraph 中为社区分配颜色

    我在 igraph 中使用 fastgreedy community 检测算法在 R 中生成社区 代码返回 12 个社区 但是在绘图时很难识别它们 因为它返回的图的颜色数量有限 我怎样才能用十二种不同的颜色绘制这个图表 l2 lt layo
  • 手动设置scale_fill_distiller()的比例

    我正在尝试制作一系列图表进行比较 举例来说 我想使用iris数据集来制作这样的图 其中我已过滤以仅查看 setosa 物种 library ggplot2 library dplyr iris gt filter Species setos
  • 排序因素与水平

    有人能解释一下 R 中 ordered 参数的用途吗 R says ordered逻辑标志来确定级别是否应被视为有序 按给定的顺序 所以如果我有一个名为名称的因素并设置ordered TRUE names lt factor c fred
  • Pandas 堆积条形图中元素的排序

    我正在尝试绘制有关某个地区 5 个地区的家庭在特定行业赚取的收入比例的信息 我使用 groupby 按地区对数据框中的信息进行排序 df df orig groupby District Portion of income value co
  • RStudio 如何确定控制台宽度,为什么它似乎总是出错?

    我刚刚发现wid lt options width在 RStudio 中 它似乎是我日常控制台使用中令人烦恼的根源 或者更确切地说 更接近根源 我应该先说一下 我目前使用的是 R 3 2 2 RStudio 0 99 491 Linux M
  • R- 将某些列从 0 标准化为 1,其值等于 0

    我最近开始使用 are 我想扩展我的数据矩阵 我在这里找到了一种方法在两点之间缩放系列 https stackoverflow com questions 5468280 scale a series between two points
  • 对 data.table 中的列表列执行操作

    假设我有一个data table 例如dt lt data table foo list 1 3 4 6 bar c 2 7 如何使用 dt 框架对 foo 向量列表执行操作 操作可能是将 bar 添加到 foo 返回列表 3 5 11 1
  • 如何使用 R 将每个文件的数据添加为附加行,从而将不同的 .csv 文件合并为一个完整的文件?

    我有几个不同的文件夹 它们都包含一个 csv 文件 所有这些 csv 文件都有一个单独的列 其中包含实验的一种条件的数据 我想以将每个文件的数据添加为新列的方式合并这些 csv 文件 目前 它看起来像这样 C1 csv 102 106 15
  • 融化R中的下半矩阵

    如何融化下半三角形加对角矩阵 11 NA NA NA NA 12 22 NA NA NA 13 23 33 NA NA 14 24 34 44 NA 15 25 35 45 55 A lt t matrix c 11 NA NA NA NA
  • 如何在knitr和RStudio中为word和html设置不同的全局选项?

    我正在使用 RStudio 0 98 932 和 knitr 1 6 想要为word和html设置不同的全局knitr选项 例如 想要将word的fig width和fig height设置为6 html的fig width和fig hei
  • 一段 R 代码会影响 foreach 输出中的随机数吗?

    我使用运行模拟foreach and doParallel并与随机数 名为random在代码中 简而言之 我模拟一个足球联赛 随机生成所有比赛的获胜者以及相应的结果 在dt base没有比赛进行 在dt ex1 and dt ex24场比赛
  • 无法更新/编辑从 R 中的包(`gratia`)导出的 ggplot2 对象

    我希望我在这里遗漏了一些令人痛苦的明显的东西 我希望更新 例如 修复标题 实验室等 由 生成的 ggplot 对象gratia draw 不太确定为什么我无法更新该对象 有一个简单的解决方案吗 devtools install github
  • 如何对数字进行四舍五入并使其显示零?

    R 中将数字四舍五入到小数点后 2 位的常用代码是 gt a 14 1234 gt round a digits 2 gt a gt 14 12 但是 如果该数字的前两位小数位为零 则 R 会在显示中抑制零 gt a 14 0034 gt
  • 使用 R 下载压缩数据文件、提取和导入数据

    EZGraphs 在 Twitter 上写道 很多在线 csv 都被压缩了 有没有办法下载 解压缩存档并使用 R 将数据加载到 data frame Rstats 我今天也尝试这样做 但最终只是手动下载 zip 文件 我尝试过类似的东西 f
  • 尝试使用 JRI 将 R 与我的 Java 应用程序集成,但出现错误。谁能解释一下原因和解决办法吗?

    我需要将 Java 与 R 集成来运行一些数学命令并使用 R 的功能进行绘图 以下部分代码给出了错误 public static void main String args HelloRWorld r new HelloRWorld r h
  • R - 计算 bin 中特定值的数量

    我有一个如下所示的数据框 df Value lt c 1 1 0 2 1 3 4 0 0 1 2 0 3 0 4 5 2 3 0 6 Sl lt c 1 20 df lt data frame Sl Value gt df Sl Value
  • 列出 R 数据文件的内容而不加载

    我有时用print load myDataFile RData 当我加载数据文件时列出它的内容 有没有办法列出内容而不加载数据文件中包含的对象 我认为如果不加载对象就无法做到这一点 解决方案可能是使用包装器将 R 对象保存到save 该函数
  • picker输入字体或背景颜色

    我在闪亮的仪表板中使用 pickerInput 这很好 除了一个问题 背景颜色和字体颜色太相似 使得过滤器选择难以阅读 有什么办法可以改变背景或字体颜色吗 如果可能的话 我想继续使用 pickerInput 但如果有一个带有 selectI

随机推荐

  • C++ d3d hooking - COM vtable

    尝试制作一个 Fraps 类型的程序 请参阅评论以了解失败的地方 include precompiled h typedef IDirect3D9 STDMETHODCALLTYPE Direct3DCreate9 t UINT SDKVe
  • 尝试访问包含模块中定义的方法时出现 NoMethodError

    我正在尝试从我的一个规范助手中的模块访问方法 我将该模块包含在测试助手中 module Support class RestHelper include Rest Rest def create rest client for ifa Ca
  • 使用 multer 上传文件时 Node.js 连接重置

    我有一个节点 express 应用程序 可以使用 multer 处理文件上传 在我的本地计算机上一切正常 但在服务器上 如果上传的文件超过几兆字节 浏览器将停止并出现 连接重置 错误 这是上传脚本的简单测试版本 var express re
  • 将类组织到 App_Code 文件夹中的命名空间中无法按预期工作

    我为我的 Web 项目创建了几个类 并将它们存储在 App Code 文件夹中 我不想将所有类存储在顶层 无命名空间 但想将它们组织到命名空间中 到目前为止 这似乎不可能 因为当我使用 using XXXX 时命名空间声明它仍然无法在我的代
  • 将 UTC 日期转换为日期时间字符串 Javascript

    我有一个 UTC 日期字符串 2011 10 30T18 30 00Z 我想将其转换为 2011 10 30 18 30 谁能给我一些建议如何做到这一点 我将感谢您的时间和考虑 Thanks 最简单的解决方案是尝试以下方法 var date
  • 如何将接口作为参数传递给方法?

    我是 C 的新手 您能告诉我如何将接口作为参数传递给方法吗 即我想访问接口成员 属性 并向其分配值并将该接口作为参数发送给另一个方法 举例来说 如果我有一个界面IApple其成员作为财产int i and int j我想将值分配给i and
  • JQuery:复选框如何在选择另一个复选框时选中或取消选中所有复选框[重复]

    这个问题在这里已经有答案了 当我选择 取消选择 全选 复选框时 我希望选中或取消选中所有其他复选框 没有子元素或父元素 网页代码 div li class input li div
  • 地图 v2 标记动画 - 淡入和淡出

    如何淡入淡出谷歌地图 http developer android com reference com google android gms maps GoogleMap html marker http developer android
  • 如何在R中按分组列求和?

    这是我的输入 一个包含 n 列的数据框 以及一个将每个 id 分配给一个组的辅助数据框 df lt data frame a1 c 1 2 3 a2 c 2 3 4 b1 c 4 5 6 b2 c 5 6 7 aux lt data fra
  • iOS 4:FigCreateCGImageFromJPEG 返回 -1

    我试图在我的应用程序中运行基本的图像选择器 照片拍摄器 但遇到了以下错误 ERROR FigCreateCGImageFromJPEG returned 1 Input null was 551120 bytes 我显示了图像选择器 相机视
  • 我们如何在 CQ5 中定义全局属性

    我的要求是拥有一个具有可创作属性的全局页眉和页脚 因此 如果我们更新一页上的属性 它应该会反映在所有页面上 在 CQ5 中实现这一目标的最佳方法是什么 ACS AEM Commons 现在支持此功能 无需使用 iparsys 共享组件属性
  • 在没有可用干净版本的情况下清理被黑网站的最佳方法?

    我被要求fix在生产服务器上使用 osCommerce 构建的被黑网站 该站点始终存在于远程主机上 没有离线的clean版本 让我们暂时忘记这有多么愚蠢 并处理它的本质 它已被黑客攻击多次 并且另一个人fixed通过删除 Web shell
  • 无法使用 localhost 连接手机上运行的 Android 应用程序

    我正在使用 GCM 制作 Android 应用程序 我正在尝试通过在手机上运行的应用程序进行注册 输入无法使用 php 存储在本地主机 XAMPP 上 我的手机和笔记本电脑在同一网络上运行 localhost 的 IP 地址有问题 我使用这
  • 当返回类型为标记接口时使用 Jackson 进行多态序列化

    我有一个返回标记接口的休息服务 并且该接口有多个实现 并且在实现中没有任何公共属性 RequestMapping value users userName method RequestMethod GET public User getUs
  • 为什么初始化器列表中的自初始化引用不是错误?

    我遇到了一个奇怪的问题 如果我尝试编译自赋值对象引用 我的编译器 针对 ESP32 不会显示任何错误或警告 我调查了这个问题 发现某些编译器不会显示此代码的任何错误或警告 include
  • 有没有办法反序列化 Elasticsearch Nest 搜索查询?

    使用 Nest 构建 Elasticsearch 查询后 我希望能够查看发送到 Elasticsearch 的 JSON 版本 这可能吗 我想是某种解串器 这是我的后续问题的信息 infer defaultIndex myindex ack
  • 为什么 Android 对 ConstraintLayout 使用单独的 xmlns

    我对 Android 中的 ConstraintLayout 有点困惑 我正在学习它 首先我感到困惑的是为什么 android 使用单独的 xml 命名空间呢 xmlns app http schemas android com apk r
  • 使用 IIS 和 ACL 的 WCF 授权

    我正在尝试保护一些 WCF 服务 如果可能的话 我想使用 IIS 或 Web config 来完成所有繁重的工作 配置 我不想在我的代码中嵌入任何东西 我想我知道这可能不可行 如果可能的话 我想实现这一点而不必求助于 AspCompatib
  • 不透明度低于 childs 的容器

    我想制作我的网页background color with opacity 0 5但网页内的内容会有一个opacity 1 作为默认值 问题是如果我设置opacity 0 5对于容器 该容器内的所有子级都相同opacity value 我搜
  • 关于如何使用R和ggplot2绘制背对背图的问题

    我的目标是绘制一个金字塔图 如所附的那样 我找到了几个使用 ggplot 的示例 但我仍然在努力将我的示例应用于我的数据 或我想要绘制的数据 structure list serial c 40051004 16160610 1609031