使用 2 个不同的变量进行排序和填充 geom_bar ggplot2 R

2023-11-25

我有一个关于填写字段的问题geom_barggplot2 包的。

我想用一个变量填充我的 geom_bar (在下一个示例中,该变量称为var_fill)但订购geom_plot与另一个变量(称为clarity在示例中)。

我怎样才能做到这一点?

非常感谢!

这个例子:

rm(list=ls())

set.seed(1)

library(dplyr)
data_ex <- diamonds %>% 
  group_by(cut, clarity) %>%
  summarise(count = n()) %>%
  ungroup() %>%
  mutate(var_fill= LETTERS[sample.int(3, 40, replace = TRUE)])

head(data_ex)

# A tibble: 6 x 4
   cut  clarity count var_fill
  <ord>   <ord> <int>    <chr>
1  Fair      I1   210        A
2  Fair     SI2   466        B
3  Fair     SI1   408        B
4  Fair     VS2   261        C
5  Fair     VS1   170        A
6  Fair    VVS2    69        C

我想要这个盒子的顺序[清晰度]:

library(ggplot2)
ggplot(data_ex) + 
  geom_bar(aes(x = cut, y = count, fill=clarity),stat = "identity", position = "fill", color="black")

enter image description here

使用框的填充(颜色) [var_fill] :

ggplot(data_ex) + 
  geom_bar(aes(x = cut, y = count, fill=var_fill),stat = "identity", position = "fill", color="black")

enter image description here

编辑1:误用找到的答案:

p1 <- ggplot(data_ex) + geom_bar(aes(x = cut, y = count, group = clarity, fill = var_fill), stat = "identity", position = "fill", color="black")+ ggtitle("var fill")

p2 <- ggplot(data_ex) +  geom_bar(aes(x = cut, y = count, fill = clarity), stat = "identity", position = "fill", color = "black")+ ggtitle("clarity")

library(cowplot)
cowplot::plot_grid(p1, p2)

enter image description here

编辑2:现在我尝试在missuse的帮助下使用ggmosaic扩展来做到这一点

rm(list=ls())
set.seed(1)
library(ggplot2)
library(dplyr)
library(ggmosaic)

data_ex <- diamonds %>% 
  group_by(cut, clarity) %>%
  summarise(count = n()) %>%
  ungroup() %>%
  mutate(residu= runif(nrow(.), min=-4.5, max=5)) %>%
  mutate(residu_classe = case_when(residu < -4~"< -4 (p<0.001)",(residu >= -4 & residu < -2)~"[-4;-2[ (p<0.05)",(residu >= -2 & residu < 2)~"[-2;2[ non significatif",(residu >= 2 & residu < 4)~"[2;4[ (p<0.05)",residu >= 4~">= 4 (p<0.001)")) %>%
  mutate(residu_color = case_when(residu < -4~"#D04864",(residu >= -4 & residu < -2)~"#E495A5",(residu >= -2 & residu < 2)~"#CCCCCC",(residu >= 2 & residu < 4)~"#9DA8E2",residu >= 4~"#4A6FE3")) 


ggplot(data_ex) +
  geom_mosaic(aes(weight= count, x=product(clarity, cut)),  fill = data_ex$residu_color, na.rm=T)+
  scale_y_productlist() +
  theme_classic() +
  theme(axis.ticks=element_blank(), axis.line=element_blank())+
  labs(x = "cut",y="clarity")

enter image description here

但我想在图的右侧添加这个图例(如下),但我不知道如何做到这一点,因为填充字段位于 aes 之外,所以 scale_fill_manual 不起作用...

enter image description here


利用群体审美:

p1 <- ggplot(data_ex) + 
  geom_bar(aes(x = cut, y = count, group = clarity, fill = var_fill),
           stat = "identity", position = "fill", color="black") + ggtitle("var fill")

p2 <- ggplot(data_ex) + 
  geom_bar(aes(x = cut, y = count, fill = clarity), stat = "identity", position = "fill", color = "black")+
  ggtitle("clarity")

library(cowplot)
cowplot::plot_grid(p1, p2)

enter image description here

编辑:使用 ggmosaic

library(ggmosaic)

p3 <- ggplot(data_ex) +
  geom_mosaic(aes(weight= count, x=product(clarity, cut), fill=var_fill), na.rm=T)+
  scale_x_productlist()

p4 <- ggplot(data_ex) +
  geom_mosaic(aes(weight= count, x=product(clarity, cut), fill=clarity,), na.rm=T)+
  scale_x_productlist()

cowplot::plot_grid(p3, p4)

enter image description here

在我看来,对于 ggmosaic 来说,根本不需要该组,两个图都是相反的 geom_bar 的版本。

EDIT3:
定义外部填充aes修复了以下问题:
1) X轴可读性
2)删除每个矩形边框中非常小的彩色线

