【发布时间】:2020-11-08 11:41:54
【问题描述】:
我使用R 的ggplot2 geom_violin 添加回归趋势线来绘制xy 分组数据:
以下是数据:
library(dplyr)
library(plotly)
library(ggplot2)
set.seed(1)
df <- data.frame(value = c(rnorm(500,8,1),rnorm(600,6,1.5),rnorm(400,4,0.5),rnorm(500,2,2),rnorm(400,4,1),rnorm(600,7,0.5),rnorm(500,3,1),rnorm(500,3,1),rnorm(500,3,1)),
age = c(rep("d3",500),rep("d8",600),rep("d24",400),rep("d3",500),rep("d8",400),rep("d24",600),rep("d3",500),rep("d8",500),rep("d24",500)),
group = c(rep("A",1500),rep("B",1500),rep("C",1500))) %>%
dplyr::mutate(time = as.integer(age)) %>%
dplyr::arrange(group,time) %>%
dplyr::mutate(group_age=paste0(group,"_",age))
df$group_age <- factor(df$group_age,levels=unique(df$group_age))
还有我目前的情节:
ggplot(df,aes(x=group_age,y=value,fill=age,color=age,alpha=0.5)) +
geom_violin() + geom_boxplot(width=0.1,aes(fill=age,color=age,middle=mean(value))) +
geom_smooth(data=df,mapping=aes(x=group_age,y=value,group=group),color="black",method='lm',size=1,se=T) + theme_minimal()
我的问题是:
- 如何去掉
legend中的alpha部分? - 我希望
x-axisticks是df$group而不是df$group_age,这意味着tick每个group在group的中心,其中标签是group.考虑一种情况,并非所有groups 都具有所有ages - 例如,如果某个group只有两个ages,我很确定ggplot只会出现这两个ages,我希望tick仍然位于它们的两个ages 之间。
还有一个问题:
最好将每个拟合斜率的 p 值绘制在每个 group 的顶部。
我试过了:
library(ggpmisc)
my.formula <- value ~ group_age
ggplot(df,aes(x=group_age,y=value,fill=age,color=age,alpha=0.5)) +
geom_violin() + geom_boxplot(width=0.1,aes(fill=age,color=age,middle=mean(value))) +
geom_smooth(data=df,mapping=aes(x=group_age,y=value,group=group),color="black",method='lm',size=1,se=T) + theme_minimal() +
stat_poly_eq(formula = my.formula,aes(label=stat(p.value.label)),parse=T)
但我得到与上面相同的情节,并带有以下warning 消息:
Warning message:
Computation failed in `stat_poly_eq()`:
argument "x" is missing, with no default
【问题讨论】:
标签: r ggplot2 legend axis-labels ggpmisc