ggplot2中具有共享轴的两个水平条形图(类似于人口金字塔)[重复]

2024-02-13

我想在一个类似于人口金字塔的图上绘制两个变量,如下所示:

这个情节是almost那里但不完全是,原因我将在下面列出。

我用以下代码生成了这个图:

DATA <- data.frame(
    state = c("AK", "TX", "CA", "MT", "NM", "AZ", "NV", "CO", "OR", "WY", "MI", "MN", "UT", "ID", "KS", "NE", "SD", "WA", "ND", "OK"),
    sales_staff = c(20,30,40,10,15,35,18,25,22,7,12,22,3,4,5,8,14,28,24,32)
)

set.seed(1)
DATA$sales <- DATA$sales_staff * 50 + (runif(nrow(DATA)) * 1000)

# Order the state factor by number of sales staff so that it is plotted in that order
DATA$state <- factor(DATA$state, levels = DATA[order(DATA$sales_staff),"state"])

我想连续“粘合”两个图,所以我逐字使用 multiplot() 函数http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_%28ggplot2%29/ http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_%28ggplot2%29/

(为了简洁和清晰起见,我不会在此处重现该函数的代码)

我的最终情节的代码是:

library(ggplot2)

g1 <- ggplot(data = DATA, aes(x = state, y = sales_staff)) +
  geom_bar(stat = "identity") + ggtitle("Number of sales staff") +
  theme(axis.title.x = element_blank(), axis.title.y = element_blank(), axis.text.y = element_blank(), axis.ticks.y = element_blank(), plot.margin = unit(c(1,0,1,0), "mm")) +
  scale_y_reverse() + coord_flip()

g2 <- ggplot(data = DATA, aes(x = state, y = sales)) +
  geom_bar(stat = "identity") + ggtitle("Sales (x $1000)") +
  theme(axis.title.x = element_blank(), axis.title.y = element_blank(), plot.margin = unit(c(1,5,1,0), "mm")) +
  coord_flip()

multiplot(g1, g2, cols = 2)

好的。那么这个剧情有什么问题呢?

  • 我需要获取左图右轴上的刻度线。我不知道该怎么做。
  • 两个图的宽度不同。这是因为中间的状态是右侧图的轴标签,并使用该图的一些空间。

我在让这个情节达到“制作质量”方面遇到了困难。我开始怀疑我是否以错误的方式处理这个问题,因为我认为下一步将是将轴标签绘制为两个图之间的单独的第三列。 (我还不知道该怎么做)。这将解决“同等大小”问题并允许我添加“州”标题,因此它可能仍然是可行的方法。但我就是忍不住想知道是否有更简单的方法......

任何建议或帮助表示赞赏!


这是您的情节的很长的解决方法。想法是创建仅包含两侧的州名称和刻度的新图,然后将其用作中间图。

对于这个图,我添加了没有名称的标题来获得空间和ylab(NULL)删除空间。左右边距值为 -1 以使图更接近其他图。图书馆grid应在绘制使用函数之前添加unit()用于绘图边距。

library(grid)
g.mid<-ggplot(DATA,aes(x=1,y=state))+geom_text(aes(label=state))+
  geom_segment(aes(x=0.94,xend=0.96,yend=state))+
  geom_segment(aes(x=1.04,xend=1.065,yend=state))+
  ggtitle("")+
  ylab(NULL)+
  scale_x_continuous(expand=c(0,0),limits=c(0.94,1.065))+
  theme(axis.title=element_blank(),
        panel.grid=element_blank(),
        axis.text.y=element_blank(),
        axis.ticks.y=element_blank(),
        panel.background=element_blank(),
        axis.text.x=element_text(color=NA),
        axis.ticks.x=element_line(color=NA),
        plot.margin = unit(c(1,-1,1,-1), "mm"))

两个原始图都被修改。首先,删除第二个图的 y 轴,并将左/右边距设置为 -1。

g1 <- ggplot(data = DATA, aes(x = state, y = sales_staff)) +
  geom_bar(stat = "identity") + ggtitle("Number of sales staff") +
  theme(axis.title.x = element_blank(), 
        axis.title.y = element_blank(), 
        axis.text.y = element_blank(), 
        axis.ticks.y = element_blank(), 
        plot.margin = unit(c(1,-1,1,0), "mm")) +
  scale_y_reverse() + coord_flip()

