我有一个使用iris
数据作为示例的小提琴+箱线图,如下所示:
data(iris)
iris_long <- as.data.frame(tidyr::pivot_longer(iris, -Species, names_to = "variable", values_to = "value"))
P <- ggplot2::ggplot(iris_long, ggplot2::aes(x=variable, y=value)) +
ggplot2::geom_violin() +
ggplot2::geom_boxplot(width=0.2, alpha=0, outlier.shape=NA, coef=0, show.legend=FALSE) +
ggplot2::stat_summary(fun=mean, geom="point", shape=16, size=2, show.legend=FALSE) +
ggplot2::theme_light()
grDevices::pdf(file="test.pdf", height=4, width=8)
print(P)
grDevices::dev.off()
由此产生了以下情节:
现在我还有一个包含每个变量级别的截止值的数据框,如下所示:
cutoffs <- data.frame(variable=sort(names(iris)[-length(names(iris))]), cutoff=c(7,2.5,8,4.5))
我只是想将它们绘制为每个小提琴+箱线图顶部的红色截止条,因此结果看起来类似于此:
解决这个问题的最佳方法是什么geom_segment
??或者有没有更简单的方法geom_errorbar
?
编辑
现在我试图完成同样的任务,但要将Species
信息包含在小提琴+箱线图中。一旦我添加fill=Species
(数据格式正确),我就会收到一个错误geom_segment
,我不知道如何调试。
此外,即使没有geom_segment
小提琴,箱线图也不能很好地对齐。
我该如何调试下面的错误并正确对齐小提琴和箱线图?
请注意,对于片段,我仍然只希望每个变量级别有一个截止值(一个用于萼片高度,一个用于萼片宽度,一个用于花瓣高度,一个用于花瓣宽度)。
这是新代码:
data(iris)
iris_long <- as.data.frame(tidyr::pivot_longer(iris, cols=names(iris)[-length(names(iris))],
names_to = "variable", values_to = "value"))
cutoffs <- data.frame(variable=sort(names(iris)[-length(names(iris))]), cutoff=c(7,2.5,8,4.5))
P <- ggplot2::ggplot(iris_long, ggplot2::aes(x=variable, y=value, fill=Species)) +
ggplot2::geom_violin() +
ggplot2::geom_boxplot(width=0.2, alpha=0, outlier.shape=NA, coef=0, show.legend=FALSE) +
ggplot2::stat_summary(fun=mean, geom="point", shape=16, size=2, show.legend=FALSE) +
ggplot2::geom_segment(data=cutoffs, ggplot2::aes(x=as.numeric(as.factor(variable)) - .25,
xend=as.numeric(as.factor(variable)) + .25,
y=cutoff, yend=cutoff), color = "red", alpha=0.75) +
ggplot2::theme_light()
grDevices::pdf(file="test.pdf", height=4, width=8)
print(P)
grDevices::dev.off()
错误如下:
错误
ggplot2::geom_segment()
:!计算美学时出现问题。ℹ 错误发生在第 4 层。错误原因:!未找到对象“物种”运行rlang::last_trace()
以查看错误发生的位置。
是的,我只需添加一个
geom_segment
:产生了这个情节:
注意:我猜你的截止点有点混乱(因此线条不对齐)
要融入填充美学,您需要
position_dodge
为geom_violin
、geom_boxplot
和提供显式stat_summary
的设置。此外,您应该将片段的填充美学设置为,NULL
否则它会尝试寻找它:生成: