将ggplot2转换为ggplotly时缺少geom_rect

Posted

技术标签:

【中文标题】将ggplot2转换为ggplotly时缺少geom_rect【英文标题】:geom_rect missing when converting ggplot2 to ggplotly 【发布时间】:2019-09-10 01:32:43 【问题描述】:

我正在尝试将具有三个元素(geom_pointgeom_linegeom_rect)的ggplotly 图表放在一起,它在ggplot2 中看起来很好。但是,当我转换为 ggplotly 时, geom_rect 消失了。我认为这与 inherit.aes 函数有关?

构建测试数据的代码如下。

library(ggplot2)
library(plotly)

dates_seq = seq.Date(as.Date("2019-03-13"), as.Date("2019-04-21"), by = "1 day")
df = data.frame(ds = dates_seq,
                y = rnorm(length(dates_seq), mean = 50, sd = 5),
                yhat = rnorm(length(dates_seq), mean = 50, sd = 5)
                )
df$yhat_lower = df$yhat - 5
df$yhat_upper = df$yhat + 5

gg <- ggplot(df, aes(x = ds, y = y)) +
    labs(x = 'Date', y = 'Sales') +
      geom_ribbon(aes(ymin = yhat_lower, ymax = yhat_upper), fill = 'blue',
                  alpha = 0.2,
                  na.rm = TRUE)

start_date = as.Date("2019-04-19")
gg <- gg +
  geom_point(na.rm=TRUE) +
  geom_vline(xintercept = as.numeric(as.Date(start_date - lubridate::days(1))), linetype = 2, color = "black") +
  geom_line(aes(y = yhat), color = 'blue',
            na.rm = TRUE) +
  theme_classic()

promo_df = data.frame(xmin = c("2019-03-15", "2019-04-01"), xmax = c("2019-03-18", "2019-04-08"),
                          ymin = -Inf, ymax = Inf, Promo = "Yes")
promo_df$id = 1:nrow(promo_df)
gg = gg +
  geom_rect(data=promo_df, inherit.aes=FALSE,
            aes(xmin=as.Date(xmin),
                xmax=as.Date(xmax),
                ymin=ymin,ymax=ymax,
                group=id, fill = factor(Promo)), alpha=0.2) +
  scale_fill_discrete(name = "On Promo?")

ggplot 图像使用geom_rect 显示所需的输出。

gg

现在是 ggplotly 版本:

ggplotly(gg)

有没有办法让ggplotly 图像看起来像基本的ggplot2 图表?

【问题讨论】:

我刚刚遇到了同样的问题 - 它似乎源于ggplotly 不支持ymin = -Infymax = Inf 的事实。我还没有找到解决方法,但如果我这样做了,我会发布答案! 谢谢@Clara!我也会这样做 【参考方案1】:

关于 ggplotly 无法支持 ymin/max 参数,Clara 是正确的。最好的解决方法是手动将参数设置为与上一个(主)图层的比例相等。所以在这种情况下,它将等于 0/65。

【讨论】:

以上是关于将ggplot2转换为ggplotly时缺少geom_rect的主要内容,如果未能解决你的问题,请参考以下文章

ggplot2:使用填充geom_bar指定颜色时缺少图例

为线条 ggplot2 分配颜色

Adobe Illustrator中的ggplot2 pdf导入缺少字体AdobePiStd

使用 `scale_colour_manual` 或替代方法(有时)缺少因子水平时,`ggplot2` 中的一致着色

ggplot2 堆叠直方图 - 转换为密度图

如何将数据框列名从字符串转换为适合(qplot,ggplot2)的参数?