g2 <- ggplot(data = DATA, aes(x = state, y = sales)) +xlab(NULL)+
  geom_bar(stat = "identity") + ggtitle("Sales (x $1000)") +
  theme(axis.title.x = element_blank(), axis.title.y = element_blank(), 
        axis.text.y = element_blank(), axis.ticks.y = element_blank(),
        plot.margin = unit(c(1,0,1,-1), "mm")) +
  coord_flip()

现在使用库gridExtra和函数dgrid.arrange()加入情节。在绘制之前,所有绘图都被制作为 grobs。

library(gridExtra)
gg1 <- ggplot_gtable(ggplot_build(g1))
gg2 <- ggplot_gtable(ggplot_build(g2))
gg.mid <- ggplot_gtable(ggplot_build(g.mid))

grid.arrange(gg1,gg.mid,gg2,ncol=3,widths=c(4/9,1/9,4/9))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ggplot2中具有共享轴的两个水平条形图(类似于人口金字塔)[重复] 的相关文章

  • 限制数据框中所有单元格的字符串长度?

    您好 有没有一种方法可以限制 data frame 中所有列的字符串文本大小 而不必循环遍历每一列并一次使用 str trunc 之类的东西 例如下面的数据框 我可以将所有文本大小限制为仅 5 个字符 而不必一次只执行一列吗 如果有 50
  • 错误:“rjags”的包或命名空间加载失败

    在终端的 conda 环境之一中 我能够成功安装包 rjags 但是 当我在该环境中运行 R 并运行库 rjags 时 出现以下错误 加载所需的包 coda 错误 rjags 的包或命名空间加载失败 rjags 的 loadNamespac
  • R.matlab/readMat:readTag(this) 中出错

    我正在尝试使用 R matlab 将 matlab 文件读入 R 但遇到此错误 require R matlab r lt readMat file mat verbose T Trying to read MAT v5 file stre
  • 如何将此“for”循环转换为向量解

    这个问题与 将嵌入其他文本的长州名称转换为两个字母的州缩写 https stackoverflow com questions 25582518 convert long state names embedded with other te
  • glmnet 未从 cv.glmnet 收敛 lambda.min

    我跑了20倍cv glmnet套索模型以获得 lambda 的 最佳 值 但是 当我尝试重现结果时glmnet 我收到一个错误 内容如下 Warning messages 1 from glmnet Fortran code error c
  • 使用outer代替expand.grid

    我正在寻找尽可能快的速度并留在基地做该做的事expand grid做 我用过outer为过去类似的目的创建一个向量 像这样的东西 v lt outer letters LETTERS paste0 unlist v lower tri v
  • 表单提交时出现 rvest 错误

    我想从以下网页中抓取数据 https swgoh gg u zozo collection 180 emperor palpatine https swgoh gg u zozo collection 180 emperor palpati
  • ggplot散点图中的图例问题

    我想使用 ggplot 创建显示方法比较数据的散点图 绘图应包含原始数据 理想线和带误差的拟合线 图例应显示理想线和拟合线的线型 线宽 线颜色 我可以获得大部分我想要的东西 但是图例存在以下问题 图例显示每种线型有 2 条线 为什么 如何解
  • 使用 dplyr::filter 的整洁方式是什么?

    使用下面的函数调用foo c b 输出以内联方式显示 正确的写作方式是什么df gt filter x gt x 我已经包含了一个使用的示例mutate以整洁的风格与之对比filter foo lt function variables x
  • 替换字符串/文本中“从第 n 次到最后一次”出现的单词

    这个问题以前曾被问过 但尚未得到令提问者满意的答案 https stackoverflow com questions 36368712 how to use stringrs replace all function to replace
  • 如何将 ggrough 图表另存为 .png

    说我正在使用R包裹ggrough https xvrdm github io ggrough https xvrdm github io ggrough 我有这个代码 取自该网页 library ggplot2 library ggroug
  • 单击 R 中的 Sankey Chart 线时添加额外的标签值

    以下 R 闪亮脚本创建一个桑基图 如下面的快照所示 我的要求是 当我单击左右节点之间的任何链接 即 a1 和 a2 时 我希望相应的 a3 的总和出现在标签中 例如 a1 中的 A 和 a2 中的 E 总共具有值 50 和 32 因此 我想
  • 非闪亮上下文中的反应式对象绑定

    实际问题 你怎样才能近似反应性环境 行为 http shiny rstudio com tutorial lesson6 建立者shiny http shiny rstudio com函数 或者甚至可能在一个函数中使用这些函数无光泽上下文以
  • 从数据框创建稀疏矩阵

    我正在做一项作业 尝试为 Netflix 奖项数据构建协作过滤模型 我使用的数据位于 CSV 文件中 我可以轻松地将其导入到数据框中 现在我需要做的是创建一个稀疏矩阵 其中用户作为行 电影作为列 每个单元格都由相应的评级值填充 当我尝试绘制
  • 如何从R arrow中的feather文件中读取列名和元数据?

    现已取代 独立R 的羽毛库 https github com wesm feather有一个函数叫做feather metadata 允许从磁盘上的羽毛文件中读取列名称和类型 而无需打开它们 当在 R 中加载羽毛文件时 这对于仅选择特定列很
  • 如何动态访问数据帧列表中的特定属性

    我有一个数据 它是数据框的列表 我正在尝试访问列表中每个数据帧内的特定属性 可以提取特定属性DP UniqueId使用下面的代码 gt attr new data A AA SpotfireColumnMetaData DP UniqueI
  • 迭代字符串 R 的字符

    有人可以解释一下为什么这不会在 R 中单独打印所有数字 numberstring lt 0123456789 for number in numberstring print number 字符串不就是字符数组吗 在 R 中该怎么做 In
  • 根据R中的前一行和当前行按组计算

    我可以根据 R 中的前一行和当前行进行计算 对于此数据框 df A B 1 2 2 2 2 3 3 4 5 5 B2 A2 0 5 B1 我可以使用这段代码来计算这个函数 for i in 2 nrow df B i lt 1 2 B i
  • R 包与 Rcpp 的链接错误:“未定义符号:LAPACKE_dgels”

    我正在创建一个 R 包 lapacker 以使用 R API 头文件 R ext Lapack h 为 R 提供和使用的内部 LAPACK 库 仅具有双精度和双复数 提供 C 接口 源代码 https github com ypan1988
  • 如何一次导入多个 .csv 文件?

    假设我们有一个包含多个 data csv 文件的文件夹 每个文件包含相同数量的变量 但每个文件来自不同的时间 R 中有没有办法同时导入它们 而不必单独导入它们 我的问题是 我有大约 2000 个数据文件需要导入 并且必须使用以下代码单独导入

