ggplot2 barplot的宽度相同

时间:2016-07-27 18:58:29

标签: r ggplot2

我想使用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的四条垂直线。

1 个答案:

答案 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

enter image description here

在我看来,这是一个比后面更好的图表,因为它吸引了读者注意数据中存在空白的事实。

但如果你坚持酒吧之间没有间距,那么这样的事情会让你接近。它使用您的第一个版本的facet_grid;它使用scalesspace"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))

enter image description here