分组的ggplot2条形图缺少错误条

时间:2019-02-25 19:29:35

标签: r ggplot2 graph

我试图弄清楚如何仅对组图中的某些成员绘制误差线。例如,我有一个定义为的数据集:

 new_frame <- data.frame(Parms = c("CAGR", "CAGR", "CAGR", 
                                   "CAGR", "CAGR", "DD", "DD",
                                   "DD","DD","DD"),
                         Values = c(28, 27.4, 26.9, 24.6, 27.9, 
                                    18.7, 19.2, 18.5, 19.2, 19.1),
                         Rebal = c(18, 19, 20, 21, 22,
                                   18, 19, 20, 21, 22),
                         sd = c(2.8, 2.3, 1.9, 2.9, 2.1, 0,0,0,0,0))

给出了new_frame:

   Parms Values Rebal  sd
1   CAGR   28.0    18 2.8
2   CAGR   27.4    19 2.3
3   CAGR   26.9    20 1.9
4   CAGR   24.6    21 2.9
5   CAGR   27.9    22 2.1
6     DD   18.7    18 0.0
7     DD   19.2    19 0.0
8     DD   18.5    20 0.0
9     DD   19.2    21 0.0
10    DD   19.1    22 0.0

我的ggplot2语句是:

library(ggplot2)
ggplot(new_frame, aes(x=Rebal, y=Values, fill=Parms)) +
  geom_bar(position="dodge", stat="identity") + 
  geom_errorbar(aes(ymin=Values - sd, ymax=Values + sd),
  position=position_dodge(0.9), width=0.2) +
  ggtitle("           Variation With Rebalance Period”)

和情节是:

Example of missing error bars

我的问题是如何避免绘制绿色条的空错误刻度。在DD的sd值的new_frame中输入0仍会绘制刻度线,而将NA插入这些位置会引发ggplot错误。

2 个答案:

答案 0 :(得分:2)

您可以在geom_errorbarvalue == 0的地方设置NA的颜色:

ggplot(new_frame, aes(Rebal, Values, fill = Parms)) +
    geom_bar(position = "dodge", stat = "identity") + 
    geom_errorbar(aes(ymin = Values - sd, ymax = Values + sd,
                      # Is SD 0 (returns logical value)
                      color = sd == 0),
                  position = position_dodge(0.9), width = 0.2) +
    # Set 0 SD color to NA
    scale_color_manual(values = c("black", NA), guide = FALSE)

enter image description here

答案 1 :(得分:1)

将0值设置为NA

# in the data
new_frame$sd[new_frame$sd == 0] = NA

# or inline 
aes(ymin = Values - ifelse(sd == 0, NA, sd), ymax = Values + ifelse(sd == 0, NA, sd))

默认情况下,这将引发警告。您可以通过将参数na.rm = TRUE添加到geom_errorbar层来禁用警告:

geom_errorbar(
    aes(ymin = Values - sd, ymax = Values + sd),
    na.rm = T,
    position = position_dodge(0.9),
    width = 0.2
  )

我很欣赏聪明的color = sd == 0方法,但这是一种更通用的方法,它不依赖于所使用的其他美学。 (例如,如果您为错误栏映射了color美学,那么您需要为该工作方法选择不同的美学。)