Как наложить две функции плотности в R
Научитесь рисовать две нормальные функции плотности на одном графике в R, используя lines(), par(new = TRUE) или ggplot2 для чистого наложения и добавления легенд.
Как можно нарисовать две функции плотности вероятности на одном графике в 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).
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)
Содержание
- Как добавить вторую линию после первой
- Использование
par(new = TRUE) - Почему
plot()перезаписывает график - Альтернативы:
ggplot2 - Полезные подсказки и типичные ошибки
Как добавить вторую линию после первой
В базовом R plot() всегда открывает новый график, поэтому при каждом вызове создаётся новый рисунок.
После того как вы нарисовали первую кривую, можно добавить вторую с помощью lines() (или points()).
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 не очищать текущий рисунок, а просто рисовать поверх него.
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 делает наложение графиков простым и читаемым:
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предоставляет более декларативный подход и удобную поддержку легенд и стилей.- Следуйте рекомендациям по диапазонам осей и добавлению легенд, чтобы график был информативным и читаемым.