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