[英]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.