在ggplotly线图中填充背景间隔
Fill background intervals in ggplotly line graph
我正在尝试填充 ggplot
折线图的背景以指示 day/night 个周期。 this answer works great, but I want to display them interactively using ggplotly
, and that becomes a problem because of this bug 中的方法,其中 ggplotly 不喜欢 -Inf 和 Inf 用作 geom_rect
的 y 限制。有谁知道适用于 ggplotly 的解决方法?
为了可读性,我在这里粘贴了其他答案的示例代码:
library(ggplot2)
dat <- data.frame(x = 1:100, y = cumsum(rnorm(100)))
#Breaks for background rectangles
rects <- data.frame(xstart = seq(0,80,20), xend = seq(20,100,20), col = letters[1:5])
p <- ggplot() +
geom_rect(data = rects, aes(xmin = xstart, xmax = xend, ymin = -Inf, ymax = Inf, fill = col), alpha = 0.4) +
geom_line(data = dat, aes(x,y))
p
产生这个可爱的图形:
但是,如果您这样做:
ggplotly(p)
您丢失了背景填充:
正如 juljo 在他的评论中提到的,问题是矩形 y-range。
解决这个问题:
先绘制数据
library(ggplot2)
library(plotly)
dat <- data.frame(x = 1:100, y = cumsum(rnorm(100)))
#Breaks for background rectangles
rects <- data.frame(xstart = seq(0,80,20), xend = seq(20,100,20), col = letters[1:5])
# Only plot the data
p <- ggplot() +
geom_line(data = dat, aes(x,y))
得到剧情的y-range
ylims = ggplot_build(p)$layout$panel_params[[1]]$y.range
使用y-range创建矩形并将它们添加到绘图
p = p +
geom_rect(data = rects, aes(xmin = xstart, xmax = xend, ymin = ylims[1], ymax = ylims[2], fill = col), alpha = 0.4)
p
:
ggplotly(p)
:
我正在尝试填充 ggplot
折线图的背景以指示 day/night 个周期。 this answer works great, but I want to display them interactively using ggplotly
, and that becomes a problem because of this bug 中的方法,其中 ggplotly 不喜欢 -Inf 和 Inf 用作 geom_rect
的 y 限制。有谁知道适用于 ggplotly 的解决方法?
为了可读性,我在这里粘贴了其他答案的示例代码:
library(ggplot2)
dat <- data.frame(x = 1:100, y = cumsum(rnorm(100)))
#Breaks for background rectangles
rects <- data.frame(xstart = seq(0,80,20), xend = seq(20,100,20), col = letters[1:5])
p <- ggplot() +
geom_rect(data = rects, aes(xmin = xstart, xmax = xend, ymin = -Inf, ymax = Inf, fill = col), alpha = 0.4) +
geom_line(data = dat, aes(x,y))
p
产生这个可爱的图形:
但是,如果您这样做:
ggplotly(p)
您丢失了背景填充:
正如 juljo 在他的评论中提到的,问题是矩形 y-range。
解决这个问题:
先绘制数据
library(ggplot2) library(plotly) dat <- data.frame(x = 1:100, y = cumsum(rnorm(100))) #Breaks for background rectangles rects <- data.frame(xstart = seq(0,80,20), xend = seq(20,100,20), col = letters[1:5]) # Only plot the data p <- ggplot() + geom_line(data = dat, aes(x,y))
得到剧情的y-range
ylims = ggplot_build(p)$layout$panel_params[[1]]$y.range
使用y-range创建矩形并将它们添加到绘图
p = p + geom_rect(data = rects, aes(xmin = xstart, xmax = xend, ymin = ylims[1], ymax = ylims[2], fill = col), alpha = 0.4)