将第二个图放置在 ggplot2 中另一个图的 x 轴上

问题描述 投票:0回答:2

我正在尝试创建一个堆叠条形图,其中一个条形图比其他条形图短得多。为了使小条更容易理解,我尝试添加较小条的“放大”图,但我无法让它与我的条对齐,因为我的 Y 轴是分类的,我不知道如何我可以将第二个图放置在轴和图之间的空间中。第二个图必须位于/开始“X 轴”以完美对齐两个条 我需要将第二个图进一步向下移动,但我不知道如何

这是我的问题的示例代码。

library(ggplot2)
library(dplyr)
Depth <- c("10-20m","10-20m","10-20m","20-40m","20-40m","20-40m","30-60m","30-60m","30-60m")
Animal <- c("Fish", "Turtle", "Shark", "Fish", "Turtle", "Shark", "Fish", "Turtle", "Shark")
Abundance <- c(10,20, 15, 500, 500, 500, 1000, 1000, 1000)
BigPlotdata <- data.frame(Depth, Animal, Abundance)






Bigplot <- ggplot(BigPlotdata, aes(fill = Animal, x = Abundance, y = Depth))+
  geom_bar(position = "stack" , stat = "identity")


Zoomed <- filter(BigPlotdata, Depth == "10-20m")
ZoomIn <- ggplot(Zoomed, aes(fill = Animal, x = Abundance, y = Depth)) +
  geom_bar(position = "stack", stat= "identity")+
  theme(legend.position = "none",
        axis.title.y = element_blank(),
        axis.text.y=element_blank(),
        axis.ticks.y=element_blank(),
        axis.title.x = element_blank())

PlotwithZoom <- Bigplot + annotation_custom(ggplotGrob(ZoomIn), xmin = 500, xmax = 3000, ymin = "10-20m" , ymax = "20-40m")

我通过

annotations_custom()
添加了第二个图。有没有办法将一些内容放入 ymin 参数中,以便第二个图将位于我的 x 轴上并与较大图中的最小条形对齐?

r ggplot2
2个回答
1
投票

好吧,即使您处理离散位置比例,您仍然可以使用数字,即按照@summer7的建议,您可以使用

ymin=-Inf
将缩放图放置在x轴上并将图与条形图对齐使用
 xmax = 1 + .45
,其中
1
是第一个类别的数字位置,
.45
是条形宽度的一半:

library(ggplot2)

Bigplot +
  annotation_custom(ggplotGrob(ZoomIn),
    xmin = 500, xmax = 3000,
    ymin = -Inf, ymax = 1 + .45
  )

就我个人而言,我会选择真正的插图,并且为了帮助读者,添加某种提示以明确小图形是小条形的缩放版本。这样的替代方案可能如下所示,其中我还添加了一个不可见的顶轴来对齐缩放和未缩放的条以及网格线。

x <- c(550, 550, 100, 100)
y <- c(1 + .4, 1 - .4, 1 - .45, 1 + .45)
Bigplot +
  annotation_custom(
    ggplotGrob(
      ZoomIn +
        scale_x_continuous(sec.axis = dup_axis()) +
        theme(
          axis.text.x.top = element_text(color = NA),
          axis.ticks.x.top = element_line(color = NA)
        )
    ),
    xmin = 600, xmax = 3000,
    ymin = 1 - .4, ymax = 1 + .4
  ) +
  annotate(
    geom = "polygon",
    x = x, y = y,
    fill = "grey75",
    alpha = .6
  ) +
  annotate(
    geom = "polygon",
    x = x, y = y,
    group = c(1, 2, 2, 1),
    color = "grey55"
  )


0
投票

这是使用

ggforce::facet_zoom
的替代方法。

library(ggplot2)
library(dplyr)

Depth <- c("10-20m","10-20m","10-20m","20-40m","20-40m","20-40m","30-60m","30-60m","30-60m")
Animal <- c("Fish", "Turtle", "Shark", "Fish", "Turtle", "Shark", "Fish", "Turtle", "Shark")
Abundance <- c(10,20, 15, 500, 500, 500, 1000, 1000, 1000)
BigPlotdata <- data.frame(Depth, Animal, Abundance)

ggplot(BigPlotdata, aes(fill = Animal, x = Abundance, y = Depth))+
  geom_bar(position = "stack" , stat = "identity") +
  ggforce::facet_zoom(x = Depth == "10-20m",
                      zoom.data = Depth == "10-20m",
                      zoom.size = 0.5) +
  theme(legend.position = "none",
        axis.title.y = element_blank(),
        axis.text.y=element_blank(),
        axis.ticks.y=element_blank(),
        axis.title.x = element_blank())

创建于 2024-05-15,使用 reprex v2.1.0

© www.soinside.com 2019 - 2024. All rights reserved.