ggplot2 填充未正确转换 ggplotly 颜色映射

ggplot2 fill not converting ggplotly color mapping correctly

我正在尝试使用 ggplotly() 转换 ggplot2 图像,但转换不正确。我的 ggplot 图像始终包含两行,geom_line 分量有一个颜色变量,geom_point 分量有一个填充变量。

这是我的基本 ggplot 部分的代码:

test_data1 = data.frame(
  filter = "Filter 1",
  time = seq(as.Date("2017-01-01"), as.Date("2017-03-01"), "days"),
  ovr_perc = rnorm(n = 60, mean = 8, sd = 2),
  neg_perc = rnorm(n = 60, mean = 6, sd = 2),
  count = sample(50:250,60,replace=T)
)

test_data2 = data.frame(
  filter = "Filter 2",
  time = seq(as.Date("2017-01-01"), as.Date("2017-03-01"), "days"),
  ovr_perc = rnorm(n = 60, mean = 20, sd = 6),
  neg_perc = rnorm(n = 60, mean = 6, sd = 2),
  count = sample(50:250,60,replace=T)
)

test_data = rbind(test_data1, test_data2)

p = ggplot(test_data, aes(x=time, y=ovr_perc, group = factor(filter)))  +
  geom_line(aes(color=factor(filter))) +
  geom_point(aes(fill=neg_perc, size = count), shape=21) +
  scale_fill_gradient2(low = "darkgreen", mid = "yellow", high = "red1", 
                       midpoint = 5, limits = c(0, 10), oob = squish) +
  scale_colour_manual(values = c("pink", "green")) +
  theme_classic() 
p

图像应该看起来像这样,这几乎正是我想要的样子:

但是,当我尝试添加 ggplotly 代码以获得工具提示功能时,它变成了:

ggplotly(p)

每个点的整个配色方案都消失了。我怎样才能改变它,使它从 ggplot 图像到 ggplotly 图像保持相同的色阶?

如上面链接的开放错误报告中所述,geom_pointfill 的美学映射无法正常工作,而 color 可以正常工作。根据错误报告,问题在包的开发版本中消失了,但如果您无法轻松访问它(我也没有),以下工作,至少在我这边:

library(dplyr)
library(plotly)

p2 <- ggplot(test_data, aes(x=time, y=ovr_perc, linetype = filter))  +
  geom_line(data = . %>% filter(filter == "Filter 1"),
            colour = "pink") +
  geom_line(data = . %>% filter(filter == "Filter 2"),
            colour = "green") +
  geom_point(aes(color = neg_perc, size = count)) +
  scale_color_gradient2(low = "darkgreen", mid = "yellow", high = "red1", 
                       midpoint = 5, limits = c(0, 10), oob = squish) +
  scale_linetype_manual(values = c("solid", "solid"),
                        guide = guide_legend(override.aes = list(
                          color = c("pink", "green")
                        ))) +
  theme_classic(); p2

ggplotly(p2)

解释:

  1. 这对 geom_point 使用 color 而不是 fill,效果很好。

  2. 线条绘制在单独的 geom_line 图层中,颜色直接指定在 aes().

  3. 之外
  4. 线的线型映射在 aes() 内,以强制为每个过滤器值创建图例,而 scale_linetype_manual 中指定的实际映射将两条线设置为扎实。