随机推荐

  • 如何从 C++ 打开 URL?

    如何从我的 C 程序中打开 URL 在红宝石中你可以做 x open https google com C 中的等价物是什么 我想知道是否有一个独立于平台的解决方案 但如果没有 我更喜欢 Unix Mac 这是我的代码 include
  • ReadToEnd 之后关闭 StreamReader

    在构造中调用 ReadToEnd 方法后是否可以以某种方式关闭 StreamReader 如下所示 string s new StreamReader filename Encoding UTF8 ReadToEnd 任何具有相同语义的替代
  • Visual Studio 2010/2012 Git 插件

    我正在寻找 git 与 VS 2010 2012 集成的建议 允许开发人员使用基本操作 提交 推送 拉取 切换分支 标记 有几个 Git 源代码控制提供程序 http visualstudiogallery msdn microsoft c
  • 在多层应用程序中,是否应该允许客户端将自己的 linq 表达式发送到服务器?

    理由 HQL 和 NH 标准是 NHibernate 特定的构造 因此它们是服务器端 DAL 实现细节 我不希望它们 泄漏 到客户端 因此 我们的客户端提供LINQ表达式供服务器处理 对我来说似乎合理 但是有些人不这么认为 所以我想知道为什
  • 简单 XML 框架反序列化的异常

    我在反序列化已成功序列化的 XML 文件时遇到问题简单的 XML 序列化 http simple sourceforge net 框架 simpleframework org 有一个例外 http simple sourceforge ne
  • Firefox 扩展在 main.js 文件中包含脚本

    我正在为 Firefox 编写扩展 但在将脚本包含到 main js 后台 文件中时遇到问题 就我而言 我想包括 jquery js 和 config js 但我不知道如何正确执行它 在我的 chrome 扩展中 我只是在清单文件上执行此操
  • Kafka Streams代理连接超时设置

    我们正在使用 kafka streams 2 3 1 我刚刚注意到 如果代理关闭 流应用程序似乎会满足于尝试永远尝试连接 new KafkaStreams createTopology properties start o apache k
  • 如何修复“W293 空白行包含空格”

    我的 python 代码产生以下警告消息 1 dir file py 8 1 W293 blank lines contains whitespace this comes after commands 0 flake8 XXX 你如何解决
  • 矢量瓦片路线查找

    有人使用 Mapbox 或 OpenMapTiles 矢量切片来查找从一个地方到另一个地方的路线吗 在我看来 这些图块是为了显示而制作的 并不像开放街道地图那样包含交叉路口信息 地图盒有路线API https www mapbox com
  • 如何清除 Angular JS 的文件输入

    在 AngularJS 中 我使用此处描述的方法来处理输入 type file https groups google com forum fromgroups topic angular OpgmLjFR U https groups g
  • 用 * 屏蔽掉字符串的前 12 个字符?

    我怎样才能取值123456789012345 or 1234567890123456并将其变成 2345 and 3456 上面两个字符串的区别在于 一个包含 15 位数字 另一个包含 16 位数字 我已经尝试过以下操作 但它不会保留 15
  • HttpServletRequest UTF-8 编码 [重复]

    这个问题在这里已经有答案了 我想从请求中获取参数 带重音符号的字符 但它不起作用 我尝试使用request setCharacterEncoding UTF 8 但它也不起作用 我知道URLDecoder decode request ge
  • 如果未找到,Regexp.match.length 返回 NULL

    我有一个 JS 正则表达式 var t1 str match h1 g length If str包含这个词 h1 它工作正常 否则显示错误 如何解决问题 var t1 str match h1 g length
  • 如何在asp.net mvc项目中使用Material-UI

    有没有一种方法可以使用 Material UI 而无需使用 NodeJS 安装所有依赖项 我很想在 ASP NET 项目中使用它 但不知道从哪里开始安装依赖项以及所有这些 从技术上讲 在没有任何前端基础设施的情况下使用 Material U
  • 模拟基于范围的 for 循环的开始/结束行为

    考虑基于范围的 for 循环的规范开始表达式 and end expr N4140 stmt ranged p1 给定一个范围 range类型的 RangeT 开始表达式 and end expr确定如下 if RangeT是一个数组类型
  • 为 ios 构建 ionic 项目时出现 Cannot find 错误

    我在尝试为 ios 构建 ionic 项目时遇到了这个错误 它发生在 FirebaseCore 构建过程的一部分 我发现问题是以下文件第 23 行的错误 平台 ios Pods FirebaseCore Firebase Core FIRN
  • 如何为 Cygwin 安装 Git?

    我在网上看到了一些教程 但它们只展示了如何将 git 安装到 Cygwin 上 因为您正在安装 Cygwin 我已经安装并定制了 cygwin 因此我不想重复该步骤 如何安装 git 框架以便将其用于 github 谢谢 在Cygwin的世
  • 重写第三方模块中的方法有多糟糕?

    在 Python 中从另一个第三方模块重新定义类方法有多糟糕 事实上 用户可以创建包含以下内容的 NumPy 矩阵 具有不确定性的数字 http pypi python org pypi uncertainties 理想情况下 我希望他们的
  • 从捕获或照片库获取图片后 Cordova 应用程序重新启动

    我正在尝试在 android 的 cordova 项目上使用 jquery mobile 和 php 在我的服务器上添加图片 当我从库中选择图片或进行捕获时 应用程序会重新启动 而不是用图片刷新我的表单 这是我的 html 代码
  • ggplot2中具有共享轴的两个水平条形图(类似于人口金字塔)[重复]

    这个问题在这里已经有答案了 我想在一个类似于人口金字塔的图上绘制两个变量 如下所示 这个情节是almost那里但不完全是 原因我将在下面列出 我用以下代码生成了这个图 DATA lt data frame state c AK TX CA