如何解决如何在ggplot条形图中重新排序X轴聚类
下午好,R专家
我正在用R制作一个相当复杂的条形图,并且在组织图中的簇时遇到了困难。具体来说,所有的控制值和病变值都分别聚在一起,如下所示:
我希望将控制和病变条件分别集中在各个方面,而不是让每份论文和任务并排放置。这将导致“控制”和“病变”标签重复多次,而我不知道该怎么做。我用来实现此条形图的代码如下:
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()
有人可以建议我如何编辑以上脚本以实现所需的格式吗?预先感谢您的时间和考虑!
以下是一些示例数据:
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轴上显示的标签。在这里,我将其设置为仅显示“条件”标签(“控制”与“病变”),而“任务”和“纸张”则由fill
和alpha
标识,就像您在原始图中一样。
#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))
我发现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))
另一种选择是使用嵌套构面(例如,任务嵌套在type中)。例如,请参见此处:https://stackoverflow.com/a/58037287/6240490。或者,您可以简化事情,例如,为每个“类型”创建单独的图,然后自行安排它们,例如使用修补程序包(https://github.com/thomasp85/patchwork)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。