带有facet scale和动态geom_text位置的ggplot

时间:2017-08-31 08:28:23

标签: r ggplot2 facet

我正在使用带有facet_wrap的gglot来绘制一些数据。不同方面的尺寸非常不同(0.2对2000)。

我绘制geom_bar并在条形图上方添加相同值的geom_text。现在有一个问题。 geom_text值用于标题下的“大”条。

我看到两种可能的解决方案,我都无法实现。

  1. 将大条形的geom_text位置切换到内部。这可以通过aes中的vjust来完成。但是对于每个方面,切换点必须是不同的。

  2. 我想将y轴缩放到110%,因此文本有空间。但是我不想手动将它放到我的程序中,因为情节是自动完成的。

  3. enter image description here 我使用的代码

    library(ggplot2)
    testdata <- data.frame(a = c(0.1,0.2,0.3, 4,5,6, 7000,8000,9000),
                       b = c('a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'c' ),
                       c = c('aa', 'bb', 'cc', 'aa', 'bb', 'cc', 'aa', 'bb', 'cc'))
    
    ggplot(testdata, aes(x = c, y = a)) +
      geom_bar(stat = 'identity') +
      geom_text(aes(label = a), vjust = -1) +  
      facet_wrap(~b, ncol=1, scales = 'free_y')
    

1 个答案:

答案 0 :(得分:5)

以下是您的解决方案:

*(如果您想了解更多详细信息,请查看此stackoverflow question and answer

library(data.table)
testdata <- data.table(testdata)
testdata[,y_min:= a*0.5, by = c]
testdata[,y_max:= a*1.5, by = c]

ggplot(testdata, aes(x = c, y = a)) +
  geom_bar(stat = 'identity') +
  geom_text(aes(label = a), vjust = -1) + 
  facet_wrap(~b, ncol=1, scales = 'free_y') +
  geom_blank(aes(y = y_min)) +
  geom_blank(aes(y = y_max))

enter image description here

您首先需要为每个组创建y_miny_max个变量。并通过geom_blank()“绘制”它们。