如何在 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 位置值和条形图。
我想在 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 位置值和条形图。