ggplot2 geom_rect 在 facet_grid 下无法适当缩放
ggplot2 geom_rect not scale appropriately under facet_grid
问题是:geom_rect
使用 ggplot2 阻止了 facet_grid
的 缩放 。
我想知道是不是两个数据框冲突引起的,但不知道怎么解决。希望您能够帮助我。
示例代码如下:
library(ggplot2)
data_1 <- data.frame(x = c(seq(from = 1, to = 10, by = 1),
seq(from = 21, to = 50, by = 1)),
y = rnorm(40, mean = 3, sd = 1),
z = c(rep("A", 10), rep("B", 30)))
shade <-
data.frame(xmin = c(2, 6, 39),
xmax = c(3, 8, 43),
ymin = - Inf,
ymax = Inf)
如果不使用 geom_rect
,我可以像这样适当地使用 facet_grid
进行缩放:
ggplot(data = data_1, aes(x = x, y = y)) +
geom_bar(stat = "identity", fill = "blue") +
facet_grid(.~z, space = "free_x", scales = "free_x")
结果是这样的:
但是如果我画一些geom_rect
,那么之前显示的比例就消失了,代码和图表如下:
ggplot(data = data_1, aes(x = x, y = y)) +
geom_bar(stat = "identity", fill = "blue") +
geom_rect(data = shade, inherit.aes = FALSE,
mapping = aes(xmin = xmin,
xmax = xmax,
ymin = ymin, ymax = ymax),
fill = 'red', alpha = 0.2) +
facet_grid(.~z, space = "free_x", scales = "free_x")
如何在绘制这些 geom_rect
时保持 之前的 x 缩放?
非常感谢任何建议。
x 轴范围发生变化,因为 geom_rect
图层中的数据超出了原始绘图的范围。体重秤的表现完全符合预期。
如果您希望每个方面显示不同的矩形,在 shade
中包含方面变量会更清晰,并且只保留 xmin
/ xmax
的行在每个方面的范围内。例如:
library(dplyr)
shade2 <- shade %>%
# add facet-specific x-axis range information from data_1
tidyr::crossing(data_1 %>% group_by(z) %>%
summarise(x1 = min(x),
x2 = max(x)) %>%
ungroup) %>%
# filter for rects within each facet's x-axis range
group_by(z) %>%
filter(xmin >= x1 & xmax <= x2) %>%
ungroup()
> shade2
# A tibble: 3 x 7
xmin xmax ymin ymax z x1 x2
<dbl> <dbl> <dbl> <dbl> <fct> <dbl> <dbl>
1 2 3 -Inf Inf A 1 10
2 6 8 -Inf Inf A 1 10
3 39 43 -Inf Inf B 21 50
剧情:
ggplot(data = data_1, aes(x = x, y = y)) +
geom_col(fill = "blue") + # geom_col is equivalent to geom_bar(stat = "identity")
geom_rect(data = shade2, inherit.aes = FALSE,
mapping = aes(xmin = xmin, xmax = xmax,
ymin = ymin, ymax = ymax),
fill = 'red', alpha = 0.2) +
facet_grid(.~z, space = "free_x", scales = "free_x")
问题是:geom_rect
使用 ggplot2 阻止了 facet_grid
的 缩放 。
我想知道是不是两个数据框冲突引起的,但不知道怎么解决。希望您能够帮助我。
示例代码如下:
library(ggplot2)
data_1 <- data.frame(x = c(seq(from = 1, to = 10, by = 1),
seq(from = 21, to = 50, by = 1)),
y = rnorm(40, mean = 3, sd = 1),
z = c(rep("A", 10), rep("B", 30)))
shade <-
data.frame(xmin = c(2, 6, 39),
xmax = c(3, 8, 43),
ymin = - Inf,
ymax = Inf)
如果不使用 geom_rect
,我可以像这样适当地使用 facet_grid
进行缩放:
ggplot(data = data_1, aes(x = x, y = y)) +
geom_bar(stat = "identity", fill = "blue") +
facet_grid(.~z, space = "free_x", scales = "free_x")
结果是这样的:
但是如果我画一些geom_rect
,那么之前显示的比例就消失了,代码和图表如下:
ggplot(data = data_1, aes(x = x, y = y)) +
geom_bar(stat = "identity", fill = "blue") +
geom_rect(data = shade, inherit.aes = FALSE,
mapping = aes(xmin = xmin,
xmax = xmax,
ymin = ymin, ymax = ymax),
fill = 'red', alpha = 0.2) +
facet_grid(.~z, space = "free_x", scales = "free_x")
如何在绘制这些 geom_rect
时保持 之前的 x 缩放?
非常感谢任何建议。
x 轴范围发生变化,因为 geom_rect
图层中的数据超出了原始绘图的范围。体重秤的表现完全符合预期。
如果您希望每个方面显示不同的矩形,在 shade
中包含方面变量会更清晰,并且只保留 xmin
/ xmax
的行在每个方面的范围内。例如:
library(dplyr)
shade2 <- shade %>%
# add facet-specific x-axis range information from data_1
tidyr::crossing(data_1 %>% group_by(z) %>%
summarise(x1 = min(x),
x2 = max(x)) %>%
ungroup) %>%
# filter for rects within each facet's x-axis range
group_by(z) %>%
filter(xmin >= x1 & xmax <= x2) %>%
ungroup()
> shade2
# A tibble: 3 x 7
xmin xmax ymin ymax z x1 x2
<dbl> <dbl> <dbl> <dbl> <fct> <dbl> <dbl>
1 2 3 -Inf Inf A 1 10
2 6 8 -Inf Inf A 1 10
3 39 43 -Inf Inf B 21 50
剧情:
ggplot(data = data_1, aes(x = x, y = y)) +
geom_col(fill = "blue") + # geom_col is equivalent to geom_bar(stat = "identity")
geom_rect(data = shade2, inherit.aes = FALSE,
mapping = aes(xmin = xmin, xmax = xmax,
ymin = ymin, ymax = ymax),
fill = 'red', alpha = 0.2) +
facet_grid(.~z, space = "free_x", scales = "free_x")