如何在 R 中的 ggplot2 中的条形组之间插入或创建视觉分隔?

How to insert or create a visual separation between groups of bars within ggplot2 in R?

我想在 ggplot 中的斜线组(D、E、F、G、H、I e J)之间创建分隔。

使用钻石数据库。

ggplot(diamonds, aes(x = color, y=depth, fill=factor(clarity ))) +
  geom_col(position = "dodge")+
  scale_fill_manual(values = c("red4", "seagreen3", "grey", "yellow", "black", "blue", "green", "sienna","tomato1", "tan2"), name="clarity") +
  theme_light()

我有:

但我想以一种简单的方式在组之间创建一些视觉分离,类似于此`

OBS1:facet_grid 将不起作用,因为我将使用另外两个变量添加到 facet_grid

OBS2:为了澄清:我想添加一些视觉效果来帮助从视觉上区分组,以便更容易理解每​​个组的开始和结束位置。

OB3:我用矩形分隔每个组编辑了第二张图片(预期)。这个想法或多或少是这样的。

编辑:新答案 - 使用 geom_rect.

ggplot(diamonds, 
       aes(x = color, 
           y = depth, 
           fill = factor(clarity ))) +
    geom_col(position = "dodge") +
    geom_rect(aes(xmin = as.numeric(color) - 0.5, 
                  xmax = as.numeric(color) + 0.5), 
              ymin = -0.5, 
              ymax = Inf, 
              color = "red", 
              fill = NA, 
              size = 2) +
    scale_fill_manual(values = c("red4", "seagreen3", "grey", "yellow", "black",
                                 "blue", "green", "sienna","tomato1", "tan2"), 
                      name = "clarity") + 
    theme_light()

结果:

旧答案 - 在您修改问题之前。

我认为最简单的方法是使用facet_grid。它并非真正为此目的而设计,但会产生所需的视觉效果。

ggplot(diamonds, 
       aes(x = color, 
           y = depth, 
           fill = factor(clarity ))) +
geom_col(position = "dodge") +
scale_fill_manual(values = c("red4", "seagreen3", "grey", "yellow", "black",
                             "blue", "green", "sienna","tomato1", "tan2"), 
                             name = "clarity") + 
facet_grid(. ~ color, 
           scales = "free_x", 
           switch = "x") + 
theme_light() + 
theme(axis.text.x = element_blank(), 
      axis.ticks.x = element_blank())

结果:

使用geom_vline

ggplot(diamonds, aes(x = color, y=depth, fill=factor(clarity ))) +
  geom_col(position = "dodge")+
  scale_fill_manual(values = c("red4", "seagreen3", "grey", "yellow", "black", "blue", "green", "sienna","tomato1", "tan2"), name="clarity") +
  theme_light() +
  geom_vline(xintercept = (0:7)+0.5)

已经在中发布的geom_vline()方法将很好地回答您的具体要求;但是,它可能不是您问题的最佳解决方案图形化。即使在条形图之间画了线……也很难在视觉上将条形图组彼此分开。条形图已经很细了,所以画一条细的垂直线会使观察者很难将线与条形图分开。如果您计划除此之外对数据进行分面处理,问题会变得更糟。

我建议的替代方法是使用空格来分隔您的条形组,方法是利用 position=position_dodge(width=...)geom_col() 本身内部的 width=... 参数。这是您发布的示例中的示例。

在 geom_col()

中使用宽度
ggplot(diamonds, aes(x = color, y=depth, fill=factor(clarity ))) +
  geom_col(position = "dodge", width=0.5)+
  scale_fill_manual(values = c("red4", "seagreen3", "grey", "yellow", "black", "blue", "green", "sienna","tomato1", "tan2"), name="clarity") +
  theme_light()

您可以看到 geom_col()width= 的参数具有改变整个 geom 在每个 x 位置的宽度的效果。因此,此值控制 整个组 柱的宽度。这个小改动足以在不添加行的情况下清楚地显示分隔(并保留一点空白以便于比较)。

(为了比较,默认的 width= 类似于 0.7 或 0.8)。

使用position_dodge(width=...)控制组间距

您可能需要进一步调整上图,以在条形图之间提供一点点分隔。这一个更多地关注视觉偏好,但作为控制条形图组位置的工具很有用。 position="dodge"position=position_dodge() 的 shorthand 表达方式。默认宽度使条形彼此紧挨着,其中 position_dodge() 中的 width= 参数等于整个 geom 的 width=。如果您在 position_dodge() 中增大此数字,则会增加条形之间的间距。如果你把它变小,你会得到重叠的条。以下是在条形之间添加一点间距时会发生的情况:

ggplot(diamonds, aes(x = color, y=depth, fill=factor(clarity ))) +
  geom_col(position = position_dodge(width=0.6), width=0.5)+
  scale_fill_manual(values = c("red4", "seagreen3", "grey", "yellow", "black", "blue", "green", "sienna","tomato1", "tan2"), name="clarity") +
  theme_light()

我认为它看起来比将条形图并排放置要好一些,但这将取决于您自己的特定图表以及每个组中有多少个面、x 位置值和条形图。