geom_bar(position = "dodge") 中的条形宽度相同

2023-11-21

我想绘制具有相同宽度的条形图。这是我的最小示例代码:

data <- data.frame(A = letters[1:17],
                   B = sample(1:500, 17),
                   C = c(rep(1, 5), rep(2, 6), rep(c(3,4,5), each = 2)))

ggplot(data,
       aes(x = C,  y = B, label = A,
           fill = A)) +
  geom_bar(stat = "identity", position = "dodge") +
  geom_text(position = position_dodge(width = 0.9), angle = 90)

The result is shown in the picture above: enter image description here

条形的宽度取决于变量中给出的组中的观察数量C。我想让每个条形都具有相同的宽度。

The facet_grid(~C)有效(条形宽度相同),这不是我的意思:

ggplot(data,
       aes(x = C,  y = B, label = A,
           fill = A)) +
  geom_bar(stat = "identity", position = "dodge") +
  geom_text(position = position_dodge(width = 0.9), angle = 90) +
  facet_grid(~C)

enter image description here

我想要的是像第一张图片中那样的图,但条形的宽度独立于列中每个级别的观察数量C。我该怎么做?

[EDIT] geom_bar(width)更改了条形组的宽度,但第五组中的条形仍然比第一组中的宽,所以这不是我问题的答案。


Update

Since ggplot2_3.0.0您现在可以使用的版本position_dodge2 with preserve = c("total", "single")

ggplot(data,aes(x = C,  y = B, label = A, fill = A)) +
  geom_col(position = position_dodge2(width = 0.9, preserve = "single")) +
  geom_text(position = position_dodge2(width = 0.9, preserve = "single"), angle = 90, vjust=0.25)

enter image description here

原答案

正如已经评论过的,你可以这样做answer: 转换A and C因素并使用添加看不见的变量tidyr's complete。自近期以来ggplot2推荐使用的版本geom_col代替geom_bar在以下情况下stat = "identity":

data %>% 
  as.tibble() %>% 
  mutate_at(c("A", "C"), as.factor) %>% 
  complete(A,C) %>% 
  ggplot(aes(x = C,  y = B, fill = A)) +
  geom_col(position = "dodge")

enter image description here

或者使用交互项:

data %>% 
  ggplot(aes(x = interaction(C, A),  y = B, fill = A)) +
  geom_col(position = "dodge")

enter image description here

最后,通过将交互转换为数字,您可以根据所需的输出设置 x 轴。通过分组(group_by)您可以计算匹配的中断。花哨的东西与{}需要在 ggplot 参数周围直接使用变量Breaks and C管道内。

data %>% 
  mutate(gr=as.numeric(interaction(C, A))) %>% 
  group_by(C) %>% 
  mutate(Breaks=mean(gr)) %>% 
  {ggplot(data=.,aes(x = gr,  y = B, fill = A, label = A)) +
   geom_col(position = "dodge") +
   geom_text(position = position_dodge(width = 0.9), angle = 90 ) +
   scale_x_continuous(breaks = unique(.$Breaks),
                     labels = unique(.$C))}

enter image description here

Edit:

另一种方法是使用方面。使用space = "free_x"允许将宽度设置为与 x 刻度的长度成比例。

library(tidyverse)
data %>% 
  ggplot(aes(x = A,  y = B, fill = A))  +  
   geom_col(position = "dodge") +
   facet_grid(~C, scales = "free_x", space = "free_x")

enter image description here

您还可以使用以下方法在底部绘制面标签switch并删除 x 轴标签

data %>% 
  ggplot(aes(x = A,  y = B, fill = A))  +  
  geom_col(position = "dodge") +
  facet_grid(~C, scales = "free_x", space = "free_x", switch = "x") + 
  theme(axis.text.x = element_blank(),
        axis.ticks.x = element_blank(),
        strip.background = element_blank())

enter image description here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

geom_bar(position = "dodge") 中的条形宽度相同 的相关文章

