ggplot2 和 plotly 使用 ggplotly 之间的不同行为

Different behavior between ggplot2 and plotly using ggplotly

我想在plotly中制作一个折线图,这样它的整个长度就不会有相同的颜色。颜色被赋予连续的比例。在 ggplot2 中很容易,但是当我使用 ggplotly 函数将其转换为 plotly 时,确定颜色的变量表现得像分类变量。

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(期望): 剧情:

我找到了一个解决方法,另一方面,它在 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 中执行此操作的方法。也许根本就没有解决办法。有什么想法吗?

看起来 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

ggplotly(gg2)

关于@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

ggplotly(gg3)

切换到 geom_segment 可以得到我们想要的 ggplotly 行。但是请注意,线条颜色将基于段中第一个点的 group 的值(无论是使用 geom_line 还是 geom_segment),因此在某些情况下您可能需要在每个 (x,y) 对之间插入 group 的值以获得更平滑的色阶:

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)