我想在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
中表现得很奇怪。
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)
我也没有找到一种方法直接在剧情中做到这一点。也许根本没有解决方案。有什么想法吗?
答案 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
ggplotly(gg2)
关于@ 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
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)