2016-07-27 92 views
0

我想使用ggplot2繪製條形圖,以便條形具有相同的寬度。 我有以下數據集。ggplot2 barplot相同寬度

 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)) 

因此,我包括NA爲Ts260和Ts520的缺失值,並重繪該圖。

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

如果我理解正確,您希望所有酒吧的寬度相同,但您也希望酒吧之間的空間相同。

首先,您的代碼似乎存在問題:您放棄sexratio的某個因子級別。在這裏,我按照從0%到100%的順序排列sexratio的等級。第二,讓我告訴你使用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)) 

enter image description here

在我看來,這是比後面是因爲...提請讀者注意一個事實,即有數據差距的一個更好的圖表。

但是,如果你堅持酒吧之間沒有間距,那麼這樣的事情會讓你關閉。它使用您的第一個版本mydata;它使用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()) 

enter image description here

+0

是的,這就是我想要的。感謝Setye,致以最誠摯的問候 – setye