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

时间:2016-12-21 17:15:17

标签: r ggplot2 plotly

我想在plotly中制作折线图,使其整个长度的颜色不同。颜色是连续的比例。在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)

我也没有找到一种方法直接在剧情中做到这一点。也许根本没有解决方案。有什么想法吗?

1 个答案:

答案 0 :(得分: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&#39; s(现已删除)评论,如果您想将线条颜色映射到连续变量,我认为让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),因此可能会出现您需要的情况在每个(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)

enter image description here