【问题标题】:ggplot2 adding label to geom_areaggplot2 将标签添加到 geom_area
【发布时间】:2023-03-31 00:08:01
【问题描述】:

我正在教本科生统计学,并尝试制作一个有用的小 R 脚本来帮助我的学生了解计算标准正态分布中的概率。我有这个脚本,它采用 zscore 断点,计算每个断点之间的数据比例,并为每个断点部分着色:

library(tidyverse)
library(ggplot2)
library(magrittr)

sim_dat = data.frame(z = seq(-5,5, length.out = 1001))
sim_dat$y = dnorm(sim_dat$z, mean = 0, sd=1)

#fill in z-score bkpts, excluding zero: 0 will always be included

zscores <- c(-1,1.5)
zscores <- sort( setdiff(zscores,0) )
bkpoints <- sort( c(-Inf, zscores,0, Inf))

#find pct data between brekpoints
pctdata <- numeric(length=length(bkpoints)-1)
interval <- character(length=length(bkpoints)-1)

for(i in 1:length(pctdata)){
  pctdata[i] <- plyr::round_any(  pnorm(q=bkpoints[i+1]) - pnorm(q=bkpoints[i]) , 0.0001)
  interval[i] <- paste0(bkpoints[i],",",bkpoints[i+1])
  
  
}

pctdata_df <- cbind.data.frame(interval,pctdata,stringsAsFactors=FALSE)

sim_dat$standard_normal_sections = cut(sim_dat$z, breaks = bkpoints)

p1 <- ggplot2::ggplot(sim_dat, aes(z, y, fill = standard_normal_sections)) + geom_area() +
  scale_x_continuous(breaks= c(seq(-5,5,1), zscores))

p1

pctdata_df

我想使用 pctdata_df$pctdata(p1 部分中有多少数据的向量) 作为标签。关于如何将标签添加到 geom_area,我几乎没有发现。任何帮助表示赞赏!

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    geom_area 没有什么特别之处。如果您想添加标签,您可以使用 geom_text 执行此操作,将您的 pctdata_df 传递给 data 参数。由于您没有提供有关要在何处添加标签的信息,因此我已将它们放在面积图下方。

    注意:不需要for 循环。您可以简单地将向量传递给pnormpaste

    library(scales)
    library(ggplot2)
    
    # find pct data between brekpoints
    lower <- bkpoints[1:(length(bkpoints) - 1)]
    upper <- bkpoints[2:length(bkpoints)]
    
    pctdata <- pnorm(q = upper) - pnorm(q = lower)
    interval <- paste0(lower, ",", upper)
    
    pctdata_df <- data.frame(interval, lower, upper, pctdata)
    pctdata_df$x_label <- with(pctdata_df, ifelse(is.infinite(lower), upper - 1, .5 * (lower + upper)))
    pctdata_df$x_label <- with(pctdata_df, ifelse(is.infinite(upper), lower + 1, x_label))
    
    sim_dat$standard_normal_sections <- cut(sim_dat$z, breaks = bkpoints)
    
    ggplot(sim_dat, aes(z, y)) +
      geom_area(aes(fill = standard_normal_sections)) +
      geom_text(data = pctdata_df, aes(x = x_label, y = 0, label = scales::number(pctdata, .01)), 
                vjust = 1, size = 8 / .pt, nudge_y = -.01) +
      scale_x_continuous(breaks = c(seq(-5, 5, 1), zscores))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 2014-03-21
      • 2016-01-13
      • 2023-04-09
      • 2020-06-25
      • 2018-06-11
      相关资源
      最近更新 更多