繁体   English   中英

在密度 plot 中添加多条虚线

[英]Adding multiple dashed lines in density plot

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

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)

密度 plot 不带线

在此处输入图像描述

现在,我想使用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

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

您需要向图中添加一个新的 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).

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

当您在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将用默认值starwars替换NULL数据集。

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')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM