我想使用ggplot2绘制条形图,以便条形具有相同的宽度。 我有以下数据集。
sexratio=c("0%male","0%male","0%male","0%male","25%male","25%male","50%male","50%male" ,"75%male","75%male","100%male","100%male","100%male", "100%male")
Trainsize=c("Ts130","Ts260","Ts520","Ts1040","Ts130", "Ts1040","Ts130", "Ts1040", "Ts130", "Ts1040","Ts130", "Ts260", "Ts520", "Ts1040")
Dm1=c(354.7015, 362.6982, 369.8013, 380.7233, 363.2208, 415.8980, 367.2899, 413.7292, 365.1060, 409.1913, 366.9871, 377.3490, 389.0739, 400.5590)
mydata=data.frame(Trainsize,sexratio,Dm1)
#Reorder the fators
mydata$sexratio<−factor(mydata$sexratio,levels(mydata$sexratio)[c(2:4,1)])
mydata$Trainsize<- factor(mydata$Trainsize,levels(mydata$Trainsize)[c(2:4,1)])
我使用以下代码绘制绘图,但请注意Ts260和Ts520的条形宽度较大。
p2<- ggplot(mydata, aes(x=Trainsize, y=Dm1, fill=sexratio)) +geom_bar(stat="identity", color="black",position=position_dodge()) +
geom_errorbar(aes(ymin=Dm1-10, ymax=Dm1+10), width=.2,position=position_dodge(.9))
因此,我为Ts260和Ts520的缺失值包含NA,并重绘图。
require(utils)
dat<-expand.grid( sexratio= c("25%male","50%male","75%male"), Trainsize= c("Ts260","Ts520"))
dat$Dm1<- NA
mydata<- rbind(mydata,dat)
p2<- ggplot(mydata, aes(x=Trainsize, y=Dm1, fill=sexratio)) +
geom_bar(stat="identity", color="black",
position=position_dodge()) +
geom_errorbar(aes(ymin=Dm1-10, ymax=Dm1+10), width=.2,
position=position_dodge(.9))
现在的问题是如何减少Ts260,Ts520与0%男性和100%男性之间的空间。
或者我如何在因子TS的水平之间绘制垂直线;这是Ts130,Ts260,Ts520,Ts1040的四条垂直线。
答案 0 :(得分:0)
如果我理解正确,你想要所有条形的宽度相同,但你也希望条形之间的空间相同。
首先,您的代码似乎存在问题:您放弃sexratio
的一个因素级别。在这里,我按顺序排列sexratio
的级别,从0%到100%。
其次,让我向您展示使用facet.grid
第二版mydata
时使用mydata2
的效果;这里名为switch = "x"
。条带文本使用library(ggplot2)
# Some data
sexratio=c("0%male","0%male","0%male","0%male","25%male","25%male","50%male","50%male" ,"75%male","75%male","100%male","100%male","100%male", "100%male")
Trainsize=c("Ts130","Ts260","Ts520","Ts1040","Ts130", "Ts1040","Ts130", "Ts1040", "Ts130", "Ts1040","Ts130", "Ts260", "Ts520", "Ts1040")
Dm1=c(354.7015, 362.6982, 369.8013, 380.7233, 363.2208, 415.8980, 367.2899, 413.7292, 365.1060, 409.1913, 366.9871, 377.3490, 389.0739, 400.5590)
mydata=data.frame(Trainsize,sexratio,Dm1)
mydata$sexratio <− factor(mydata$sexratio, levels(mydata$sexratio)[c(2,5,4,3,1)])
mydata$Trainsize <- factor(mydata$Trainsize,levels(mydata$Trainsize)[c(2:4,1)])
# Add NAs where sexratio categories are missing
dat <- expand.grid(sexratio = c("25%male", "50%male", "75%male"), Trainsize = c("Ts260", "Ts520"))
dat$Dm1 <- NA
mydata2 <- rbind(mydata, dat)
# The plot
ggplot(mydata2, aes(x = Trainsize, y = Dm1, fill = sexratio)) +
geom_bar(stat = "identity", color = "black", position = position_dodge(width = .85)) +
geom_errorbar(aes(ymin = Dm1 - 10, ymax = Dm1 + 10), width = .2,
position = position_dodge(width = .85)) +
facet_grid(. ~ Trainsize, scales = "free_x", switch = "x") +
theme(axis.text.x = element_blank(),
strip.background = element_rect(fill = NA))
移动到底部。
mydata
在我看来,这是一个比后面更好的图表,因为它吸引了读者注意数据中存在空白的事实。
但如果你坚持酒吧之间没有间距,那么这样的事情会让你接近。它使用您的第一个版本的facet_grid
;它使用scales
,space
和"free_x"
都设置为switch = "x"
;将条带文本移动到底部(ggplot(mydata, aes(x = factor(1:dim(mydata)[1]), y = Dm1, fill = sexratio)) +
geom_bar(stat = "identity", color = "black", width = 1) +
geom_errorbar(aes(ymin = Dm1 - 10, ymax = Dm1+10), width = .2) +
facet_grid(. ~ Trainsize, scales = "free_x", space = "free_x", switch = "x") +
scale_x_discrete("Trainsize", expand = c(0, .75)) +
theme(axis.text.x = element_blank(),
strip.background = element_rect(fill = NA),
axis.ticks.x = element_blank())
);加上一些整理。
person.pantline = -10;
person.addChild(Pants(pantline:person.pantline))