如何使用 ggplot2 在小提琴图上显示最高密度点的 Y 值?
How do I show Y value of highest density point on a violin plot with ggplot2?
让我们从 ggplot2 小提琴图的文档示例中获取数据集,
> ToothGrowth$dose <- as.factor(ToothGrowth$dose)
> head(ToothGrowth)
len supp dose
1 4.2 VC 0.5
2 11.5 VC 0.5
3 7.3 VC 0.5
4 5.8 VC 0.5
5 6.4 VC 0.5
6 10.0 VC 0.5
如果我们绘制图表,
library(ggplot2)
# Basic violin plot
p <- ggplot(ToothGrowth, aes(x=dose, y=len)) +
geom_violin()
p
# Rotate the violin plot
p + coord_flip()
# Set trim argument to FALSE
ggplot(ToothGrowth, aes(x=dose, y=len)) +
geom_violin(trim=FALSE)
我们得到这个 graph。
如何显示峰值的数值,即 Y 轴上密度最高的点?
你的意思是这样的吗?
ggplot(ToothGrowth, aes(x = as.factor(dose), y = len)) +
geom_violin(trim = FALSE) +
geom_text(
data = ToothGrowth %>%
group_by(dose) %>%
summarise(len = mean(len)),
aes(x = as.factor(dose), y = len, label = len))
更新
要打印最大(密度)的位置,您可以执行以下操作
ggplot(ToothGrowth, aes(x = as.factor(dose), y = len)) +
geom_violin(trim = FALSE) +
geom_text(
data = ToothGrowth %>%
group_by(dose) %>%
nest() %>%
transmute(dose, len = map_dbl(data, function(x) {
dens <- density(x$len)
dens$x[which.max(dens$y)] })),
aes(x = as.factor(dose), y = len, label = sprintf("%4.3f", len)))
让我们从 ggplot2 小提琴图的文档示例中获取数据集,
> ToothGrowth$dose <- as.factor(ToothGrowth$dose)
> head(ToothGrowth)
len supp dose
1 4.2 VC 0.5
2 11.5 VC 0.5
3 7.3 VC 0.5
4 5.8 VC 0.5
5 6.4 VC 0.5
6 10.0 VC 0.5
如果我们绘制图表,
library(ggplot2)
# Basic violin plot
p <- ggplot(ToothGrowth, aes(x=dose, y=len)) +
geom_violin()
p
# Rotate the violin plot
p + coord_flip()
# Set trim argument to FALSE
ggplot(ToothGrowth, aes(x=dose, y=len)) +
geom_violin(trim=FALSE)
我们得到这个 graph。
如何显示峰值的数值,即 Y 轴上密度最高的点?
你的意思是这样的吗?
ggplot(ToothGrowth, aes(x = as.factor(dose), y = len)) +
geom_violin(trim = FALSE) +
geom_text(
data = ToothGrowth %>%
group_by(dose) %>%
summarise(len = mean(len)),
aes(x = as.factor(dose), y = len, label = len))
更新
要打印最大(密度)的位置,您可以执行以下操作
ggplot(ToothGrowth, aes(x = as.factor(dose), y = len)) +
geom_violin(trim = FALSE) +
geom_text(
data = ToothGrowth %>%
group_by(dose) %>%
nest() %>%
transmute(dose, len = map_dbl(data, function(x) {
dens <- density(x$len)
dens$x[which.max(dens$y)] })),
aes(x = as.factor(dose), y = len, label = sprintf("%4.3f", len)))