library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.1     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.1
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
theme_set(theme_bw())

Plotting normal curves

Normal curve with base graphics

curve(dnorm(x, mean = 0, sd = 1), -4, 4)

Normal curve with ggplot

ggplot(data = data.frame(x = c(-4, 4)), aes(x = x)) +
  stat_function(fun = dnorm, args = list(mean = 0, sd = 1)) +
  theme(axis.title.y=element_blank()) +
  scale_y_continuous(breaks = NULL)

Shade the regions from -1.96 to +1.96

x <- seq(from = -4, to = 4, by = .01)
normal_df <- data.frame(x = x, y = dnorm(x, mean = 0, sd = 1))

ggplot(data = data.frame(x = c(-4, 4)), aes(x = x)) +
  geom_area(data = filter(normal_df, x >= -1.96 & x <= 1.96), aes(x = x, y = y), fill = "lightblue") +
  stat_function(fun = dnorm, args = list(mean = 0, sd = 1)) +
  theme(axis.title.y=element_blank()) +
  scale_y_continuous(breaks = NULL)