如何控制ggplot2中堆栈栏之间的空间? [英] How to control space between stack bars in ggplot2?
问题描述
我正在ggplot2中绘制一个堆栈barplot。我的数据集就像是,
var1 var2 var3 value
treatment1 group_1 C8.0 0.010056478
treatment2 group_1 C8 .0 0.009382918
treatment3 group_2 C8.0 0.003014983
treatment4 group_2 C8.0 0.005349631
treatment5 group_2 C8.0 0.005349631
var1
包含5个处理,这5个处理属于 var2
,每个治疗在 var3
中有14个测量值,它们的值存储在值
中。
我想绘制一张图来比较这五种治疗方法及其测量结果。
,所以我绘制了如下图所示的堆栈条:
我的代码:
library(ggplot2)
colourCount = length(唯一的(mydata $ var3))
getPalette = colorRampPalette(brewer.pal 14,YlGnBu))#从调色板中获取更多颜色
ggplot(data = mydata,aes(x = var1,y = value,fill = var3))+
geom_bar(stat =identity,position =stack,color =black,width = 0.2)+
*#geom_errorbar(aes(ymax = var3 + se,ymin = var3-se,width = .1) )+ *
scale_fill_manual(values = getPalette(colourCount))+
scale_y_continuous(expand = c(0,0))+
mytheme
我怎样才能将前两个堆积的柱子和其他三个柱子组合在一起?因为它们属于两组
library(ggplot2)
dummydf < - expand.grid(var1 = paste0(trt,1:5),
var3 = paste0(C_,11: 15)%%>%
mutate(value = runif(length(var1)),
var2 = ifelse(%c(trt1,trt2),grp1,var1% grp2))
ggplot(dummydf,aes(var1,value,fill = var3))+
geom_col(position =stack)+
facet_grid(〜var2,scales =free_x,space =free_x)
这个解决方案有时很棒!优点是:
$ b $ ol
例如:
ggplot(dummydf,aes(var1,value,fill = var3))+
geom_col(position =stack)+
facet_grid(〜var2,scales =free_x,space =free_x) +
主题(panel.spacing = unit(3,cm),
strip.text = element_text(size = 12,family =mono))
主要缺点到这个方法:
- 如果这已经是一个面板拼图的一部分,它会让
整件事变得混乱。 li>
- 如果您的分层组从治疗中显而易见,则您可能不需要明确标注,只需快速区分视觉。例如,假设这些组是控制/干预,而您的
治疗是无药物,安慰剂和药物1,2和3。
ol> - 添加
- 替换
NA
和在
中断
和标签
中使用trt99
和< -group1 | group2->
或类似的东西。 - it's simple to implement
- contains the labels for the hierarchical grouping at the top
- generally looks nice
- is easily customizable.
- If this is already part of a facet panelled plot, it makes the whole thing cluttered.
- If your hierarchical groups are obvious from the treatments, you may not need explicit labelling, just a quick visual distinction. For example, say the groups are control/intervention, and your treatments are "no drug, placebo" and "drugs 1, 2, and 3".
- Adding a text annotation in the plot area
- Replacing the
NA
and""
inbreaks
andlabels
withtrt99
and"<-group1 | group2->"
or something similar.
所以这里有一个替代方法:
dummydf%>%
bind_rows(data_frame(var1 =trt99))%>%
ggplot(aes(var1,value,fill = var3))+
geom_col(position =stack)+
scale_x_discrete(limits = c(trt1,trt2,trt99,trt3,trt4,trt5),
breaks = c(trt1,trt2,NA ,trt3,trt4,trt5),
labels = c(trt1,trt2,,trt3,trt4,trt5))
<该解决方案有其自身的缺点,主要是您只能以有限的方式自定义空间。您可以创建一个假条,该条等于您已获得的条的宽度的整数倍,方法是向限制,中断和标签添加更多的假级别。但是你不能创造出只有半个酒吧宽的空间。
您可以在假栏空间中提供更多信息:
I'm plotting a stack barplot in ggplot2. My dataset is like,
var1 var2 var3 value
treatment1 group_1 C8.0 0.010056478
treatment2 group_1 C8.0 0.009382918
treatment3 group_2 C8.0 0.003014983
treatment4 group_2 C8.0 0.005349631
treatment5 group_2 C8.0 0.005349631
var1
contains 5 treatments, these five treatments belong to two groups in var2
, and each treatment has 14 measurements in var3
, their value stored in value
.
I want to make a plot to compare these five treatments, and their measurements. so I plot with stack bar plot like this figure:
My code:
library(ggplot2)
colourCount = length(unique(mydata$var3))
getPalette = colorRampPalette(brewer.pal(14, "YlGnBu")) #get more color from palette
ggplot(data=mydata, aes(x=var1, y=value, fill=var3))+
geom_bar(stat="identity", position="stack", colour="black", width=.2)+
*#geom_errorbar(aes(ymax=var3+se, ymin=var3-se, width=.1))+*
scale_fill_manual(values = getPalette(colourCount))+
scale_y_continuous(expand = c(0, 0))+
mytheme
How could I group the first two stacked columns together, and the other three columns together? Because they belong to two groups in var2
.
The "duplicate question" comments above will lead you to an answer like this one:
library(dplyr)
library(ggplot2)
dummydf <- expand.grid(var1 = paste0("trt", 1:5),
var3 = paste0("C_", 11:15)) %>%
mutate(value = runif(length(var1)),
var2 = ifelse(var1 %in% c("trt1", "trt2"), "grp1", "grp2"))
ggplot(dummydf, aes(var1, value, fill = var3)) +
geom_col(position = "stack") +
facet_grid(~var2, scales = "free_x", space = "free_x")
And this solution is sometimes great! The advantages are:
For example:
ggplot(dummydf, aes(var1, value, fill = var3)) +
geom_col(position = "stack") +
facet_grid(~var2, scales = "free_x", space = "free_x") +
theme(panel.spacing = unit(3, "cm"),
strip.text = element_text(size = 12, family = "mono"))
The main disadvantages to this method:
So here's an alternate method:
dummydf %>%
bind_rows(data_frame(var1 = "trt99")) %>%
ggplot(aes(var1, value, fill = var3)) +
geom_col(position = "stack") +
scale_x_discrete(limits = c("trt1", "trt2", "trt99", "trt3", "trt4", "trt5"),
breaks = c("trt1", "trt2", NA, "trt3", "trt4", "trt5"),
labels = c("trt1", "trt2", "", "trt3", "trt4", "trt5"))
This solution has its own drawbacks, primarily that you can only customize the space in a limited way. You can create a "false" bar equal to an integer multiple of the widths of the bars you've already got by adding additional false levels to your limits, breaks, and labels. But you can't create a space that's only half a bar wide.
You could provide additional information in the false bar space though:
这篇关于如何控制ggplot2中堆栈栏之间的空间?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!