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)
我想在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)