Определение наклона нескольких линий в одном графике geom_point в ggplot2 - PullRequest
0 голосов
/ 08 января 2019

Столбцы и первые строки кода У меня есть несколько разных geom_smooth(method="glm") линий на одном графике geom_point в ggplot2. Я ищу, чтобы определить уравнение регрессии для каждой линии, включая уравнение наклона. Я нашел аналогичный пост , но у меня все еще есть некоторые проблемы. Мой код:

native <- read.csv("native.gather.C4C5C6C7.csv")

ggplot(native, aes(x=YearsPostRelease, y=PercentNative, col=FieldType, linetype=FieldType)) + 
    geom_point(size=0.7) + 
    geom_smooth(data = native, 
                method ="glm", alpha = 0, show.legend = FALSE, linetype = 'solid') +
    scale_x_continuous(breaks = c(0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55)) +
    scale_y_continuous(limits = c(0, 100), 
                       breaks = c(0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100)) + 
    ggtitle("Percent Native Through Time")

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Применяя то, что Джон внес выше, вы можете настроить эту функцию для ваших данных следующим образом.

Опять же, трудно полностью понять, как выглядят ваши базовые данные, но давайте предположим, что ваше поле, FieldType , содержит три фактора: BSSFields, CSSFields, DSSFields.

# Load data
library(tidyverse)
native <- read.csv("native.gather.C4C5C6C7.csv")

# Define function
lm_eqn <- function(df){
  m <- lm(PercentNative ~ YearsPostRelease, df);
  eq <- substitute(italic(native) == a + b %.% 
italic(YearsPostRelease)*","~~italic(r)^2~"="~r2, 
                   list(a = format(coef(m)[1], digits = 2), 
                        b = format(coef(m)[2], digits = 2), 
                        r2 = format(summary(m)$r.squared, digits = 3)))
  as.character(as.expression(eq));                 
}

# Plot data
ggplot(native, aes(x = YearsPostRelease, 
                   y = PercentNative, 
                   col = FieldType, 
                   linetype = FieldType)) +
  geom_point(size=0.7) + 
  geom_smooth(data = native, 
              method ="glm", alpha = 0, show.legend = FALSE, linetype = 'solid') +
  scale_x_continuous(breaks = c(0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55)) +
  scale_y_continuous(limits = c(0, 100), 
                     breaks = c(0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100)) + 
  annotate("text", x = 3, y = 30, 
           label = lm_eqn(native %>% filter(FieldType == "BSSFields")), parse = TRUE) +
  annotate("text", x = 4, y = 20, 
           label = lm_eqn(native %>% filter(FieldType == "CSSFields")), parse = TRUE) +
  annotate("text", x = 5, y = 10, 
           label = lm_eqn(native %>% filter(FieldType == "DSSFields")), parse = TRUE)
  ggtitle("Percent Native Through Time")

Важно отметить, что расположение этих уравнений регрессии будет изменено в зависимости от диапазона YearsPostRelease и PercentNative . Кроме того, если FieldTypes содержит более трех уровней, вам придется добавить соответствующие вызовы annotate(), настроенные для имени уровня.

0 голосов
/ 08 января 2019

Вот подход, использующий lm_eqn как определено здесь . Возможно, у вас возникли проблемы, потому что ваши данные не соответствуют ожидаемому вводу функции. Я использовал mtcars здесь, так как у меня нет ваших данных, исследуя отношения между mpg и wt между cyl группами. Ниже обратите внимание на настройку отношений, которые я расследую.

lm_eqn <- function(df){
  m <- lm(mpg ~ wt, df);
  eq <- substitute(italic(mpg) == a + b %.% italic(wt)*","~~italic(r)^2~"="~r2, 
                   list(a = format(coef(m)[1], digits = 2), 
                        b = format(coef(m)[2], digits = 2), 
                        r2 = format(summary(m)$r.squared, digits = 3)))
  as.character(as.expression(eq));                 
}

Мы можем применить это к определенным вручную подмножествам данных. Вероятно, есть более разумный способ применить это к нескольким группам более автоматически, но, поскольку сложно автоматизировать размещение смарт-меток, этого может быть достаточно.

library(ggplot2); library(dplyr)
ggplot(mtcars, aes(x=wt, y=mpg, 
                   col=as.factor(cyl), linetype=as.factor(cyl))) + 
  geom_point() + 
  geom_smooth(data = mtcars, 
              method ="glm", alpha = 0, show.legend = FALSE, linetype = 'solid') +
  annotate("text", x = 3, y = 30, label = lm_eqn(mtcars %>% filter(cyl == 4)), parse = TRUE) +
  annotate("text", x = 4.3, y = 20, label = lm_eqn(mtcars %>% filter(cyl == 6)), parse = TRUE) +
  annotate("text", x = 4, y = 12, label = lm_eqn(mtcars %>% filter(cyl == 8)), parse = TRUE)

enter image description here

...