data_ex %>%
mutate(color = ifelse(var_fill == "A", "#0073C2FF", ifelse(var_fill == "B", "#EFC000FF", "#868686FF"))) -> try2

ggplot(try2) +
  geom_mosaic(aes(weight= count, x=product(clarity, cut)),  fill = try2$color, na.rm=T)+
  scale_x_productlist()

enter image description here

要添加 y 轴标签,需要一些争论。这是一种方法:

ggplot(try2) +
  geom_mosaic(aes(weight= count, x=product(clarity, cut)),  fill = try2$color, na.rm=T)+
  scale_x_productlist()+
  scale_y_continuous(sec.axis = dup_axis(labels = unique(try2$clarity),
                                         breaks = try2 %>%
                                           filter(cut == "Ideal") %>%
                                           mutate(count2 = cumsum(count/sum(count)),
                                                  lag = lag(count2)) %>%
                                           replace(is.na(.), 0) %>%
                                           rowwise() %>%
                                           mutate(post = sum(count2, lag)/2)%>%
                                           select(post) %>%
                                           unlist()))

enter image description here

EDIT4:添加图例可以通过两种方式完成。

1 - 通过添加假图层来生成图例 - 但这会产生 x 轴标签的问题(它们是剪切和填充的组合),因此我定义了手动中断和标签

来自OP edit2的data_ex

ggplot(data_ex) +
  geom_mosaic(aes(weight= count, x=product(clarity, cut), fill = residu_classe), alpha=0, na.rm=T)+
  geom_mosaic(aes(weight= count, x=product(clarity, cut)), fill = data_ex$residu_color, na.rm=T)+
  scale_y_productlist()+
  theme_classic() +
  theme(axis.ticks=element_blank(), axis.line=element_blank())+
  labs(x = "cut",y="clarity")+
  scale_fill_manual(values = unique(data_ex$residu_color), breaks = unique(data_ex$residu_classe))+
  guides(fill = guide_legend(override.aes = list(alpha = 1)))+
  scale_x_productlist(breaks = data_ex %>% 
                        group_by(cut) %>%
                        summarise(sumer = sum(count)) %>% 
                        mutate(sumer = cumsum(sumer/sum(sumer)),
                               lag = lag(sumer)) %>%
                        replace(is.na(.), 0) %>%
                        rowwise() %>%
                        mutate(post = sum(sumer, lag)/2)%>%
                        select(post) %>%
                        unlist(), labels = unique(data_ex$cut))

enter image description here

2 - 从一个图中提取图例并将其添加到另一个图中

library(gtable)              
library(gridExtra) 

为传说制作假情节:

gg_pl <- ggplot(data_ex) +
  geom_mosaic(aes(weight= count, x=product(clarity, cut), fill = residu_classe), alpha=1, na.rm=T)+
  scale_fill_manual(values = unique(data_ex$residu_color), breaks = unique(data_ex$residu_classe))

绘制正确的图

z = ggplot(data_ex) +
  geom_mosaic(aes(weight= count, x=product(clarity, cut)), fill = data_ex$residu_color, na.rm=T)+
  scale_y_productlist()+
  theme_classic() +
  theme(axis.ticks=element_blank(), axis.line=element_blank())+
  labs(x = "cut",y="clarity")


a.gplot <- ggplotGrob(gg_pl)
tab <- gtable::gtable_filter(a.gplot, 'guide-box', fixed=TRUE)
gridExtra::grid.arrange(z, tab, nrow = 1, widths = c(4,1))

enter image description here

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

