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

4
我正在尝试使用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

图片应该看起来像这样,几乎完全符合我的想法:

enter image description here

然而,当我尝试添加ggplotly代码以获得工具提示功能时,它会变成这样:
ggplotly(p)

enter image description here

每个点的整个颜色方案都消失了。我该如何更改才能使ggplot图像和ggplotly图像保持相同的颜色比例尺?

1
可能与这个开放的错误报告有关。 - Anonymous coward
1个回答

2
如上面链接的公开漏洞报告中所述,geom_pointfill 美学映射不正确,而 color 则可以正常工作。根据漏洞报告,该问题在软件包的 dev 版本中已解决,但如果您无法轻松获得该版本(我也是),则以下方法可以解决问题,至少在我的端上可以:
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. 这里使用 color 而不是 fill 来绘制 geom_point,这样做很好。

  2. 线条是在单独的 geom_line 层中绘制的,它们的颜色直接指定在 aes() 外部。

  3. 线条的线型在 aes() 内部映射,以强制为每个筛选值创建图例,而在 scale_linetype_manual 中指定的实际映射设置两条线都为实线。

ggplotly result


那对我也起作用了!感谢@Z.Lin的解释! - Agrosel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接