2016-10-04 2 views
1

Я строю довольно интенсивный сюжет, но у меня есть основная проблема с geom_smooth, что я не могу найти ответы. Вот как теперь сюжет выглядит с geom_smooth(method = "lm"):Удалите пограничные линии с доверительным интервалом geom_smooth, используя ggplotly

enter image description here

Когда я строй geom_smooth() части моего участка, я хотел бы изменить цвет линии. Когда я делаю это, она привлекает новые линии, граничащие мой доверительный интервал,

Calling geom_smooth(method = "lm", color = "black") возвращает это:

enter image description here

Есть простой способ, чтобы избавиться от линии границы, но сохраните главную линию черный?

EDIT: Я не могу предоставить полный код с данными, но предоставил обстоятельства, которые будут воспроизводить здесь ошибку. Для ответа на этот вопрос вам потребуется не более того. По комментариям ниже, вероятно, это взаимодействие с сюжетным (ggplotly).

library(ggplot2) 
library(plotly) 
df <- data.frame(
    Demographic = rnorm(1:100), 
    Proficiency = rnorm(1:100), 
    N.Tested = rnorm(1:100) 
) 

a <- ggplot(data = df, 
     aes(x = Demographic, 
      y = Proficiency) 
) 
b <- a + geom_point(aes(
    text = "to be replaced", 
    color = N.Tested, 
    size = N.Tested 
), 
show.legend = FALSE) 
c <- b + scale_color_gradient2(low = "firebrick4", high = "gold", mid = "orange", midpoint=300) 
d <- c + geom_smooth(method = "lm", color="black") 

ggplotly(d) 
+2

Можете ли вы показать весь код для вашего участка (и, возможно, некоторые выборочные данные)? Я пытаюсь выяснить, откуда берутся границы, поскольку это не поведение по умолчанию. Например, это не создает границы вокруг доверительного интервала: 'ggplot (mtcars, aes (wt, mpg, color = hp)) + geom_point() + geom_smooth (method =" lm ", color =" black ")' , – eipi10

+0

Согласен с @ eipi10. нам нужно увидеть полный код + данные. Такое поведение кажется нечетным – dww

+0

Отличная точка, моя ошибка. Исправление ниже также не работало для меня, поэтому это должно быть что-то вне ggplot. Мое лучшее предположение теперь состоит в том, что это взаимодействие с 'ggplotly()'. Полный код включен в править выше. –

ответ

0

можно добавить только регрессионную линию через geom_smooth и добавьте ленту через geom_ribbon, используя stat = "smooth". Он добавляет дополнительный шаг, но разделение слоев позволяет вам раскрасить линию, не испортив ленту доверия.

d <- c + geom_smooth(method = "lm", se = FALSE, color = "black") 
e <- d + geom_ribbon(stat = "smooth", method = "lm", alpha = .15) 
ggplotly(e) 

enter image description here

+0

Это именно то, что я искал. Я знал, что есть способ отделить команды, просто не знал команд. Простой и элегантный, спасибо. –

1

ggplotly часто дает неожиданные результаты. Если конечный продукт, который вы хотите, представляет собой графический график, тогда обычно лучше перейти прямо к API-интерфейсу. Использование API-интерфейса plotly также дает доступ к гораздо более широкому диапазону опций, чем ggplotly.

К сожалению, однако, сюжет не имеет удобного встроенного в вычисление статистики, который предоставляет geom_smooth. Таким образом, мы начнем с вычисления нашей форме и ошибки диапазона с помощью lm() и predict.lm()

lm1 = lm(Proficiency~Demographic, data=df) 
lm.df = data.frame(Demographic = sort(df$Demographic), 
        Proficiency = predict(lm1)[order(df$Demographic)], 
        se = predict(lm1, se.fit = T)$se.fit[order(df$Demographic)]) 
lm.df$ymax = lm.df$Proficiency + lm.df$se 
lm.df$ymin = lm.df$Proficiency - lm.df$se 

Теперь мы готовы построить, используя plotly API непосредственно

plot_ly() %>% 
    add_trace(data=df, x=~Demographic, y=~Proficiency, type="scatter", mode="markers", 
      size=~N.Tested, color=~N.Tested, colors = c("#8B1A1A", "#FFA500"), showlegend=F) %>% 
    add_ribbons(data=lm.df, x=~Demographic, ymin = ~ymin, ymax = ~ymax, 
       line = list(color="transparent"), showlegend=F, 
       fillcolor = "#77777777") %>% 
    add_trace(data=lm.df, x=~Demographic, y=~Proficiency, 
      type="scatter", mode="lines", line=list(color="black"), showlegend=F) 

enter image description here

+0

Он может работать, если вы установите 'inherit.aes = F' для' geom_smooth' и отрегулируете эстетику x и y. – Gregor