微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在ggplot条形图中重新排序X轴聚类

如何解决如何在ggplot条形图中重新排序X轴聚类

下午好,R专家

我正在用R制作一个相当复杂的条形图,并且在组织图中的簇时遇到了困难。具体来说,所有的控制值和病变值都分别聚在一起,如下所示:

Clustered bar graph

我希望将控制和病变条件分别集中在各个方面,而不是让每份论文和任务并排放置。这将导致“控制”和“病变”标签重复多次,而我不知道该怎么做。我用来实现此条形图的代码如下:

p10 <- ggplot(cbMeta_new1,aes(x = Condition,y = Proportion,fill = Task,alpha = Paper)) +   
  geom_bar(stat = 'identity',position = 'dodge',colour='black') + 
  facet_grid(~  Type) +
  scale_alpha_discrete()

有人可以建议我如何编辑以上脚本以实现所需的格式吗?预先感谢您的时间和考虑!

以下是一些示例数据:

Example Data

dput(cbMeta_new[1:10,])
structure(list(Paper = structure(c(1L,2L,4L,5L,3L,6L),.Label = c("Cattaneo et al.,2012","Clausi et al.,2019","Gerschcovich et al.,2011","Hoche et al.,2016","Roca et al.,2013","van Harskamp et al.,2005","van Overwalle et al.,2019"),class = 
"factor"),Type = structure(c(2L,1L,4L
),.Label = c("Perceptual","Sequencing","Emotion Attribution","Verbal Vignette","Other"),class = "factor"),Task = structure(c(1L,9L,12L,12L),.Label = c("Bio Action Obs","Causal Attribution","Emot Attribution","False Belief","Faux Pas","Gravity","Mechanical","norm Behavior","RMET","Social Script","ToM","Trait Attribution","Violations"),Condition = structure(c(1L,1L),.Label = c("Control","Lesion"),Proportion = c(0.8875,0.73,0.71,0.78,0.95,0.7632,0.91,0.829444444,0.986428571
)),row.names = c(NA,10L),class = "data.frame")

很抱歉,我是这个网站的新手,仍然在浏览如何最好地发布这些帖子。

亲切的问候, 琳达

解决方法

您的示例数据仅包含“控制”条件,并且每个“类型”仅包含一个任务。我通过从Control减去常量并为每种类型减去第二个虚拟任务(通过使用新名称回收每个任务)来添加虚拟的“ Lesion”条件。

#add Lesion Condition
cbmeta_new1 <- rbind(cbmeta_new1,transform(cbmeta_new1,Condition = "Lesion",Proportion = cbmeta_new1$Proportion - 0.2))

#add second task for each type
cbmeta_new1 <- rbind(cbmeta_new1,Task = paste0(substr(cbmeta_new1$Task,1,3),"2")))

听起来您想将条件,任务和纸张组合在一起,以确定条形图在x轴上的位置。一种方法是使用interaction()创建一个新变量,其中包含这些变量的所有组合。

然后可以手动指定要在x轴上显示的标签。在这里,我将其设置为仅显示“条件”标签(“控制”与“病变”),而“任务”和“纸张”则由fillalpha标识,就像您在原始图中一样。

#variable for position on x-axis
cbmeta_new1$xpos1 <- with(cbmeta_new1,interaction(Condition,Paper,Task,drop = TRUE))

#Labels on x-axis (condition only)
xlabs1 <- rep(c("Control","Lesion"),length(levels(cbmeta_new1$xpos)))

#plot
ggplot(cbmeta_new1,aes(x = xpos1,y = Proportion,fill = Task,alpha = Paper)) +   
  geom_bar(stat = "identity",colour = "black",) + 
  facet_grid(. ~  Type,scale = "free_x") +
  scale_alpha_discrete() +
  scale_x_discrete(name = "",labels = xlabs1)+
  theme(axis.text.x = element_text(angle = 90,vjust = 0.5))

enter image description here

我发现alpha等级对区分论文没有帮助。更好的解决方案可能是将纸张标签放在x轴上,并使用alpha作为条件。还可以按条件将条形分组(对于任务和纸张的每种组合)。原理与之前相同:(a)创建一个变量以定义x位置(b)定义要在x轴上显示的标签。在这种情况下,我只显示这些论文。条件和任务由Alpha和颜色定义。为了创建x标签,我编写了一个自定义函数,该函数从 xpos2 变量的级别提取纸张名称。可能有一种更直接的方法来执行此操作,但这说明了总体思路。

#variable for position on x-axis
cbmeta_new1$xpos2 <- with(cbmeta_new1,interaction(Paper,drop = TRUE))

##Labels on x-axis (paper only)
xlabs2 <- sapply(levels(cbmeta_new1$xpos2),FUN = function(x) {
  x = sub(pattern = "et al.",replacement = "et al",x)
  x = sub(pattern = "\n",replacement = "",x)
  x = strsplit(x,split = ".",fixed = TRUE)[[1]]
  return(x[1])
})

#plot
ggplot(cbmeta_new1,aes(x = xpos2,alpha = Condition)) +   
  geom_bar(aes(group = Condition),stat = "identity",position = "dodge") + 
  facet_grid(. ~  Type,labels = xlabs2) +
  theme(axis.text.x = element_text(angle = 90,vjust = 0.5))

enter image description here

另一种选择是使用嵌套构面(例如,任务嵌套在type中)。例如,请参见此处:https://stackoverflow.com/a/58037287/6240490。或者,您可以简化事情,例如,为每个“类型”创建单独的图,然后自行安排它们,例如使用修补程序包(https://github.com/thomasp85/patchwork)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。