在ggplot中绘制可变水平线

提夫

我正在使用如下所示的多个数据框:

df <- data.frame(year = c(2013, 2014, 2015, 2016),
             number = c(100, 120, 125, 140),
             capacity = c(125, 125, 150, 150))

我想以并参考绘制number为条形图更具体地说,我想显示的值是否超过,以及超出的程度,其中后者绘制为水平线。yearcapacitynumbercapacity

capacity不随时间变化时,我可以轻松地做到这一点ggplot(df, aes(x = year, y = number)) + geom_col() + geom_hline(yintercept = capacity)但是,当我使用上述数据框执行此操作时,从逻辑上讲,我得到了跨越绘图整个范围的多条线。

我尝试了多种解决此问题的方法。进行一系列调用geom_segment是不切实际的,因为我正在处理许多数据帧并且capacity特异地变化。第二种解决方案是:

ggplot(df, aes(x = year, y = number)) + 
       geom_col(width= 0.75) +
       geom_errorbar(aes(ymin = capacity, ymax = capacity), color = "red", size = 2)

这使我在所有正确的位置都获得了水平条,但是它们并没有水平连接,更重要的是没有垂直连接。

最后,调用时连接线路geom_step

ggplot(df, aes(x = year, y = number)) + 
       geom_col(width= 0.75) +
       geom_step(aes(y = capacity, x = year), color = "red", size = 2)

但是,这里的问题是,步进功能在我希望更改时不会更改(即,在几年之间,以便在capacity更改时变得很清楚)。可以通过将美学因素geom_step移至来纠正此问题aes(y = capacity, x = year-0.5),但随后线条在图的右侧延伸得不够远。

希望我已经尝试完成了一半。理想地,顺便说一句,我想将参考线延伸到绘图的边缘,就像调用时一样geom_hline()

你好

这对您更一般的情况有用吗?这只是在geom_step美学上进行了调整,并以编程方式添加了额外的一行以填充红线的最后一点。最后一点是数据中最大年份的最后一个点加上最后的容量值。请注意,您的原始数据不会更改。

library(tidyverse)
df <- data.frame(year = c(2013, 2014, 2015, 2016),
                 number = c(100, 120, 125, 140),
                 capacity = c(125, 125, 150, 150))

ggplot(
  data = df %>% 
    arrange(year) %>% 
    add_row(year = max(.$year) + 1, capacity = last(.$capacity)),
  mapping = aes(x = year, y = number)
) + 
  geom_col(width= 0.75) +
  geom_step(aes(y = capacity, x = year - 0.5), color = "red", size = 2)
#> Warning: Removed 1 rows containing missing values (position_stack).

reprex包(v0.2.0)创建于2018-04-03。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章