ggplotly с группировкой geom_ribbon - PullRequest
0 голосов
/ 12 февраля 2019

У меня возникли проблемы с преобразованием ggplot в сюжетный объект и сохранением тех же атрибутов легенды.Что я хочу:

  • Для сгруппированных рядов: одна линия для подгонки и блеклая область для ленты одного цвета с прозрачностью
  • Нет линий на краю ленты
  • Сгруппированные легенды для линий, точек и лент

Вот код, показывающий 2 подхода, которые я пробовал, основываясь на этом ответе: ggplot: удаление линий на краях ленты

Оба имеют нежелательный эффект, как вы можете видеть во время работы.Любые предложения будут великолепны:)

library(plotly)
library(ggplot2)
# fake data
set.seed(1)
dt <- data.frame(x=rep(1:7,2), group=rep(letters[1:2], each=7), value=runif(14))
dt$lwr <- dt$value*.9
dt$upr <- dt$value*1.1

# build plot in ggplot, don't want lines at the edge
pl <- ggplot(data=dt, aes(y=value, x=x, group=group, colour=group,
                          fill=group)) +
  geom_point() +
  geom_line() +
  geom_ribbon(aes(ymin=lwr, ymax=upr), alpha=.3, linetype=0) +
  theme_minimal()

# looks ok, no lines at the edges
pl

# lines at edges, single group
ggplotly(pl)

# alternative: try reverting colour to NA
pl2 <- ggplot(data=dt, aes(y=value, x=x, group=group, colour=group,
                          fill=group)) +
  geom_point() +
  geom_line() +
  geom_ribbon(aes(ymin=lwr, ymax=upr), alpha=.3, colour=NA) +
  theme_minimal()

# looks ok
pl2

# no lines, but now not grouped, and some weird naming
ggplotly(pl2)

Спасибо, Джонни

РЕДАКТИРОВАТЬ: дополнение к принятому ответу, в функциональной форме

# dd: ggplotly object
library(stringi)
library(rvest)
remove_ggplotly_ribbon_lines <- function(dd){
  find <- rvest::pluck(dd$x$data, "fillcolor")
  w <- which(!sapply(find, is.null))
  for(i in w){
    dd$x$data[[i]]$line$color <- 
      stringi::stri_replace_all_regex(dd$x$data[[i]]$line$color, ",[\\d.]*\\)$", ",0.0)")
  }
  return(dd)
}
remove_ggplotly_ribbon_lines(ggplotly(pl))

1 Ответ

0 голосов
/ 12 февраля 2019

Привет, это больше комментарий, чем ответ, но я не имею права оставлять комментарии.

Если вы исследуете объект ggplotly, вы увидите, что это на самом деле просто список.Изменение правильных элементов списка помогает управлять параметрами графика.

Приведенное ниже решение просто меняет альфа линий на краях ленты.Надеюсь, это поможет

library(plotly)

set.seed(1)
dt <- data.frame(x=rep(1:7,2), group=rep(letters[1:2], each=7), value=runif(14))
dt$lwr <- dt$value*.9
dt$upr <- dt$value*1.1

# build plot in ggplot, don't want lines at the edge
pl <- ggplot(data=dt, aes(y=value, x=x, group=group, colour=group,
                      fill=group)) +
geom_point() +
geom_line() +
geom_ribbon(aes(ymin=lwr, ymax=upr), alpha=.3, linetype=0) +
theme_minimal()

# looks ok, no lines at the edges
pl

# no lines at edges
dd = ggplotly(pl)
dd$x$data[[3]]$line$color = "rgba(248,118,109,0.0)"
dd$x$data[[4]]$line$color = "rgba(0,191,196,0.0)"
dd

enter image description here

...