R中的Barplot:更改顺序和控制标签

时间:2014-02-28 17:00:58

标签: r ggplot2 bar-chart

我的数据很少,我希望得到条形图。我设法绘制了数据图表。但是,我有两个问题。

1)我想根据X轴按顺序绘制条形,而不是根据值。 x轴的范围如下:< 40,100-500,500-1000,.....

40-100这样的值大于500-1000,最后绘制。我希望这些条形基于X轴的值。

2)如何控制每个条上标签值的位置。

以下是dput的数据:

structure(list(range = structure(c(1L, 6L, 2L, 7L, 3L, 4L, 5L
), .Label = c("<40", "100-500", "1000-1468", "1469-1479", "1480-1500", 
"40-100", "500-1000"), class = "factor"), values = c(100L, 10000L, 
1000L, 505L, 2000L, 50L, 5000L)), .Names = c("range", "values"
), class = "data.frame", row.names = c(NA, -7L))

这是我的代码:

DF$X<-NULL
colnames(DF)<-c("Size","occurances")
gr2<- ggplot(DF, aes(x =Size , y= occurances))+ 
      geom_bar(aes(fill=Size),stat="identity") +
      geom_text(aes(label = paste(sprintf("%0.0f", occurances)),
            y = occurances+0.25, x=Size),
           size = 5, face="bold",position = position_dodge(width=0.9)) +
      theme(axis.text.x=element_text(size=12,colour="gray19",face="bold"),
            axis.text.y=element_text(colour="gray19",size=12,face="bold"))+
      theme(axis.ticks.x = element_line(size = 2))+
      scale_x_discrete(breaks=c("<40","40-100","100-500","500-1000","1000-1468","1469-  1479","1480-1500"),expand=c(0,0) )+
      scale_y_continuous(expand=c(0.008,0.5))+
      guides(fill=FALSE)
      print(gr2)

任何建议!!

1 个答案:

答案 0 :(得分:0)

尝试:

DF$Size <- reorder(DF$Size, seq_along(DF$Size))
gr2<- ggplot(DF, aes(x =Size , y= occurances))+ 
  geom_bar(aes(fill=Size),stat="identity") +
  geom_text(aes(label = paste(sprintf("%0.0f", occurances)),
                y = occurances+0.25, x=Size),
            size = 5, face="bold", vjust=-.8) +
  theme(axis.text.x=element_text(size=12,colour="gray19",face="bold"),
        axis.text.y=element_text(colour="gray19",size=12,face="bold"))+
  theme(axis.ticks.x = element_line(size = 2))+
  scale_y_continuous(expand=c(0.1,0))+
  guides(fill=FALSE)
print(gr2)

enter image description here

关键是要重新排序您的因子级别,以便它们实际上处于递增顺序(这里我利用了您的DF已按此顺序排序的事实)。然后,您可以使用vjust中的geom_text来正确对齐。注意我也使用y标度与expand混淆。此外,摆脱你的scale_x_discrete电话,因为我认为你试图用它来改变订单,但如果你的因素水平正确,那就没有必要了。

顺便说一下,你是如何产生水桶的?您应该考虑使用cut,因为这应该按照正确的顺序设置您的级别。