Программирование

Как наложить две функции плотности в R

Научитесь рисовать две нормальные функции плотности на одном графике в R, используя lines(), par(new = TRUE) или ggplot2 для чистого наложения и добавления легенд.

Как можно нарисовать две функции плотности вероятности на одном графике в R?
Я пробовал так:

r
x  <- seq(-2, 2, 0.05)
y1 <- pnorm(x)
y2 <- pnorm(x, 1, 1)
plot(x, y1, type = "l", col = "red")
plot(x, y2, type = "l", col = "green")

но получаются два отдельных графика. В MATLAB бы использовали hold on. Какой эквивалент в R, чтобы обе линии отобразились на одном рисунке?

Эквивалент MATLAB‑овского hold on в R – сначала рисуем первый график обычным plot(), а затем добавляем вторую линию с помощью lines() (или points()) либо пере‑рисовываем с par(new = TRUE).

r
x  <- seq(-2, 2, 0.05)
y1 <- dnorm(x, mean = 0, sd = 1)   # first density
y2 <- dnorm(x, mean = 1, sd = 1)   # second density

plot(x, y1, type = "l", col = "red", lwd = 2,
     xlab = "x", ylab = "Density",
     main = "Overlay of two normal PDFs")
lines(x, y2, col = "green", lwd = 2, lty = 2)
legend("topright", legend = c("N(0,1)", "N(1,1)"),
       col = c("red", "green"), lwd = 2, lty = 1:2)

Содержание


Как добавить вторую линию после первой

В базовом R plot() всегда открывает новый график, поэтому при каждом вызове создаётся новый рисунок.
После того как вы нарисовали первую кривую, можно добавить вторую с помощью lines() (или points()).

r
plot(x, y1, type = "l", col = "red")   # первая кривая
lines(x, y2, type = "l", col = "green") # вторая кривая

Статья, на которую ссылается: Statology – How to overlay plots in R объясняет, как использовать lines() и points() для наложения графиков.


Использование par(new = TRUE)

Если вам нужно полностью переопределить некоторые параметры графика (например, оси, подписи), можно задать par(new = TRUE) перед вторым вызовом plot().
Это заставляет R не очищать текущий рисунок, а просто рисовать поверх него.

r
plot(x, y1, type = "l", col = "red", ylim = c(0,0.5))
par(new = TRUE)
plot(x, y2, type = "l", col = "green", axes = FALSE, xlab = "", ylab = "")

Пример из практики: GeeksforGeeks – How to overlay plots in R демонстрирует оба подхода.


Почему plot() перезаписывает график

plot() всегда вызывает dev.new() или очищает текущий графический контекст.
Поэтому при каждом вызове plot() создаётся новый рисунок.
Функции lines() и points() не вызывают очистку устройства, они просто добавляют новые элементы к уже существующему рисунку.


Альтернативы: ggplot2

Если вы предпочитаете более современный стиль визуализации, ggplot2 делает наложение графиков простым и читаемым:

r
library(ggplot2)

df <- data.frame(
  x = rep(x, 2),
  y = c(y1, y2),
  group = rep(c("N(0,1)", "N(1,1)"), each = length(x))
)

ggplot(df, aes(x = x, y = y, colour = group)) +
  geom_line(size = 1) +
  labs(title = "Overlay of two normal PDFs",
       x = "x", y = "Density") +
  theme_minimal()

Рекомендация: SPS Anderson – How to plot multiple plots on the same graph in R описывает примеры с ggplot2 и базовым R.


Полезные подсказки и типичные ошибки

Ошибка Как исправить
plot() сразу после plot() без lines() Используйте lines() или par(new = TRUE)
Несоответствие диапазона осей Установите ylim в первом plot() и axes = FALSE во втором plot()
Отсутствие легенды Добавьте legend() после обеих линий
Переобозначение переменных Держите имена переменных понятными (y1, y2)
Необходимость в более гибком графике Перейдите к ggplot2

Заключение

  • Для простого наложения линий в базовом R используйте lines() после первого plot().
  • Если требуется изменить параметры графика, par(new = TRUE) позволяет рисовать поверх.
  • ggplot2 предоставляет более декларативный подход и удобную поддержку легенд и стилей.
  • Следуйте рекомендациям по диапазонам осей и добавлению легенд, чтобы график был информативным и читаемым.

Источники

  1. Statology – How to overlay plots in R
  2. GeeksforGeeks – How to overlay plots in R
  3. SPS Anderson – How to plot multiple plots on the same graph in R
Авторы
Проверено модерацией
Модерация