Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用sapply和split具有不同的Pvalue和r^2'时出错;这是一个刻面覆盖图_R_Ggplot2_Facet_Sapply_Geom Text - Fatal编程技术网

使用sapply和split具有不同的Pvalue和r^2'时出错;这是一个刻面覆盖图

使用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” 下面是使用

我正在尝试使用不同的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")