使用 2 个不同的变量进行排序和填充 geom_bar ggplot2 R 的相关文章

  • 从日期变量创建月末日期

    我有一个包含日期变量的大型数据框 它反映了该月的第一天 有没有一种简单的方法来创建代表该月最后一天的新数据框日期变量 以下是一些示例数据 date start month seq as Date 2012 01 01 length 4 by
  • randomForest 包在删除一个预测类时的奇怪行为

    我正在运行一个随机森林模型 它产生的结果从统计角度来看对我来说完全没有意义 因此我确信有些东西mustrandomForest 包的代码出现错误 至少在模型的本次迭代中 预测 左侧变量是具有 3 种可能结果的政党 ID 民主党 独立党 共和
  • 如何在 R 中合并同名列表中的数据框?

    我有一个包含很多数据框的列表 如果它们具有相同的名称 我想合并它们 即合并所有具有相同名称 a 和 b 的数据框 像这样 a lt aaaaa b lt bbbbb c lt ccccc g lt list df1 lt data fram
  • 将字符串列拆分为多个虚拟变量

    作为 R 中 data table 包的相对缺乏经验的用户 我一直在尝试将一个文本列处理为大量指示符列 虚拟变量 每列中的 1 表示特定的子字符串是在字符串列中找到 例如我想处理这个 ID String 1 a b 2 b c 3 c 进入
  • 列出 R 数据文件的内容而不加载

    我有时用print load myDataFile RData 当我加载数据文件时列出它的内容 有没有办法列出内容而不加载数据文件中包含的对象 我认为如果不加载对象就无法做到这一点 解决方案可能是使用包装器将 R 对象保存到save 该函数
  • R 闪亮仪表板中的动态重复条件面板

    我正在尝试创建一个动态条件面板 所以我的条件如下 在用户界面中输入 selectInput inpt Input Number seq 1 50 1 selectize FALSE 我的条件面板 UI 输入是 conditionalPane
  • 需要在R中按行绑定列表数据

    我在 R 中按行绑定列表时遇到问题 我的列表数据集是 id 1 data k 1 id k b c 1 1 1 3 data k 2 id k b c 1 2 1 4 id 2 data k 1 id k b c 2 1 1 6 data
  • 绘制 Cox 回归的 Kaplan-Meier 图

    我使用 R 中的以下代码设置了一个 Cox 比例风险模型来预测死亡率 添加协变量 A B 和 C 只是为了避免混淆 即年龄 性别 种族 但我们真正对预测变量 X 感兴趣 X 是一个连续变量 cox model lt coxph Surv t
  • 如何按用户定义(例如非字母顺序)对数据框进行排序[重复]

    这个问题在这里已经有答案了 给定一个数据框dna gt dna chrom start chr2 39482 chr1 203918 chr1 198282 chrX 7839028 chr17 3874 以下代码重新排序dna by ch
  • 如何纠正 data.frame 上的字符编码

    我有一个像这样的数据框 data names lt data frame DATA c 1 5 rownames data names lt c IV xc1N JOS xc9 LUC xcdA RAM xd3N TO xd1O data
  • R Shiny:如何将无功值从闪亮模块返回到主服务器功能?

    我有一个简单的玩具示例 它使用 add removeBtn 模块在 第一个 模块中添加和删除 UI 我需要跟踪单击 添加 删除 的次数 如果我不使用模块 这很容易 但我试图在嵌套模块的上下文中执行此操作 代码如下 但基本上 我似乎无法访问主
  • 如何声明包含 M 个元素的列表对象

    我想声明一个包含 M 3 x 3 矩阵的列表 如果我事先知道数字 M 那么我可以通过以下方式声明这样的列表 elm lt matrix NA 3 3 Say M 7 myList lt list elm elm elm elm elm el
  • 在r中的某个阈值处破坏 cumsum() 函数

    例如我有以下代码 cumsum 1 100 我想打破它 如果一个元素 i 1 大于3000 我怎样才能做到这一点 因此 而不是这个结果 1 1 3 6 10 15 21 28 36 45 55 66 78 91 105 120 136 15
  • 在 Shiny 中显示反应式 htmlTable 表格

    我正在制作我的第一个 Shiny 应用程序 但找不到任何有关如何显示使用 htmlTable 包创建的表格的示例 我基本上想在按下按钮时创建一个表格并显示它 Shiny 显示 html 代码而不是表格 我不知道用什么替换服务器部分中的 re
  • 如何按定义的顺序将图像合并到一个文件中

    我有大约 100 张图像 png 我不想手动执行此操作 而是希望将它们按照定义的顺序 基于文件名 并排放置在一个 pdf 中 每行 12 个图像 有人有什么建议吗 我按照下面托马斯告诉我的方法尝试了 它把它们贴在旁边有一个黑边 我怎样才能去
  • 在 RMarkdown 输出到 PDF 时缩进而不添加项目符号点或编号

    之前有人问过如何在没有项目符号的情况下缩进文本 RMarkdown 中的点 但这是针对 HTML 输出的 在 RMarkdown 中缩进而不添加项目符号点或数字 https stackoverflow com questions 47087
  • 在网格中制作一个矩形图例,并标记行和列

    我有一个 ggplot 我将因子映射到填充和 alpha 如下所示 set seed 47 the data lt data frame value rpois 6 lambda 20 cat1 rep c A B each 3 cat2
  • 为什么这个 R ggplot2 代码会显示一个空白的显示设备?

    虽然 SO 通常不用于帮助解决错误 但这个显示了特别简单且特别烦人的行为 如果你是一个ggplot2用户 您可以在 10 秒或更短的时间内重现它 正如这个 GitHub 问题 ggplot gtable 创建空白显示 https githu
  • dplyr:连接中的 NSE (by)

    我很难弄清楚如何使用 dplyr left join 和 NSE 连接两个表 问题是我无法为 by 提供正确的值 我想我现在已经找到了解决方案 但感觉我正在以一种额外复杂的方式来做 因此 如果您知道更简单 更优雅的解决方案 请告诉我 这就是
  • 如何为自定义 S3 类实现提取/取子集 ([ [<-, [[ [[<-)] 函数?

    我有一个自定义的 S3 类foo 它在正常的基础上添加了一些自定义行为data frame foo object lt data frame class foo object lt c foo data frame 对于这个类 还应该有一个

随机推荐