Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.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
R 使用stat\u频率获取计数_R_Ggplot2_Label - Fatal编程技术网

R 使用stat\u频率获取计数

R 使用stat\u频率获取计数,r,ggplot2,label,R,Ggplot2,Label,我有一个例程,可以使用ggplot创建一些绘图: getPlotList = function(param.list, data=db, y, color){ param.list %>% sapply(function(var){ ggplot(data=data, aes(x=data[[var]], y=data[[y]], color=data[[color]]))+ stat_summary(fun.y = mean, fun.ymin = functio

我有一个例程,可以使用
ggplot
创建一些绘图:

getPlotList = function(param.list, data=db, y, color){
  param.list %>% sapply(function(var){
    ggplot(data=data, aes(x=data[[var]], y=data[[y]], color=data[[color]]))+
      stat_summary(fun.y = mean, fun.ymin = function(x){mean(x) - sem(x)}, fun.ymax = function(x){mean(x) + sem(x)}, geom = "errorbar", width=.1, position = position_dodge(0.3), na.rm = TRUE) +
      stat_summary(fun.y = mean, geom = "point", position = position_dodge(0.3), na.rm = TRUE) +
      ylim(0, NA) +
  }, simplify = FALSE, USE.NAMES = TRUE)
}
我是这样使用的:

c("col1", "col2", "col3") %>% getPlotList(y="col4", color="col5")
这非常有效(我有几十个图要写),并给出如下结果(但没有n=…标签):

问题是,我的计数对于每种颜色都是相同的,但是它可以随着x的变化而变化。
由于存在错误条(如果n=1或n=0,则不会显示),因此我必须在标签中显示计数,就像我在图片上所做的那样(使用油漆)

关于SO有很多类似的问题(如、、等),但都使用
geom_hist
geom_bar
,与我使用的
stat_summary
不同,它们碰巧有
.count..
元变量可用

如何添加这些标签


PS:我试图在我的函数中使用quosures而不是数据[…],但失败得很惨。这不是问题的主要部分,但如果有人有想法,这将对我有很大帮助。

这是使用以下示例数据构建的:

sampleData <-
  data.frame(
    col1 = factor(rep(LETTERS[1:4], c(12, 6, 16, 20)*5)
                  , levels = LETTERS[1:4])
    , col2 = factor(rep(LETTERS[1:4], c(1, 17, 16, 20)*5)
                    , levels = LETTERS[1:4])
    , col3 = factor(rep(LETTERS[1:4], c(0, 18, 16, 20)*5)
                    , levels = LETTERS[1:4])
    , col4 = rnorm(54*5, 4, 2)
    , col5 = factor(rep(1:5, 54))
  )
现在,这个代码:

c("col1", "col2", "col3") %>% getPlotList(y="col4", color="col5", data = sampleData)
给出了以下曲线图:

在@Nettle的请求下,我修改了代码,使用了更多的
tidyverse
,特别是使用标准评估来循环遍历列列表,而不是以前使用的基本
方法。我认为代码的功能应该相同。主要的优点是删除了中间变量,尽管有人可能认为这些变量可以提高可读性

getPlotList <- function(param.list, data=db, y, color){
  param.list %>% sapply(function(var){

    ggplot(data=data, aes_string(x=var, y=y, color=color))+
      stat_summary(fun.data = mean_cl_normal, position = position_dodge(0.3), na.rm = TRUE) +
      stat_summary(fun.y = mean, geom = "point", position = position_dodge(0.3), na.rm = TRUE) +
      ylim(0, NA) +
      geom_text(aes_string(x = var, y = "y", label = "label", color = NA)
                , data %>%
                  count(!!as.name(var), !!as.name(color)) %>%
                  group_by(!!as.name(var)) %>%
                  summarise(
                    label = paste("n =", paste(unique(n), collapse = ";"))
                  ) %>%
                  mutate(y = 0.5)
                , show.legend = FALSE)

  }, simplify = FALSE, USE.NAMES = TRUE)
}
getPlotList%sapply(函数(var){
ggplot(数据=数据,aes_字符串(x=var,y=y,color=color))+
统计汇总(fun.data=mean\u cl\u normal,position=position\u dodge(0.3),na.rm=TRUE)+
统计汇总(fun.y=平均值,geom=“点”,位置=位置减淡(0.3),na.rm=真)+
ylim(0,NA)+
几何图形文本(aes字符串(x=var,y=“y”,label=“label”,color=NA)
,数据%>%
计数(!!as.name(var),!!as.name(color))%>%
分组人(!!as.name(var))%>%
总结(
标签=粘贴(“n=”,粘贴(唯一(n),折叠=“;”)
) %>%
突变(y=0.5)
,show.legend=FALSE)
},simplify=FALSE,USE.NAMES=TRUE)
}

这是使用以下示例数据构建的:

sampleData <-
  data.frame(
    col1 = factor(rep(LETTERS[1:4], c(12, 6, 16, 20)*5)
                  , levels = LETTERS[1:4])
    , col2 = factor(rep(LETTERS[1:4], c(1, 17, 16, 20)*5)
                    , levels = LETTERS[1:4])
    , col3 = factor(rep(LETTERS[1:4], c(0, 18, 16, 20)*5)
                    , levels = LETTERS[1:4])
    , col4 = rnorm(54*5, 4, 2)
    , col5 = factor(rep(1:5, 54))
  )
现在,这个代码:

c("col1", "col2", "col3") %>% getPlotList(y="col4", color="col5", data = sampleData)
给出了以下曲线图:

在@Nettle的请求下,我修改了代码,使用了更多的
tidyverse
,特别是使用标准评估来循环遍历列列表,而不是以前使用的基本
方法。我认为代码的功能应该相同。主要的优点是删除了中间变量,尽管有人可能认为这些变量可以提高可读性

getPlotList <- function(param.list, data=db, y, color){
  param.list %>% sapply(function(var){

    ggplot(data=data, aes_string(x=var, y=y, color=color))+
      stat_summary(fun.data = mean_cl_normal, position = position_dodge(0.3), na.rm = TRUE) +
      stat_summary(fun.y = mean, geom = "point", position = position_dodge(0.3), na.rm = TRUE) +
      ylim(0, NA) +
      geom_text(aes_string(x = var, y = "y", label = "label", color = NA)
                , data %>%
                  count(!!as.name(var), !!as.name(color)) %>%
                  group_by(!!as.name(var)) %>%
                  summarise(
                    label = paste("n =", paste(unique(n), collapse = ";"))
                  ) %>%
                  mutate(y = 0.5)
                , show.legend = FALSE)

  }, simplify = FALSE, USE.NAMES = TRUE)
}
getPlotList%sapply(函数(var){
ggplot(数据=数据,aes_字符串(x=var,y=y,color=color))+
统计汇总(fun.data=mean\u cl\u normal,position=position\u dodge(0.3),na.rm=TRUE)+
统计汇总(fun.y=平均值,geom=“点”,位置=位置减淡(0.3),na.rm=真)+
ylim(0,NA)+
几何图形文本(aes字符串(x=var,y=“y”,label=“label”,color=NA)
,数据%>%
计数(!!as.name(var),!!as.name(color))%>%
分组人(!!as.name(var))%>%
总结(
标签=粘贴(“n=”,粘贴(唯一(n),折叠=“;”)
) %>%
突变(y=0.5)
,show.legend=FALSE)
},simplify=FALSE,USE.NAMES=TRUE)
}

如果你提供一个可用于测试的样本数据,那么帮助你就更容易了。我试图制作一个,但@MarkPeterson击败了我。如果你提供一个可用于测试的样本数据,帮助你就更容易了。我试图制作一个,但@MarkPeterson击败了我。这个答案对我来说简直是一座金矿,谢谢大家!@马克-你有没有可能完全在tidyverse里做这件事?@Nettle,为什么?几乎没有什么东西不在tidyverse中。如果您真的需要,我想您可以将
forLabels
的创建更改为
summary
语句(不使用
myCounts
中间语句)。我倾向于发现使用标准评估步骤(您需要在多个列中循环)比我喜欢的更为挑剔,尤其是当您在函数中包装东西时。好吧@Nettle,我不能放手,这是一个很好的借口,可以更多地使用标准评估步骤。我仍然不知道你为什么想要它(我真的很好奇),但现在有一个版本可以在
tidyverse
中保存更多内容。这个答案对我来说简直是一座金矿,谢谢@马克-你有没有可能完全在tidyverse里做这件事?@Nettle,为什么?几乎没有什么东西不在tidyverse中。如果您真的需要,我想您可以将
forLabels
的创建更改为
summary
语句(不使用
myCounts
中间语句)。我倾向于发现使用标准评估步骤(您需要在多个列中循环)比我喜欢的更为挑剔,尤其是当您在函数中包装东西时。好吧@Nettle,我不能放手,这是一个很好的借口,可以更多地使用标准评估步骤。我仍然不知道你为什么想要它(我真的很好奇),但是现在有一个版本可以在
tidyverse