如何在 facet_wrap 中设置 y 轴和 x 轴相等的 geom_point?

5

我正在使用ggplot绘制一个相当简单的散点图。 我主要想说明x轴和y轴之间的相关性。 因此,我希望x轴和y轴的限制相等。

ggplot(VV,aes(x=R1_Zsc,y=R2_Zsc)) +
  geom_point() +
  stat_smooth() +
  facet_wrap(~variable, scales="free")

我尝试下面的变量,但也不起作用:
ggplot(VV, aes(x=R1_Zsc,y=R2_Zsc)) +
  geom_point() +
  stat_smooth() +
  xlim=range(c(VV$R1_Zsc,VV$R2_Zsc)) +
  ylim=range(c(VV$R1_Zsc,VV$R2_Zsc)) +
  facet_wrap(~variable, scales="free")

我已经创建了一个数据框,其中包含每个变量的x轴和y轴限制,我认为我可以使用它,但我不确定如何使用。

df_rng <- ddply(VV, .(variable), summarise, min=range(c(R1_Zsc,R2_Zsc))[1],max=range(c(R1_Zsc,R2_Zsc))[2])

感谢您的提问,coord_fixed(ratio=1) 似乎无法起作用。我想将 xlimylim 设置为相同的值。

这是输出图: enter image description here

从汽车数据集中获取的示例会生成以下图表:

enter image description here

任何帮助都非常感激。


我无法添加答案,但是一个非常简单的解决方案是在绘图中添加不可见数据,并且将x和y反转,以便绘制的点始终是正方形,例如 + geom_blank(aes(x=R2_Zsc,y=R1_Zsc)) - Simon Woodward
3个回答

11

看起来关键是按照分面组来制作你的最小值和最大值数据集,并使用该数据集添加geom_blank。参见这个答案以获得一个简单的例子。

我发现制作限制数据集是其中的难点。 我将使用mpg数据集来举例说明。

首先,有不同比例轴的分面:

ggplot(mpg, aes(displ, hwy)) +
    geom_point() +
    facet_wrap(~class, scales = "free")

在此输入图像描述

现在,制作限制数据集。我使用dplyrtidyr中的函数来完成此操作。这涉及查找每个分面组的两个轴变量的最小最小值和最大最大值。我将它们分别放在两列中,然后汇总到一个列中。该数据集需要为每个轴变量具有几乎相同的列,因此我在y轴名称最后添加了重复列。

library(tidyr)
library(dplyr)

facetlims = mpg %>% 
    group_by(class) %>% 
    summarise(min = min(displ, hwy), max = max(displ, hwy)) %>%
    gather(range, displ, -class) %>%
    mutate(hwy = displ, range = NULL)

Source: local data frame [14 x 3]

        class displ   hwy
        (chr) (dbl) (dbl)
1     2seater   5.7   5.7
2     compact   1.8   1.8
3     midsize   1.8   1.8
4     minivan   2.4   2.4
5      pickup   2.7   2.7
6  subcompact   1.6   1.6
7         suv   2.5   2.5
8     2seater  26.0  26.0
9     compact  44.0  44.0
10    midsize  32.0  32.0
11    minivan  24.0  24.0
12     pickup  22.0  22.0
13 subcompact  44.0  44.0
14        suv  27.0  27.0

现在只需将geom_blank与此数据集添加到原始图形中,每个小面板内的轴限制都是相同的。

ggplot(mpg, aes(displ, hwy)) +
    geom_point() +
    facet_wrap(~class, scales = "free") +
    geom_blank(data = facetlims)

在这里输入图片描述


1
谢谢,这正是我想要的。我接受了这个答案,因为它允许在每个方面使用相同的比例尺,同时保持自由比例尺。我只需要消化一下dplyr语法。 - user2814482

2
你已经接近正确,但问题在于你以错误的方式指定了限制范围。你不应该将你的限制范围指定为xlim = range(...)。这会产生以下错误:

Error in range(c(mpg$displ, mpg$hwy)) + facet_wrap(~class, scales = "free") : non-numeric argument to binary operator

正确的指定限制范围的方法是使用xlim(range(...))。以下是使用ggplot2包中的mpg数据集的示例:
ggplot(mpg, aes(displ, hwy)) +
  geom_point() +
  xlim(range(mpg$displ)) + 
  ylim(range(mpg$hwy)) +
  facet_wrap(~class, scales = "free")

这将会得到:

enter image description here

如果您想正确比较不同方面,必须使用相同的坐标轴刻度。

上述图表的另一种替代方案可能是:

ggplot(mpg, aes(displ, hwy)) +
  geom_point(size=1) +
  xlim(range(c(mpg$displ, mpg$hwy))) + 
  ylim(range(c(mpg$displ, mpg$hwy))) +
  facet_wrap(~class, scales = "free")

这将产生:

输入图像说明


对于您自己的数据集,以下两个选项之一应该会给您想要的结果:

ggplot(VV,aes(x=R1_Zsc,y=R2_Zsc)) +
  geom_point() +
  stat_smooth() +
  xlim(range(VV$R1_Zsc)) +
  ylim(range(VV$R2_Zsc)) +
  facet_wrap(~variable, scales="free")

或者:

ggplot(VV,aes(x=R1_Zsc,y=R2_Zsc)) +
  geom_point() +
  stat_smooth() +
  xlim(range(c(VV$R1_Zsc,VV$R2_Zsc))) +
  ylim(range(c(VV$R1_Zsc,VV$R2_Zsc))) +
  facet_wrap(~variable, scales="free")

如果您只想在左侧分面(y轴)和底部分面(x轴)上包含坐标轴标签,只需删除 scales="free"

谢谢,但这不是我想要的,因为我想要x=y,但每个方面都不同,构建另一个数据框并使用geom_blank的答案正是我想要的。 - user2814482

1
为了产生等大小的轴,您可以在`coord_fixed`中使用`ratio=1`,就像这个例子中从`?coord_fixed`中展示的一样。
library(ggplot2)
qplot(mpg, wt, data = mtcars) + coord_fixed(ratio = 1)

仅使用coord_fixed只能强制坐标轴上数据单位的物理表示之间保持特定比例。但是,这可以被facet_wrap中的scales="free"参数覆盖。请参阅我的答案以了解如何解决问题,无需使用coord_fixed(当两个轴的限制不太相似时,使用coord_fixed可能会对图的显示产生意外后果)。 - Jaap

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接