Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何使用镶嵌面包裹将yaxis设置为与xaxis geom_点相等_R_Ggplot2 - Fatal编程技术网

R 如何使用镶嵌面包裹将yaxis设置为与xaxis geom_点相等

R 如何使用镶嵌面包裹将yaxis设置为与xaxis geom_点相等,r,ggplot2,R,Ggplot2,我正在使用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() +

我正在使用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")
我制作了一个包含每个变量的xlimits和y限制的数据框,我想我可以使用它,但我不确定如何使用

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

df_rng要生成大小相等的轴,可以将
ratio=1
放入
coord_fixed
中,如
中的示例所示

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

看起来关键在于按方面组创建最小值和最大值的数据集,并使用该数据集添加
geom_blank
。有关简单示例,请参见

我发现思考如何使极限数据集成为这项工作的挑战部分。我将使用
mpg
数据集给出一个示例

首先,使用不同比例的轴创建面:

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

现在,创建限制的数据集。我使用来自dplyr和tidyr的函数来实现这一点。这涉及到为每个面组找到两个轴变量的最小值和最大值。我在两个单独的列中执行此操作,然后将它们收集到一个列中。对于每个轴变量,该数据集基本上都需要有相同的列,因此我添加了y轴名称为last的重复列

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)

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

范围错误(c(mpg$displ,mpg$hwy))+FACTION_wrap(~类,刻度)= “free”):二进制运算符的非数值参数

指定限制的正确方法为
xlim(范围(…)
。来自
ggplot2
包的
mpg
数据集示例:

ggplot(mpg, aes(displ, hwy)) +
  geom_point() +
  xlim(range(mpg$displ)) + 
  ylim(range(mpg$hwy)) +
  facet_wrap(~class, scales = "free")
其中:

如果要以正确的方式比较不同的面,则必须对轴使用相同的比例

上述地块的替代方案可以是:

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


如果只想在左侧面(y轴)和底部面(x轴)上包含轴标签,只需使用
coord_fixed
删除
scales=“free”

,仅强制轴上数据单元的物理表示之间具有指定的比率。但是,这被
facet\u wrap
中的
scales=“free”
参数覆盖。查看我的答案如何解决该问题,而无需使用
coord_fixed
(当两个轴的限制不太相似时,这可能会对绘图的显示产生意外后果)。谢谢,这正是我想要的。我接受了这个答案,因为它允许尺度在每个方面都是相同的,而没有尺度。我只需要消化dplyr语法,谢谢,但这不是;这正是我想要的,因为我想要x=y,但每个方面都不同,构建另一个数据框并使用geom_blank的答案就是我想要的答案。我无法添加答案,但一个非常简单的解决方案是将不可见的数据添加到绘图中,并反转x和y,以便绘图点始终为正方形,例如,
+geom_blank(aes)(x=R2_-Zsc,y=R1_-Zsc))
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")