2016-07-27 3 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. Здесь я устанавливаю уровни для 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)) 

enter image description here

На мой взгляд, это лучший график, чем тот, который следует becaus он обращает внимание читателя на тот факт, что существуют пробелы в данных.

Но если вы настаиваете на отсутствии промежутков между стержнями, то что-то вроде этого приближает вас. Он использует вашу первую версию 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()) 

enter image description here

+0

Да, это то, что я хочу. Большое спасибо с наилучшими пожеланиями, Setye – setye