ggplot,日期-x轴,y = 0,标签位于底部

时间:2017-06-13 10:05:56

标签: r ggplot2 position axis axis-labels

我想制作一个带有日期x轴的图(ggplot),其中x轴位于y = 0,但x标签位于底部。它应该或多或少看起来像这张图片中的图表:enter image description here

我尝试使用hline这样:

ggplot(coe_melt, aes(x=time, y=value, color=score))+
geom_hline(yintercept=0)+ 
geom_line(size=2)+
scale_color_manual(values=c('blue','magenta','red','green'), breaks=c('Profitability', 'Growth', 'Safety','Payout'))+
      theme_bw()+
      theme(legend.position = 'bottom')+
      theme(axis.ticks.x = element_blank())

我在几个线程中读到可以用scale_x_continuous()完成,但问题是我的x轴包含日期而不是数字。当我用scale_x_continous()尝试它时,我收到了一个错误(原始未提供)。我用scale_x_date尝试过,但我没有得到结果。 使用上面的代码,我得到以下图: enter image description here

最后我想要一个水平线/轴,在y = 0处有刻度,我想要删除“下x轴”,另外我想要“紧”轴(如第一张图片中所示)。 / p>

我的数据如下:

  > head(coe_melt)
                time         score     value
        1 1977-07-01 Profitability 0.4737371
        2 1978-07-01 Profitability 0.4918117
        3 1979-07-01 Profitability 0.4249600
        4 1980-07-01 Profitability 0.3847234
        5 1981-07-01 Profitability 0.3604534
        6 1982-07-01 Profitability 0.4012554
    > coe_melt[c(1,40,79,118),]
              time         score       value
    1   1977-07-01 Profitability  0.47373711
    40  1977-07-01        Growth  0.51024065
    79  1977-07-01        Safety  0.02525786
    118 1977-07-01        Payout -0.12501210

2 个答案:

答案 0 :(得分:2)

请参阅下面的答案

ggplot(coe_melt, aes(x=time, y=value, color=score))+
  geom_hline(yintercept=0)+ 
  geom_line(size=2)+
  scale_color_manual(values=c('blue','magenta','red','green'), 
                     breaks=c('Profitability', 'Growth', 'Safety','Payout'))+
  theme_bw()+
  theme(legend.position = 'bottom')+
  theme(axis.ticks.x = element_blank())+

  theme(plot.background = element_blank(),
        panel.grid.major = element_blank(),
        panel.grid.minor = element_blank() )+
  theme(panel.border= element_blank())+
  theme(axis.line.y = element_line(color="black", size = 0.5))+
  expand_limits(y=c(-0.4, 0.8))+
  scale_y_continuous(breaks=seq(-0.4, 0.8, 0.2))

答案 1 :(得分:0)

结合Al14的答案和来自链接(类似)问题provided by Axeman的baptiste的回答,我设法通过以下代码非常接近所希望的结果:

   shift_axis <- function(p, y=0){
  g <- ggplotGrob(p)
  dummy <- data.frame(y=y)
  ax <- g[["grobs"]][g$layout$name == "axis-b"][[1]]
  p + annotation_custom(grid::grobTree(ax, vp = grid::viewport(y=1, height=sum(ax$height))), ymax=y, ymin=y)+

    geom_hline(aes(yintercept=y), data = dummy) +
    theme(axis.ticks.x=element_blank())+
    theme(axis.line.y = element_line(color='black'), axis.text.x = element_blank(), legend.title=element_blank(),
    plot.background = element_blank(), panel.grid.major = element_blank(),
    panel.grid.minor = element_blank(), panel.border= element_blank())
}
colo2 <- c("#E41A1C", "#984EA3", "#377EB8",  "#4DAF4A")
p <- ggplot(coe_melt, aes(x=time, y=value, color=score))+geom_line(size=2)+
scale_color_manual(values=colo2, breaks=c('Profitability', 'Growth', 'Safety','Payout'))+
  theme_bw()+theme(legend.position = 'bottom', axis.title.x = element_blank(), axis.title.y = element_blank())+
  scale_x_date(limit=as.Date(c('1977-07-01', '2015-07-01')), expand=c(0,0))
shift_axis(p, 0)

enter image description here

对我而言,非常接近,感谢大家的帮助;)