2017-01-13 3 views
0

Выполняю регрессию с reg <- lm(...) и получаю некоторые коэффициенты, с которыми я могу получить доступ с reg$coefficients.Коэффициенты регрессии печати по графику (ggplot)

Это тип Named num и содержит все коэффициенты с их значениями.

Named num [1:11] 505.085 -0.251 -0.286 -0.22 -0.801 ... 
- attr(*, "names")= chr [1:11] "(Intercept)" "year" "monthDez" "monthFeb" ... 

Я хочу показать их на моем графике, созданном с помощью ggplot. Мой текущий подход заключается в использовании субтитров для этого:

labs(subtitle=paste(toString(names(reg$coefficients)), "\n", 
    paste(reg$coefficients, collapse = "   "))) 

Но это не правильно выровнены (имя непосредственно над значением и т.д.) Имеет кто-то идея?

Мой текущий сюжет выглядит следующим образом:

base <- ggplot(deliveries, aes(Date)) + 
    geom_line(aes(y = SalesVolume, colour = "SalesVolume"))+ 
    ggtitle("Sales Volume By Time") + 
    xlab("Time") + 
    ylab("Sales Volume") + 
    labs(subtitle=paste(toString(names(reg$coefficients)), "\n", paste(reg$coefficients, collapse = "   "))) 

print(base + scale_x_date(labels = date_format("%b %y"), breaks =  date_breaks("2 months"))) 

В этом графике отображается прогноз, поэтому я хочу, чтобы увидеть коэффициенты регрессии там.

+0

Я с трудом предусматривающую, что ваши потребности без кода, чтобы построить образец графа. – Benjamin

+0

@Benjamin: Я добавил короткую версию моего графика, суть в том, что мне нужно что-то вроде маленькой таблицы/легенды рядом с графиком с коэффициентами регрессии (но может быть потенциально любым другим именем num). – ScientiaEtVeritas

+0

Хорошим решением является использование 'ggpmisc', как описано в [этом ответе] (http://stackoverflow.com/a/35140066/3184024) – wici

ответ

1

Будет ли это работать, чтобы сделать два отдельных участка и разместить их на сетке?

library(ggplot2) 
library(broom) 
library(dplyr) 
library(tidyr) 

data_plot <- 
    ggplot(data = mtcars, 
     mapping = aes(x = qsec, 
         y = mpg, 
         colour = factor(gear))) + 
    geom_point() 

fit <- lm(mpg ~ qsec + wt + factor(gear), 
      data = mtcars) 

# Make a data frame with the contents of the model. 
reg_data <- 
    tidy(fit) %>% 
    mutate(y = nrow(.):1 - 1) %>% 
    gather(estimate, value, 
     estimate:p.value) %>% 
    mutate(estimate = factor(estimate, 
          c("term", "estimate", "std.error", 
          "statistic", "p.value"))) 

# Make a plot displaying the table. 
reg_plot <- 
    ggplot(data = reg_data, 
     mapping = aes(x = estimate, 
         y = y)) + 
    geom_text(mapping = aes(label = round(value, 2))) + 
    scale_y_continuous(breaks = unique(reg_data[["y"]]), 
        labels = unique(reg_data[["term"]])) + 
    scale_x_discrete(position = "top") + 
    xlab("") + 
    ylab("") + 
    theme(panel.grid.major = element_blank(), 
     panel.grid.minor = element_blank(), 
     panel.background = element_blank(), 
     axis.line = element_blank()) 

# Arrange the two plots 
gridExtra::grid.arrange(data_plot + theme(plot.margin = grid::unit(c(1,1,0,.5), "lines")), 
         reg_plot + theme(plot.margin = grid::unit(c(0,0,1,0), "lines")), 
         clip = FALSE, 
         nrow = 2, 
         ncol = 1, 
         heights = grid::unit(c(.70, .5), 
              c("null", "null"))) 
1

В моем ограниченном опыте ggplot2, аннотирование() может быть использован для добавления аннотаций к сюжету созданного с ggplot(), но я не уверен, что если ниже код работает для того, что вы хотите

reg <- lm(data = mtcars, mpg ~ wt) 

pred <- predict(reg) 

newdata <- data.frame(mtcars, pred) 

par <- summary(reg)$coefficients[,1] # extract model parameters 

par.f <- format(par, digits = 2)  # set the decimal digits of parameters 

ggplot(mtcars, aes(x = wt, y = mpg)) + 

    geom_point() + 

    geom_line(data = newdata, aes(x = wt, y = pred)) + 

    annotate("text", x = c(2, 2.5), y = 18, label = names(reg$coefficients)) + 

    annotate("text", x = c(2, 2.5), y = 16.5, label = par.f) # make them aligned by set x and y in annotate() 

enter image description here

+0

Хорошая идея, спасибо :) Но я не знаю диапазон x -значения и значения y (по крайней мере, фиксировать их). Кроме того, значения x являются значениями даты. – ScientiaEtVeritas

Смежные вопросы