Есть ли способ использовать R, чтобы разбить ось графика и разорвать линию линейной регрессии? - PullRequest
2 голосов
/ 07 февраля 2020

Я пытаюсь выяснить, как изменить точечную диаграмму, которая содержит две группы данных вдоль континуума, разделенных большим промежутком. Графику нужен разрыв по оси x, а также по линии регрессии.

Этот код R, использующий библиотеку ggplot2, точно представляет данные, но неприглядный из-за огромного количества свободного места на графике , Корреляция Пирсона -0,1380438.

library(ggplot2)
p <- ggplot(, aes(x = dis, y = result[, 1])) + geom_point(shape = 1) +
  xlab("X-axis") +
  ylab("Y-axis") + geom_smooth(color = "red", method = "lm", se = F) + theme_classic()
p + theme(plot.title = element_text(hjust = 0.5, size = 14))

enter image description here

Этот R-код использует gap.plot для получения необходимых разрывов, но линия регрессии не содержит разрыв и не отражает наклон правильно. Как видите, наклон линии регрессии не такой резкий, как на приведенном выше графике, и должно быть видимое различие в наклоне линии между этими разрозненными группами.

library(plotrix)
gap.plot(
  x = dis,
  y = result[, 1],
  gap = c(700, 4700),
  gap.axis = "x",
  xlab = "X-Axis",
  ylab = "Y-Axis",
  xtics = seq(0, 5575, by = 200)
)
abline(v = seq(700, 733) , col = "white") 
abline(lm(result[, 1] ~ dis), col = "red", lwd = 2)
axis.break(1, 716, style = "slash")               

enter image description here

Используя MS Paint, я создал приближение того, как должен выглядеть график . Обратите внимание на отметки разрыва сверху и разрыв между линиями регрессии между двумя группами.

enter image description here

1 Ответ

3 голосов
/ 07 февраля 2020

Одним из решений является построение линии регрессии из двух частей, используя ablineclip, чтобы ограничить то, что строится каждый раз. (По аналогии с предложением @ tung, хотя очевидно, что вы хотите, чтобы внешний вид одного графика, а не фасет). Вот как это будет работать:

library(plotrix)

# Simulate some data that looks roughly like the original graph.
dis = c(rnorm(100, 300, 50), rnorm(100, 5000, 100))
result = c(rnorm(100, 0.6, 0.1), rnorm(100, 0.5, 0.1))

# Store the location of the gap so we can refer to it later.
x.axis.gap = c(700, 4700)

# gap.plot() works internally by shifting the location of the points to be
# plotted based on the gap size/location, and then adjusting the axis labels
# accordingly.  We'll re-compute the second half of the regression line in the
# same way; these are the new values for the x-axis.
dis.alt = dis - x.axis.gap[1]

# Plot (same as before).
gap.plot(
  x = dis,
  y = result,
  gap = x.axis.gap,
  gap.axis = "x",
  xlab = "X-Axis",
  ylab = "Y-Axis",
  xtics = seq(0, 5575, by = 200)
)
abline(v = seq(700, 733), col = "white")
axis.break(1, 716, style = "slash")

# Add regression line in two pieces: from 0 to the start of the gap, and from
# the end of the gap to infinity.
ablineclip(lm(result ~ dis), col = "red", lwd = 2, x2 = x.axis.gap[1])
ablineclip(lm(result ~ dis.alt), col = "red", lwd = 2, x1 = x.axis.gap[1] + 33)

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...