R ggplot:更改分组箱线图中线
R ggplot: Change Grouped Boxplot Median line
我已经绘制了分组箱线图,现在我想用白线替换标准的黑色中线,同时保持其他颜色的边框。我正在按照网站上的说明进行操作 Minimalist Boxplots 因为我真的很喜欢他们的风格。
他们使用命令stat_summary(geom = "crossbar", width=0.65, fatten=0, color="white", fun.data = function(x){ return(c(y=median(x), ymin=median(x), ymax=median(x))) })
。
该命令适用于简单的箱线图:
但现在我正尝试在我的分组箱线图上使用它,它不再工作了(白色中线丢失):
这是我的重现数据的代码:
Data <- data.frame(
W = sample(1:100),
M = sample(1:100),
A = sample(1:100),
O = sample(1:100),
Type = sample(c("1", "2", "3", "4", "5")))
还有我的剧本:
Data_Boxplot <- melt(Data,id.vars='Type', measure.vars=c('W','M','A', 'O'))
Boxplots <- ggplot(Data_Boxplot, aes(Type, value, group=variable)) +
geom_boxplot(outlier.colour = NULL, aes(color=variable, fill=variable)) +
stat_summary(geom = "crossbar", width=0.65, fatten=0, color="white",
fun.data = function(x){c(y=median(x), ymin=median(x), ymax=median(x))})
Boxplots
我需要更改什么?非常感谢您的帮助。
您只为 geom_boxplot
映射了 x
和 y
。 geom 之间共享的变量应该为所有映射。在这种情况下,您还需要按 variable
.
分组
ggplot(Data.m, aes(Type, value, group=variable) +
geom_boxplot(outlier.colour = NULL, aes(color=variable, fill=variable)) +
stat_summary(geom = "crossbar", width=0.65, fatten=0, color="white",
fun.data = function(x){c(y=median(x), ymin=median(x), ymax=median(x))})
我没有测试,因为你没有提供数据。
编辑:
好的,现在我们有了一个很好的数据示例,我们可以看看发生了什么。
实际上我错过了两个问题。两者都是因为 geom_boxplot
会自动为您解决一些问题,因为 fill
而 stat_summary
不会。所以我们必须手动完成它们。
首先,我们想在 variable
和 Type
上进行分组,我们可以使用 interaction
函数来实现。
其次,箱线图会自动闪避(即在组内分开),而水平线则不会。我们将使用 position_dodge
定义我们的定位,并将其应用于两个 geom。将它应用于两者是使它们完全对齐的最简单方法。我们最终得到:
p <- position_dodge(0.8)
ggplot(Data_Boxplot, aes(Type, value, group = interaction(variable, Type))) +
geom_boxplot(aes(color = variable, fill = variable), outlier.colour = NULL, position = p) +
stat_summary(geom = "crossbar", width = 0.6, fatten=0, color="white", position = p,
fun.data = function(x){c(y=median(x), ymin=median(x), ymax=median(x))}) +
theme_minimal()
我已经绘制了分组箱线图,现在我想用白线替换标准的黑色中线,同时保持其他颜色的边框。我正在按照网站上的说明进行操作 Minimalist Boxplots 因为我真的很喜欢他们的风格。
他们使用命令stat_summary(geom = "crossbar", width=0.65, fatten=0, color="white", fun.data = function(x){ return(c(y=median(x), ymin=median(x), ymax=median(x))) })
。
该命令适用于简单的箱线图:
但现在我正尝试在我的分组箱线图上使用它,它不再工作了(白色中线丢失):
这是我的重现数据的代码:
Data <- data.frame(
W = sample(1:100),
M = sample(1:100),
A = sample(1:100),
O = sample(1:100),
Type = sample(c("1", "2", "3", "4", "5")))
还有我的剧本:
Data_Boxplot <- melt(Data,id.vars='Type', measure.vars=c('W','M','A', 'O'))
Boxplots <- ggplot(Data_Boxplot, aes(Type, value, group=variable)) +
geom_boxplot(outlier.colour = NULL, aes(color=variable, fill=variable)) +
stat_summary(geom = "crossbar", width=0.65, fatten=0, color="white",
fun.data = function(x){c(y=median(x), ymin=median(x), ymax=median(x))})
Boxplots
我需要更改什么?非常感谢您的帮助。
您只为 geom_boxplot
映射了 x
和 y
。 geom 之间共享的变量应该为所有映射。在这种情况下,您还需要按 variable
.
ggplot(Data.m, aes(Type, value, group=variable) +
geom_boxplot(outlier.colour = NULL, aes(color=variable, fill=variable)) +
stat_summary(geom = "crossbar", width=0.65, fatten=0, color="white",
fun.data = function(x){c(y=median(x), ymin=median(x), ymax=median(x))})
我没有测试,因为你没有提供数据。
编辑:
好的,现在我们有了一个很好的数据示例,我们可以看看发生了什么。
实际上我错过了两个问题。两者都是因为 geom_boxplot
会自动为您解决一些问题,因为 fill
而 stat_summary
不会。所以我们必须手动完成它们。
首先,我们想在 variable
和 Type
上进行分组,我们可以使用 interaction
函数来实现。
其次,箱线图会自动闪避(即在组内分开),而水平线则不会。我们将使用 position_dodge
定义我们的定位,并将其应用于两个 geom。将它应用于两者是使它们完全对齐的最简单方法。我们最终得到:
p <- position_dodge(0.8)
ggplot(Data_Boxplot, aes(Type, value, group = interaction(variable, Type))) +
geom_boxplot(aes(color = variable, fill = variable), outlier.colour = NULL, position = p) +
stat_summary(geom = "crossbar", width = 0.6, fatten=0, color="white", position = p,
fun.data = function(x){c(y=median(x), ymin=median(x), ymax=median(x))}) +
theme_minimal()