簡體   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