如何使用facet_wrap将yaxis设置为等于xaxis geom_point

时间:2015-09-11 14:06:12

标签: r ggplot2

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

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")

我已经制作了一个数据框,其中包含每个变量的xlimits和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

来自cars数据集的示例生成以下图表:

enter image description here

3 个答案:

答案 0 :(得分:6)

看起来关键是通过构面组制作最小值和最大值的数据集,并使用该数据集添加geom_blank。有关简单示例,请参阅this answer

我发现在思考如何使极限数据集成为这一挑战的一部分。我将使用mpg数据集来举例说明。

首先是轴在不同尺度上的刻面:

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

enter image description here

现在,制作限制的数据集。我使用 dplyr tidyr 中的函数执行此操作。这涉及找到每个构面组的两个轴变量的最小最小值和最大值。我在两个单独的列中执行此操作,然后将它们收集到一列中。对于每个轴变量,此数据集基本上必须具有相同的列,因此我将最后一个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)

enter image description here

答案 1 :(得分:3)

你很接近,但问题是你是以错误的方式指定限制。您不应将限制指定为xlim = range(...)。这会产生以下错误:

  

范围错误(c(mpg $ displ,mpg $ hwy))+ facet_wrap(~class,scales =   “free”):二元运算符的非数字参数

指定限制的正确方法是xlim(range(...))。使用mpg包中的ggplot2数据集的示例:

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")

给出:

enter image description here

对于您自己的数据集,以下两个选项之一应该可以提供所需的结果:

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"

答案 2 :(得分:1)

要生成相同大小的轴,您可以将ratio=1放在coord_fixed ?coord_fixed

library(ggplot2)
qplot(mpg, wt, data = mtcars) + coord_fixed(ratio = 1)