Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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 计算组中一个点的密度_R_Ggplot2_Kernel Density_Density Plot - Fatal编程技术网

R 计算组中一个点的密度

R 计算组中一个点的密度,r,ggplot2,kernel-density,density-plot,R,Ggplot2,Kernel Density,Density Plot,我正在绘制一些密度曲线,我想在每组的平均值处添加一个点。但是,我想沿着密度曲线的顶部绘制这些点,而不是在0处。有没有办法计算出组内平均点的密度值?代码如下: #制作df df我不确定是否有办法在ggplot geom/stat函数中计算平均值处密度曲线的高度,因此我创建了两个辅助函数来实现这一点 dens_at_mean计算数据平均值处密度曲线的高度get_mean_coords按组运行dens_at_mean,然后缩放高度值以匹配由stat_Halveye生成的y值,并返回可传递到geom_p

我正在绘制一些密度曲线,我想在每组的平均值处添加一个点。但是,我想沿着密度曲线的顶部绘制这些点,而不是在0处。有没有办法计算出组内平均点的密度值?代码如下:

#制作df

df我不确定是否有办法在ggplot geom/stat函数中计算平均值处密度曲线的高度,因此我创建了两个辅助函数来实现这一点

dens_at_mean
计算数据平均值处密度曲线的高度
get_mean_coords
按组运行
dens_at_mean
,然后缩放高度值以匹配由
stat_Halveye
生成的y值,并返回可传递到
geom_point
的数据帧

# Reproducible data
set.seed(394)
df<- data.frame(group=c("a","b",'c'),
                value=rnorm(
                  3000,
                  mean=c(1,2,3),
                  sd=c(1,1.5,1)
                )) 

df %>%
  group_by(group)%>%
  mutate(mean_value=mean(value)) %>%
  
  # mutate(mean_density = density(mean_value,value))
  
  
  ggplot()+
  aes(x=value,y=group)+
  stat_halfeye()+
  
  # could do with stat summary
  stat_summary(
    orientation = "y",
    fun = mean,
    geom = "point", 
    color="blue",
    alpha=.8
  )+
  
  # or could do with geom_point using precalculated value
  # nudged so we can see both. 
  geom_point(aes(x=mean_value,y=group),
             color="red",
             position = position_nudge(x=.1)
  )
# Reproducible data
set.seed(394)
df<- data.frame(group=c("a","b",'c'),
                value=rnorm(
                  3000,
                  mean=c(1,2,3),
                  sd=c(1,1.5,1)
                )) 
# Function to get height of density curve at mean value
dens_at_mean = function(x) { 
  d = density(x)
  mean.x = mean(x)
  data.frame(mean.x = mean.x,
             max.y = max(d$y),
             mean.y = approx(d$x, d$y, xout=mean.x)$y)
}

# Function to return data frame with properly scaled heights 
#  to plot mean points
get_mean_coords = function(data, value.var, group.var) {

  data %>% 
    group_by({{group.var}}) %>% 
    summarise(vals = list(dens_at_mean({{value.var}}))) %>% 
    ungroup %>% 
    unnest_wider(vals) %>% 
    # Scale y-value to work properly with stat_halfeye
    mutate(mean.y = (mean.y/max(max.y) * 0.9 + 1:n())) %>% 
    select(-max.y)
}

df %>%
  ggplot()+
    aes(x=value, y=group)+
    stat_halfeye() +
    geom_point(data=get_mean_coords(df, value, group), 
               aes(x=mean.x, y=mean.y),
               color="red", size=2) +
    theme_bw() +
    scale_y_discrete(expand=c(0.08,0.05))