如何使ggplot2在此图中排除零值?

时间:2019-02-04 12:15:33

标签: r ggplot2

我在R中运行以下RStudio代码,输出也如下所示:

df2  %>%
  ggplot(aes(
    x = JANUARY,
    y = value,
    fill = JANUARY,
    group = year
  )) +
  geom_col(
    position = position_dodge(.65),
    width = .5
  ) +
  geom_text(aes(
    y = value + max(value) * .03,
    label = round(value * 100) %>% str_c('%')
  ),
  position = position_dodge(.65)
  ) +
  geom_text(aes(
    y = y_pos,
    label = str_remove(year, 'X')
  ),
  color = 'white',
  angle = 90,
  fontface = 'bold',
  position = position_dodge(0.65)
  ) +
  scale_y_continuous(
    breaks = seq(0, .9, .1),
    labels = function(x) round(x * 100) %>% str_c('%')
  ) +
  scale_fill_manual(values = c(
    rgb(47, 85, 151, maxColorValue = 255),
    rgb(84, 130, 53, maxColorValue = 255),
    rgb(244, 177, 131, maxColorValue = 255),
    rgb(112, 48, 160, maxColorValue = 255),
    rgb(90, 48, 100, maxColorValue = 255)
  )) +
  theme(
    plot.title = element_text(hjust = .5),
    panel.background = element_blank(),
    panel.grid.major.y = element_line(color = rgb(.9, .9, .9)),
    axis.ticks = element_blank(),
    legend.position = 'none'
  ) +
  xlab('') +
  ylab('') +
  ggtitle('Month of JANUARY (as at 01 January)')

输出为:

column chart

如您所见,“ D最终”下的值“ 0%”使条形图内的标签消失在x-axis下方。

我要删除“ 0%”并使标签重新回到条形内的位置。如何修改我的代码以实现此目的?

添加了数据(df2):

JANUARY year  value y_pos
   <fct>   <chr> <dbl> <dbl>
 1 D-150   X2016  0.26 0.12 
 2 D-90    X2016  0.49 0.21 
 3 D-60    X2016  0.63 0.265
 4 D-30    X2016  0.73 0.325
 5 D-Final X2016  0.81 0    
 6 D-150   X2017  0.28 0.12 
 7 D-90    X2017  0.5  0.21 
 8 D-60    X2017  0.64 0.265
 9 D-30    X2017  0.77 0.325
10 D-Final X2017  0.82 0    
11 D-150   X2018  0.33 0.12 
12 D-90    X2018  0.51 0.21 
13 D-60    X2018  0.62 0.265
14 D-30    X2018  0.77 0.325
15 D-Final X2018  0.78 0    
16 D-150   X2019  0.24 0.12 
17 D-90    X2019  0.42 0.21 
18 D-60    X2019  0.53 0.265
19 D-30    X2019  0.65 0.325
20 D-Final X2019  0    0    

2 个答案:

答案 0 :(得分:1)

在第一行中,您可以使用df2 %>% filter(value!=0)过滤df2以获取所有非零值

答案 1 :(得分:1)

至少在这一点上,实际上不是0%。标签的位置是预定义的,并由y_pos给出,因此您可以自己简单地用例如

df2$y_pos[df2$JANUARY == "D-Final"] <- 0.4

要删除0%,第一行可以替换为

df2 %>% filter(value > 0.01) %>% 

这给

enter image description here

显然y_pos是用

定义的
df2 %>% group_by(JANUARY) %>% mutate(y_pos = min(value) / 2)

因此,为避免出现此问题,在这种情况下(由于按组划分的所有其他值都相似),您可以改为使用

df2 %>% group_by(JANUARY) %>% mutate(y_pos = max(value) / 2)