条形图的误差条仅在一个方向上

jok*_*kel 7 plot r data-visualization bar-chart ggplot2

是否可以在ggplot2中调整错误栏,以便它们仅在一个方向上绘制(例如,仅向上但不向下)?

df <- data.frame(trt = factor(c(1, 1, 2, 2)), resp = c(1, 5, 3, 4),
                 group = factor(c(1, 2, 1, 2)), se = c(0.1, 0.3, 0.3, 0.2))
df2 <- df[c(1,3), ]

limits <- aes(ymax = resp + se, ymin = resp - se)
dodge <- position_dodge(width = 0.9)

p <- ggplot(df, aes(fill = group, y = resp, x = trt))
p + geom_bar(position = dodge, stat = "identity") +
    geom_errorbar(limits, position = dodge, width = 0.25)
Run Code Online (Sandbox Code Playgroud)

Rplot

Hen*_*rik 15

一个简单的解决方法是首先绘制误差线:

p +
  geom_errorbar(limits, position = dodge, width=0.25) +
  geom_bar(position = dodge, stat = "identity")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Mat*_*t74 5

在这种情况下,Henrik的建议非常好,但是我建议您看一下设置上限和下限的位置。

 limits <- aes(ymax = resp + se, ymin = resp - se)
Run Code Online (Sandbox Code Playgroud)

在该行中,您通过将ymin设置为resp - se; 明确告诉ggplot放置较低的扩展名。如果仅将其设置为resp,则只有上扩展名。

 limits <- aes(ymax = resp + se, ymin = resp)
Run Code Online (Sandbox Code Playgroud)

...尽管在栏的顶部也会有一条黑线。为了使外观更整洁,可以在整个栏上添加黑色轮廓。

p <- ggplot(df, aes(fill = group, y = resp, x = trt))+
  geom_bar(position = dodge, stat = "identity") +
  geom_bar(position = dodge, stat = "identity", 
           color="black", show_guide=FALSE)+
  geom_errorbar(limits, position = dodge, width = 0.25)
p
Run Code Online (Sandbox Code Playgroud)

条形图

请注意,我是如何复制条形图图层的,但是具有“黑色”颜色,从而添加了该轮廓。图例已在有色图层中关闭,因为我个人更喜欢避免图例中的对角线。


小智 5

既然可以轻松地ggplot2使用custom geoms 扩展它们,那么在一般情况下(您不能将下层误差线隐藏在另一个plot元素下)实际上很容易实现。

将代码从geom_errorbargithub存储库复制ggplot2到新的.R文件中。然后进行一些修改,如下所示:

geom_uperrorbar <- function(mapping = NULL, data = NULL,
   stat = "identity", position = "identity",
   ...,
   na.rm = FALSE,
   show.legend = NA,
   inherit.aes = TRUE) {
   layer(
      data = data,
      mapping = mapping,
      stat = stat,
      geom = GeomUperrorbar,
      position = position,
      show.legend = show.legend,
      inherit.aes = inherit.aes,
      params = list(
         na.rm = na.rm,
         ...
      )
   )
}
Run Code Online (Sandbox Code Playgroud)

上面仅有的两个必要的修改,要改变geom_errorbar到geom_uperrorbar和geom = GeomErrorbar到geom = GeomUperrorbar。

GeomUperrorbar <- ggproto("GeomUperrorbar", Geom,
   default_aes = aes(colour = "black", size = 0.5, linetype = 1, width = 0.5,
      alpha = NA),

   draw_key = draw_key_path,
Run Code Online (Sandbox Code Playgroud)

请注意,此注释在函数中途中断,该函数在下面的代码块中继续。在上方,我们只更改GeomErrorbar了GeomUperrorbar两次。

   required_aes = c("x", "y", "ymax"),

   setup_data = function(data, params) {
      data$width <- data$width %||%
         params$width %||% (resolution(data$x, FALSE) * 0.9)

      transform(data,
         xmin = x - width / 2, xmax = x + width / 2, width = NULL
      )
   },
Run Code Online (Sandbox Code Playgroud)

再次中断功能。上面我们改变所需的美学是x,y和ymax,即替换ymin用y。我们需要y在此处开始垂直线(而不是在ymin),并且不再需要,ymin因为那里不再有水平线。

   draw_panel = function(data, panel_scales, coord, width = NULL) {
      GeomPath$draw_panel(data.frame(
         x = as.vector(rbind(data$xmin, data$xmax, NA, data$x,   data$x)),
         y = as.vector(rbind(data$ymax, data$ymax, NA, data$ymax, data$y)),
         colour = rep(data$colour, each = 5),
         alpha = rep(data$alpha, each = 5),
         size = rep(data$size, each = 5),
         linetype = rep(data$linetype, each = 5),
         group = rep(1:(nrow(data)), each = 5),
         stringsAsFactors = FALSE,
         row.names = 1:(nrow(data) * 5)
      ), panel_scales, coord)
   }
)
Run Code Online (Sandbox Code Playgroud)

在这里,我们删除了传递到x和的向量的最后三个元素,这些元素y用于较低的误差线。另外,我们将最后一个元素从更改ymin为y,因为我们希望该行从而y不是从开始ymin。

"%||%" <- function(a, b) {
   if (!is.null(a)) a else b
}
Run Code Online (Sandbox Code Playgroud)

最后一点只是在需要定义的代码中使用的便利功能。

如果源文件包括所有代码,那么你可以使用geom_uperrorbar一样geom_errorbar,甚至通geom = "uperrorbar"到stat_summary,使用y代替ymin。