【问题标题】:Adding multiple dashed lines in density plot在密度图中添加多条虚线
【发布时间】:2020-12-28 01:19:38
【问题描述】:

我想在我的密度图中添加多条垂直线,这些垂直线从 x 轴开始,使用 ggplot2 在曲线结束。我正在使用来自 dplyr 的星球大战数据集。我想将高度变量绘制为正态分布。曲线内的虚线表示标准偏差。到目前为止,我得到了这个(只是没有线条的情节):

sd.values = seq(66, 264, 34.77043)
zeros.vector = rep(0, 6)

ggplot(starwars, aes(x=height, y=dnorm(height, m=mean(height, na.rm=T), s=sd(height, na.rm=T)))) +
  geom_line() + labs(x='height', y='f(height)') +
  scale_x_continuous(breaks=sd.values,labels=sd.values)

没有线条的密度图

现在,我想使用geom_segment 添加虚线:

ggplot(starwars, aes(x=height, y=dnorm(height, m=mean(height, na.rm=T), s=sd(height, na.rm=T))))+
  geom_line() + labs(x='height', y='f(height)') +
  scale_x_continuous(breaks=sd.values, labels=sd.values) +
  geom_segment((aes(x=sd.values, y=zeros.vector, xend=sd.values,
                    yend=dnorm(sd.values, m=mean(height, na.rm=T), s=sd(height, na.rm=T)))),
               linetyp ='dashed')

但最后,我只收到以下错误消息:

错误:美学长度必须为 1 或与数据 (87) 相同:x、y、xend 和yend

知道要添加虚线我必须更改什么吗?

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    您需要在图表中添加一个新的 data.frame(或 tibble),它可以有不同的维度。例如。像这样:

    library(dplyr)
    #> 
    #> Attaching package: 'dplyr'
    #> The following objects are masked from 'package:stats':
    #> 
    #>     filter, lag
    #> The following objects are masked from 'package:base':
    #> 
    #>     intersect, setdiff, setequal, union
    library(ggplot2)
    sd.values = seq(66, 264, 34.77043)
    # zeros.vector = rep(0, 6)
    
    ggplot(starwars, aes(x=height, y=dnorm(height, m=mean(height, na.rm=T), s=sd(height, na.rm=T))))+
        geom_line() + labs(x='height', y='f(height)') +
        scale_x_continuous(breaks=sd.values, labels=sd.values) +
        geom_segment(mapping = aes(x=SD, y=Zeros, xend=SD,
                          yend=dnorm(SD, m=mean(starwars$height, na.rm=T), s=sd(starwars$height, na.rm=T))),
                     linetype ='dashed', inherit.aes = F, data=data.frame(SD=sd.values, Zeros=rep(0, 6)))
    #> Warning: Removed 6 row(s) containing missing values (geom_path).
    

    reprex package (v0.3.0) 于 2020 年 12 月 27 日创建

    【讨论】:

      【解决方案2】:

      当您在ggplot() 中指定data 参数时,这将成为默认数据集。除非您为几何图形指定新数据,否则所有美学表达式必须具有与该数据集相同的长度。为避免设置默认数据集,您可以在 geoms 中指定 data 参数。

      library(tidyverse)
      
      data(starwars)
      
      sd.values <-  seq(66, 264, 34.77043)
      mean_height <-  mean(starwars$height, na.rm = TRUE)
      sd_height <-  sd(starwars$height, na.rm = TRUE)
      
      ggplot() + 
        geom_line(data = starwars, 
                  aes(x = height, y = dnorm(height, m = mean_height, sd = sd_height))) + 
        geom_segment(data = NULL, 
                     aes(x = sd.values, xend = sd.values, 
                         y = 0, yend = dnorm(sd.values, m = mean_height, sd = sd_height)),
                     linetype = 'dashed')
      

      请注意,即使您指定了data=NULL,以下调用也会失败,因为ggplot2 会将NULL 数据集替换为默认值starwars

      ggplot(data = starwars, aes(x = height, y = dnorm(height, m = mean_height, sd = sd_height))) + 
        geom_line() + 
        geom_segment(data = NULL, 
                     aes(x = sd.values, xend = sd.values, 
                         y = 0, yend = dnorm(sd.values, m = mean_height, sd = sd_height)))
      

      或者,您可以创建一个新数据集并指定它。

      library(tidyverse)
      
      data(starwars)
      
      mean_height <-  mean(starwars$height, na.rm = TRUE)
      sd_height <-  sd(starwars$height, na.rm = TRUE)
      
      df <- data.frame(
        sd_values = seq(66, 264, 34.77043)
      ) %>% mutate(yend = dnorm(sd_values, mean_height, sd_height))
      
      
      ggplot() + 
        geom_line(data = starwars, 
                  aes(x = height, y = dnorm(height, m = mean_height, sd = sd_height))) + 
        geom_segment(data = df, 
                     aes(x = sd_values, xend = sd_values, 
                         y = 0, yend = yend),
                     linetype = 'dashed')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-25
        • 2022-06-11
        • 2021-02-04
        • 2010-11-24
        • 2016-03-04
        • 2013-07-25
        • 1970-01-01
        相关资源
        最近更新 更多