繁体   English   中英

ggplot将构面放置在两行构面之间

[英]ggplot place facet between two rows of facets

我有9个地块,每个地块有3个时间序列,其中一个地块仅包含一条曲线,这是参考地块,我希望将其放置在包含其他8个地块的两行之间。 有一个简单的方法吗? 我使用facet_wrap(~density,nrow=2)但我得到一行5行,另一行4行。 我确定其他人有这个问题,是否有一种简单的方法来组织此参考图的位置,还是我必须创建两个单独的图并将它们叠加? 否则,我可能不得不在所有其他图中移动该参考图,但是这似乎是多余的信息。

这是我目前的结果,但是如您所见,它的布局不是很好。 在此处输入图片说明

您要查找的图形可以使用gridExtra包中的gridArrange生成。 这是一个使用dplyrstorms数据集的示例

library(ggplot2)
library(gridExtra)
library(dplyr)
data(storms, package = 'dplyr')
str(storms)

## Classes 'tbl_df', 'tbl' and 'data.frame':    10010 obs. of  13 variables:
##  $ name       : chr  "Amy" "Amy" "Amy" "Amy" ...
##  $ year       : num  1975 1975 1975 1975 1975 ...
##  $ month      : num  6 6 6 6 6 6 6 6 6 6 ...
##  $ day        : int  27 27 27 27 28 28 28 28 29 29 ...
##  $ hour       : num  0 6 12 18 0 6 12 18 0 6 ...
##  $ lat        : num  27.5 28.5 29.5 30.5 31.5 32.4 33.3 34 34.4 34 ...
##  $ long       : num  -79 -79 -79 -79 -78.8 -78.7 -78 -77 -75.8 -74.8 ...
##  $ status     : chr  "tropical depression" "tropical depression" "tropical depression" "tropical depression" ...
##  $ category   : Ord.factor w/ 7 levels "-1"<"0"<"1"<"2"<..: 1 1 1 1 1 1 1 1 2 2 ...
##  $ wind       : int  25 25 25 25 25 25 25 30 35 40 ...
##  $ pressure   : int  1013 1013 1013 1013 1012 1012 1011 1006 1004 1002 ...
##  $ ts_diameter: num  NA NA NA NA NA NA NA NA NA NA ...
##  $ hu_diameter: num  NA NA NA NA NA NA NA NA NA NA ...

让我们创建两个图形。 第一个图形将仅是category == -1风暴(这是您问题中的对照组)的形式。 第二个图形将是category > -1风暴的人为图形

首先,我们将为图形构建通用的ggplot对象。

graphic <-
  ggplot() + 
  aes(x = long, y = lat, color = category) +
  geom_point() +
  facet_wrap( ~ category) +
  scale_color_hue(breaks = levels(storms$category),
                  labels = levels(storms$category),
                  drop = FALSE)

接下来,我们根据需要构建两个图形。

g1 <- graphic %+% dplyr::filter(storms, category == -1) + theme(legend.position = "none")
g2 <- graphic %+% dplyr::filter(storms, category != -1)

gridExtra::grid.arrange可以采用布局矩阵,其中数字1和2表示传递给该函数的第一张和第二张图形。 (顺便说一下,这不仅适用于两个图形。)通过在矩阵中重复1和2的值,我们可以控制图形设备中两个图形的相对大小。

gridExtra::grid.arrange(g1, g2,
                        layout_matrix = 
                          matrix(c(1, 1, 1, 2, 2, 2, 2, 2,
                                   1, 1, 1, 2, 2, 2, 2, 2,
                                   1, 1, 1, 2, 2, 2, 2, 2),
                                 byrow = TRUE, nrow = 3) 
                        )

在此处输入图片说明

如果我正确理解了这个问题,则可以使用适当的构面变量重新格式化数据,以引入新的参考面板行

library(ggplot2)

d <- data.frame(x=rep(1:10, 8), y = rnorm(80), 
                f=gl(8,10, ordered = TRUE))
d$f1 <- factor(d$f <= 4, labels=c(1,3))
d$f2 <- as.numeric(d$f) %% 4

d2 <- data.frame(x=1:10, y=0, f1 = 2)

ggplot(d, aes(x,y)) + 
  geom_point(aes(colour=f)) + 
  geom_point(data=d2, colour="black") + 
  facet_grid(f1~f2)

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM