使用sapply和split具有不同的Pvalue和r^2'时出错;这是一个刻面覆盖图
我正在尝试使用不同的pvalues和r^2显示在使用ggplot绘制的绘图上。我的情节需要分面,因为我有很多不同的数据因素。我试图制作的图都应该是线性模型,但我希望每个图都有自己的pvalue,并且r^2显示在各自的空间中 我一直在尝试使用sapply将数据框拆分,然后计算r^2和p值,然后使用geom_text(label=examplefunction)将它们插入到绘图中,但我一直收到错误“错误:美学必须是长度1或与数据相同(244):x,y,label,hjust,vjust” 下面是使用重塑包中的“提示”数据框的示例:使用sapply和split具有不同的Pvalue和r^2'时出错;这是一个刻面覆盖图,r,ggplot2,facet,sapply,geom-text,R,Ggplot2,Facet,Sapply,Geom Text,我正在尝试使用不同的pvalues和r^2显示在使用ggplot绘制的绘图上。我的情节需要分面,因为我有很多不同的数据因素。我试图制作的图都应该是线性模型,但我希望每个图都有自己的pvalue,并且r^2显示在各自的空间中 我一直在尝试使用sapply将数据框拆分,然后计算r^2和p值,然后使用geom_text(label=examplefunction)将它们插入到绘图中,但我一直收到错误“错误:美学必须是长度1或与数据相同(244):x,y,label,hjust,vjust” 下面是使用
library(reshape)
lm_equation <- function(tips){
sapply(split(tips, list(tips$sex, tips$day)), function(tips){
m <- lm(tips$tip ~ tips$total_bill, tips);
eq <- substitute(~~italic(r)^2~"="~rvalue*","~italic(p)~"="~pvalue,
list(rvalue = sprintf("%.2f",sign(coef(m)[2])*sqrt(summary(m)$r.squared)),
pvalue = format(summary(m)$coefficients[2,4], digits = 2)))
as.character(as.expression(eq));
})
}
scat <- ggplot(tips, aes(tip, total_bill))
scat +
geom_point(size = 5, alpha = 0.9)+
labs(x = "tip", y = "bill total")+
geom_smooth(method=lm, colour = "#000000", se = F)+
facet_grid(sex~day, scales = "free")+
geom_text(x = min(tips$tip), y = max(tips$total_bill-10), label = lm_equation(tips), parse = T, vjust = "inward", hjust = "inward")+
theme_classic() +
theme(text = element_text(size = 15))
库(重塑)
lm_等式这里是一个示例,说明如何获取您所拥有的,并将结果组织到一个data.frame中,其中包含绘制所需的所有变量。特别是,镶嵌面变量必须存在于数据集中
首先,您可以将每组的标签和名称(性别和日期的组合)作为列放入data.frame中。您需要使用原始x
和y
变量的名称为每个等式的位置添加一列
lab_dat = data.frame(group = names(lm_equation(tips)),
tip = min(tips$tip),
total_bill = max(tips$total_bill - 10),
label = lm_equation(tips))
lab_dat
group tip total_bill label
Female.Fri Female.Fri 1 40.81 ~~italic(r)^2 ~ "=" ~ "0.72" * "," ~ italic(p) ~ "=" ~ "0.029"
Male.Fri Male.Fri 1 40.81 ~~italic(r)^2 ~ "=" ~ "0.92" * "," ~ italic(p) ~ "=" ~ "0.00017"
Female.Sat Female.Sat 1 40.81 ~~italic(r)^2 ~ "=" ~ "0.50" * "," ~ italic(p) ~ "=" ~ "0.0071"
Male.Sat Male.Sat 1 40.81 ~~italic(r)^2 ~ "=" ~ "0.77" * "," ~ italic(p) ~ "=" ~ "1.4e-12"
Female.Sun Female.Sun 1 40.81 ~~italic(r)^2 ~ "=" ~ "0.74" * "," ~ italic(p) ~ "=" ~ "0.00041"
Male.Sun Male.Sun 1 40.81 ~~italic(r)^2 ~ "=" ~ "0.46" * "," ~ italic(p) ~ "=" ~ "0.00032"
Female.Thur Female.Thur 1 40.81 ~~italic(r)^2 ~ "=" ~ "0.87" * "," ~ italic(p) ~ "=" ~ "9.4e-11"
Male.Thur Male.Thur 1 40.81 ~~italic(r)^2 ~ "=" ~ "0.76" * "," ~ italic(p) ~ "=" ~ "1e-06"
然后,您需要获取组
变量,该变量组合了性别
和日期
,并将其拆分为两个单独的变量。为此,我使用包separate()
中的tidyr。新变量的命名应与原始数据集中的变量相同,因为这些变量是刻面变量,并且需要出现在用于任何打印层的数据集中
library(tidyr)
lab_dat = separate(lab_dat, group, c("sex", "day"))
lab_dat
sex day tip total_bill label
Female.Fri Female Fri 1 40.81 ~~italic(r)^2 ~ "=" ~ "0.72" * "," ~ italic(p) ~ "=" ~ "0.029"
Male.Fri Male Fri 1 40.81 ~~italic(r)^2 ~ "=" ~ "0.92" * "," ~ italic(p) ~ "=" ~ "0.00017"
Female.Sat Female Sat 1 40.81 ~~italic(r)^2 ~ "=" ~ "0.50" * "," ~ italic(p) ~ "=" ~ "0.0071"
Male.Sat Male Sat 1 40.81 ~~italic(r)^2 ~ "=" ~ "0.77" * "," ~ italic(p) ~ "=" ~ "1.4e-12"
Female.Sun Female Sun 1 40.81 ~~italic(r)^2 ~ "=" ~ "0.74" * "," ~ italic(p) ~ "=" ~ "0.00041"
Male.Sun Male Sun 1 40.81 ~~italic(r)^2 ~ "=" ~ "0.46" * "," ~ italic(p) ~ "=" ~ "0.00032"
Female.Thur Female Thur 1 40.81 ~~italic(r)^2 ~ "=" ~ "0.87" * "," ~ italic(p) ~ "=" ~ "9.4e-11"
Male.Thur Male Thur 1 40.81 ~~italic(r)^2 ~ "=" ~ "0.76" * "," ~ italic(p) ~ "=" ~ "1e-06"
现在,您可以使用geom\u text()
层的lab\u dat
为每个面绘制一个标签
ggplot(tips, aes(tip, total_bill)) +
geom_point(size = 5, alpha = 0.9)+
geom_smooth(method=lm, colour = "#000000", se = FALSE)+
facet_grid(sex ~ day, scales = "free")+
geom_text(data = lab_dat, aes(label = label), parse = TRUE,
vjust = "inward", hjust = "inward")
最终会有八个标签(每个方面一个),但错误是因为用于打印的数据集要大得多。与其只生成标签向量,不如尝试创建一个数据集,该数据集在一列中包含这些标签,其他列包含构成面的因子,以及用于放置文本的x和y变量。正在做一些像我建议的事情。@aosmith我似乎无法得到与我正在做的事情相适应的答案。。。我对拆分这件事还是个新手,我不断地遇到错误,我的参数需要有相同的长度。有什么想法吗?这太完美了!非常感谢。
ggplot(tips, aes(tip, total_bill)) +
geom_point(size = 5, alpha = 0.9)+
geom_smooth(method=lm, colour = "#000000", se = FALSE)+
facet_grid(sex ~ day, scales = "free")+
geom_text(data = lab_dat, aes(label = label), parse = TRUE,
vjust = "inward", hjust = "inward")