随机推荐

  • 使用 DirectoryIterator 对文件进行排序

    我正在创建一个目录 列出 lighttpd 的 PHP5 脚本 在给定的目录中 我希望能够列出直接子目录和文件 带有信息 快速搜索后 目录迭代器似乎是我的朋友 foreach new DirectoryIterator as file ec
  • 移动网站设计

    我刚刚使用样式表 即 media print 等 向网站添加了打印功能 并且想知道是否可以使用类似的方法来添加对移动设备的支持 如果没有 我如何检测移动设备 我的页面是 C aspx 我想缩小页面以便于在移动设备上使用 对我有什么建议吗 编
  • 如何在静态类中使用IHttpContextAccessor设置cookie

    我正在尝试创建一个通用的addReplaceCookie静态类中的方法 该方法看起来像这样 public static void addReplaceCookie string cookieName string cookieValue i
  • 如何在Python中解析带有'+'的标签

    当我尝试编译此内容时 出现 无重复 错误 search re compile r a zA Z0 9 s a zA Z0 9 test re I 问题是 号 我该怎么处理 re compile r a zA Z0 9 s a zA Z0 9
  • AVPlayer 不会在 iOS9 中播放来自 url 的视频

    我试图在 UIView 中嵌入 AVPlayer 并从 url 播放 mp4 视频文件 问题是我只收到黑色空白视图 参见屏幕截图 在以前的 iOS 版本中 它对我有用 但自从升级到 iOS9 后 我遇到了这个问题 我的 h 文件如下所示 i
  • 在 ASP.NET 中生成 PDF 文档[重复]

    这个问题在这里已经有答案了 可能的重复 直接将 aspx 转换为 pdf 有没有办法直接从页面输出从asp net生成PDF文档 我的要求是 当用户访问我网站上的页面时 应该有一个条款可以获取 PDF 格式的相同页面 报告 使用iTextS
  • 获取sklearn中节点的决策路径

    我想要 scikit learn 决策树 DecisionTreeClassifier 中从根节点到给定节点 我提供 的决策路径 即规则集 clf decision path指定样本经过的节点 这可能有助于获取样本遵循的规则集 但是如何获取
  • 为什么 Spring MVC 响应 404 并报告“在 DispatcherServlet 中未找到带有 URI [...] 的 HTTP 请求的映射”?

    我正在编写一个部署在 Tomcat 上的 Spring MVC 应用程序 请参阅以下内容最小 完整且可验证的示例 public class Application extends AbstractAnnotationConfigDispat
  • PHP,strip_tags 在文本区域中剥离 \n。怎么阻止呢?

    我希望能够接受 n or r n并将它们转换为 br 以在页面中使用 尽管当用户提交包含新段落的文本区域时 strip tags函数似乎将它们直接剥离了 我能做些什么来将这些保留在字符串中吗 谢谢 您可以使用nl2br添加BR换行符元素到换
  • 如何编写写入 stdin 的 Go 测试?

    假设我有一个简单的应用程序 它从标准输入读取行并简单地将其回显到标准输出 例如 package main import bufio fmt io os func main reader bufio NewReader os Stdin fo
  • Hibernate @OrderBy 与引用的类

    我有一堂课说 ClassA 其中有 ClassB 的集合 OneToMany cascade CascadeType ALL fetch FetchType LAZY JoinColumn name COLUMN NAME private
  • 如何从 C++ 对象中获取类名?

    是否也可以获取对象名称 include
  • 如何在 AOSP 构建中添加 APK?

    我需要将一些第 3 方 APK 添加到我的 AOSP 版本中 我应该将这些 APK 保存在哪个文件夹中 以便在构建代码并创建映像时将其安装在模拟器中 看起来系统应用程序保存在包 应用程序文件夹 所以我需要知道第三方 APK 的保存位置 将第
  • 使用具有特定精度的小数作为 Dapper 的输出参数

    我正在评估 Dapper 作为自定义和繁琐代码的替代品 到目前为止 一切都非常好并且很有前途 但是今天早上我偶然发现了动态参数的问题并且找不到解决方案 存储过程计算客户的帐户余额和可用余额 并以两位小数输出参数返回其结果 这些小数在存储过程
  • 使用 Java8 计算 int 出现次数

    Java8 有没有更好的方法来计算 int 出现次数 int monthCounter new int 12 persons stream forEach person gt monthCounter person getBirthday
  • 两个 Wifi 设备之间的数据传输

    我在谷歌上搜索过 在 Android 2 2 和 sdk 8 中 如何在 Android 列表中使用 SSID 通过使用 SSID 应以编程方式获取特定的启用 WiFi 的设备属性 有了这个帮助 应该可以在 Android 中的两个支持 W
  • 如何在postgres中编写组合函数?

    我有一个这种形式的 PostgreSQL 表 base id int mods smallint 3 7 15 48 我需要填充这种形式的表 combo id int base id int mods smallint 1 3 2 3 7
  • pprint 对字典排序但不对集合排序?

    我知道字典和集合没有排序 因此相等的集合或字典可能会以不同的方式打印 所有测试都使用Python 3 6 1 gt gt gt for obj in 0 8 8 0 0 0 8 8 8 8 0 0 print obj 0 8 8 0 0 0
  • Jaxer 的优点和缺点

    我意识到这个问题已经之前问过 但已经一个月了 没有像样的回应 我正在看阿普塔纳的贾克瑟我发现这个概念非常令人兴奋 对于那些不熟悉的人来说 这里是一个快速概述 用他们的话来说 Jaxer 是 世界上第一个真正的 AJAX 服务器 它基于 Mo
  • geom_bar(position = "dodge") 中的条形宽度相同

    我想绘制具有相同宽度的条形图 这是我的最小示例代码 data lt data frame A letters 1 17 B sample 1 500 17 C c rep 1 5 rep 2 6 rep c 3 4 5 each 2 ggp