2016-12-21 2 views
4

Я хочу сделать линейную диаграмму в plotly, чтобы она не имела одного цвета по всей длине. Цвет получает непрерывный масштаб. Это легко в ggplot2, но когда я переводю его на plotly, используя функцию ggplotly, цвет определения переменной ведет себя как категориальная переменная.Различное поведение между ggplot2 и plotly с использованием ggplotly

require(dplyr) 
require(ggplot2) 
require(plotly) 

df <- data_frame(
    x = 1:15, 
    group = rep(c(1,2,1), each = 5), 
    y = 1:15 + group 
) 

gg <- ggplot(df) + 
    aes(x, y, col = group) + 
    geom_line() 

gg   # ggplot2 
ggplotly(gg) # plotly 

ggplot2 (по желанию): enter image description here plotly: enter image description here

Я нашел один обходной, что, с другой стороны, ведет себя странно в ggplot2.

df2 <- df %>% 
    tidyr::crossing(col = unique(.$group)) %>% 
    mutate(y = ifelse(group == col, y, NA)) %>% 
    arrange(col) 

gg2 <- ggplot(df2) + 
    aes(x, y, col = col) + 
    geom_line() 

gg2 
ggplotly(gg2) 

Я также не нашел способ, как это сделать прямо в plotly. Может быть, нет никакого решения. Есть идеи?

ответ

3

Похоже, что ggplotly обрабатывает group как фактор, хотя он численный. Вы можете использовать geom_segment в качестве обходного пути для того, чтобы сегменты рисуются между каждой парой точек:

gg2 = ggplot(df, aes(x,y,colour=group)) + 
    geom_segment(aes(x=x, xend=lead(x), y=y, yend=lead(y))) 

gg2 

enter image description here

ggplotly(gg2) 

enter image description here

Что касается @ RAWR (ныне удален) комментарий, я думаю, было бы целесообразно, чтобы group был непрерывным, если вы хотите сопоставить цвет линии непрерывной переменной. Ниже приведен пример примера OP для столбца group, который является непрерывным, а не имеет только две дискретные категории.

set.seed(49) 
df3 <- data_frame(
    x = 1:50, 
    group = cumsum(rnorm(50)), 
    y = 1:50 + group 
) 

Участок gg3 ниже использует geom_line, но я также включил geom_point. Вы можете видеть, что ggplotly рисует точки. Однако линий нет, потому что никакие две точки не имеют одинакового значения group. Если бы мы не включили geom_point, график был бы пустым.

gg3 <- ggplot(df3, aes(x, y, colour = group)) + 
    geom_point() + geom_line() + 
    scale_colour_gradient2(low="red",mid="yellow",high="blue") 

gg3 

enter image description here

ggplotly(gg3) 

enter image description here

Переключение geom_segment дает нам линии, которые мы хотим с ggplotly. Однако обратите внимание, что цвет линии будет основываться на значении group в первой точке сегмента (независимо от того, используете ли он geom_line или geom_segment), поэтому могут быть случаи, когда вы хотите интерполировать значение group между каждым (x, y) пара для того, чтобы получить более гладкие градации цвета:

gg4 <- ggplot(df3, aes(x, y, colour = group)) + 
    geom_segment(aes(x=x, xend=lead(x), y=y, yend=lead(y))) + 
    scale_colour_gradient2(low="red",mid="yellow",high="blue") 

ggplotly(gg4) 

enter image description here

+0

это исчерпывающий! большое спасибо –

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