R geom_text与躲避条形图和x轴日期

时间:2017-05-23 13:42:51

标签: r date bar-chart geom-text

我尝试在躲闪的条形图上添加位置geom_text中的文本但是它不适用于ggplot中的xaxis日期:

Data<-as.data.frame(             
  cbind( 
    as.POSIXct(c("2017-06-26", "2017-06-26" ,"2017-06-26" ,"2017-07-14", "2017-07-14",
    "2017-07-14", "2017-07-14" ,"2017-07-14", "2017-09-14", "2017-09-14"),origin = "1970-01-01", tz = "GMT"),
  c("CHLOROPHYTA","CYANOBACTERIA","INDETERMINES","BACILLARIOPHYTA","CHLOROPHYTA", "CYANOBACTERIA" ,   
    "HAPTOPHYTA","HETEROKONTOPHYTA","CHLOROPHYTA","CYANOBACTERIA" ),
  c(29,8637,3233,97,2816, 63721,282, 18,2001,76593)))
  colnames(Data)<-c("Date","Embranchement","NbCel")

  Data$Date<-as.POSIXct(as.numeric(as.character(Data$Date)), origin = "1970-01-01", tz = "GMT")

  my_plot<-
    ggplot(data=Data, aes(x=Date, y=NbCel, fill=Embranchement,width=1150000)) +
    geom_bar(position = "dodge", stat="identity")+
    geom_text(aes(label=NbCel), vjust=1.6, color="black",
              position = position_dodge(0.9), size=3.5)+
    scale_x_discrete(labels = Data$Date) +
    scale_fill_brewer(palette="Paired")#+
  #axis(1,at=Data$Date,labels = Data$Date)
  print(my_plot)

我得到的是:

enter image description here

如何在每个栏的中间添加文字?

另外一个问题是如何为每个日期添加每个x粗标记?

谢谢!

2 个答案:

答案 0 :(得分:1)

我不完全确定你想要达到的细节,但这是我的2美分。您可以使用以下代码:

您的首要问题是NbCel因素而不是数字。您可以在图表的Y轴上轻松查看。

# convert NbCel from factor to integer 
Data$NbCel <- as.integer(as.character(Data$NbCel))

修复此问题后,我们会使用图表本身。

X轴是“日期”信息和“分支”的混合。也许最好使用facet_wrap在不同的面板(facet)中分离出这两个面板。

# use a facet-wrap (separate plots in one graph)

ggplot(data=Data, aes(x=Embranchement, y=NbCel, fill=Embranchement)) +
  geom_bar(position = position_dodge(), stat="identity")+
  facet_wrap(~Date ,  ncol = 3)   +         ### plot per date
  scale_fill_brewer(palette="Paired") +
  geom_text(aes(label=NbCel, group = Embranchement), vjust=-.5, color="black",
            position = position_dodge(width = 10), size=2.5) + 
  theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 6))  # make X labels readible

enter image description here

请告诉我这是否是你想要的。

ADDITION

同样,您希望在X轴上组合“embranchement”和不同“日期”的不同栏。在这种情况下,更自然的事情可能是线图,这样您就可以在1个日期叠加有关不同数据点的频率信息。

您的数据集未满,即并非每个日期都包含所有“分组”。

# indicates measurement not available on every date, hence no lines
with(Data, table(Embranchement, Date))
Embranchement      2017-06-26 2017-07-14 2017-09-14
  BACILLARIOPHYTA           0          1          0
  CHLOROPHYTA               1          1          1
  CYANOBACTERIA             1          1          1
  HAPTOPHYTA                0          1          0
  HETEROKONTOPHYTA          0          1          0
  INDETERMINES              1          0          0

假设缺少的读数是空读数,我填写数据集,产生Data2

Data2 <- rbind(Data, 
               data.frame(Date = as.Date("2017-06-26", format="%Y-%m-%d"), Embranchement = "BACILLARIOPHYTA", NbCel = 0),
               data.frame(Date = as.Date("2017-06-26", format="%Y-%m-%d"), Embranchement = "HAPTOPHYTA", NbCel = 0),
               data.frame(Date = as.Date("2017-06-26", format="%Y-%m-%d"), Embranchement = "HETEROKONTOPHYTA", NbCel = 0),
               data.frame(Date = as.Date("2017-07-14", format="%Y-%m-%d"), Embranchement = "INDETERMINES", NbCel = 0),
               data.frame(Date = as.Date("2017-09-14", format="%Y-%m-%d"), Embranchement = "BACILLARIOPHYTA", NbCel = 0),
               data.frame(Date = as.Date("2017-09-14", format="%Y-%m-%d"), Embranchement = "HAPTOPHYTA", NbCel = 0),
               data.frame(Date = as.Date("2017-09-14", format="%Y-%m-%d"), Embranchement = "HETEROKONTOPHYTA", NbCel = 0),
               data.frame(Date = as.Date("2017-09-14", format="%Y-%m-%d"), Embranchement = "INDETERMINES", NbCel = 0)
               )

现在我们可以创建一个折线图:

ggplot(data=Data2, aes(x=Date, y=NbCel, col=Embranchement, linetype =Embranchement) ) +
  geom_line( size=1.1  ) +
  scale_fill_brewer(palette="Paired") +
  geom_text(aes(label=NbCel), vjust=-.75, color="black", size=2.5) 

产生下图,X轴为“date”,每个“Embranchement”为一行。

enter image description here

即使这不是你想要的,我希望它可以帮助你。

附加2(小平面的回顾,但更好)

(这个答案需要编辑,以后; - )

尝试使用此代码在facet中的条形图上获取干净的数字。 最重要的更改位于geom_textposition_dodge

ggplot(data=Data, aes(x=Embranchement, y=NbCel, fill=Embranchement)) +
  geom_bar(position = position_dodge(), stat="identity")+
  facet_wrap(~Date ,  ncol = 3)   +         ### plot per date
  scale_fill_brewer(palette="Paired") +
  theme_light() +
  geom_text(aes(label=NbCel, group = Embranchement), vjust=-.5, color="black",
            position = position_dodge(width = 1), size=2.5) +
  theme(axis.text.x = element_text(angle = 60, hjust = 1, size = 6)) 

您将获得此图表:

enter image description here

我认为这更接近你想要的。让我知道。

答案 1 :(得分:1)

你的第一个问题是NbCel是因子而不是数字。您可以在图表的Y轴上轻松查看。

# convert NbCel from factor to integer 
Data$NbCel <- as.integer(as.character(Data$NbCel))

现在使用@KoenV中的一些代码后,我们现在可以

ggplot(data=Data, aes(x=as.character(Date), y=NbCel)) +
       geom_bar(aes(fill=Embranchement), position = position_dodge(), stat="identity") +
       scale_fill_brewer(palette="Paired") +
       geom_text(aes(label=NbCel, y = NbCel + 1200, group = Embranchement), color="black", 
                 position = position_dodge(0.9), size=3.5)