Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.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 ggplot2中两个数据集具有不同比例的两个y轴_R_Ggplot2 - Fatal编程技术网

R ggplot2中两个数据集具有不同比例的两个y轴

R ggplot2中两个数据集具有不同比例的两个y轴,r,ggplot2,R,Ggplot2,我有两个数据集(可以组合成一个数据集),它们共享公共x值,而y值不同-我想在一个数据集中绘制y值,并将y轴放在绘图的左侧,而在另一个数据集中绘制y值,并将y轴放在同一绘图的右侧。当然,两个y轴值的相对比例是不同的(实际上应该根据第一个数据集中的y值进行“调整”。两个数据集中的点将以不同的颜色区分这两个比例) 示例如下所示: d1 = data.frame(x=c(100, 200, 300, 400), y=seq(0.1, 0.4, by=0.1)) # 1st dataset d2 = da

我有两个数据集(可以组合成一个数据集),它们共享公共x值,而y值不同-我想在一个数据集中绘制y值,并将y轴放在绘图的左侧,而在另一个数据集中绘制y值,并将y轴放在同一绘图的右侧。当然,两个y轴值的相对比例是不同的(实际上应该根据第一个数据集中的y值进行“调整”。两个数据集中的点将以不同的颜色区分这两个比例)

示例如下所示:

d1 = data.frame(x=c(100, 200, 300, 400), y=seq(0.1, 0.4, by=0.1)) # 1st dataset
d2 = data.frame(x=c(100, 200, 300, 400), y=seq(0.8, 0.5, by=-0.1)) # 2nd dataset
p1 = ggplot(data = d1, aes(x=x, y=y)) + geom_point()
p2 = ggplot(data = d2, aes(x=x, y=y)) + geom_point() +
  scale_y_continuous(position = "right")
p1
p2
ggplot2
中,我无法执行
p1+p2
,因为它将显示一条错误消息
错误:不知道如何向绘图添加o
。请帮助。谢谢


首先,这种类型的图形是一个很好的例子,说明了为什么要花很长时间才能将第二个轴放入
ggplot2
:它很容易混淆,导致错误解释。因此,我将在这里不厌其烦地提供多个指标来说明什么会发生

首先,使用需要在原始轴上进行变换。这通常以截距/斜率公式的形式进行,如
~2*+10
,其中周期表示要缩放的值。在这种情况下,我认为我们可以简单地
~2*

但是,这意味着您需要在原始轴上绘制所有数据,这意味着您需要将
d2$y
预缩放到
d1$y
的限制。非常简单,您只需要反向转换,就像在
秒轴中使用的一样

不过,为了使用
ggplot2
的分组,我将把数据合并到单个data.frame中

d1 = data.frame(x=c(100, 200, 300, 400), y=seq(0.1, 0.4, by=0.1)) # 1st dataset
d2 = data.frame(x=c(100, 200, 300, 400), y=seq(0.8, 0.5, by=-0.1)) # 2nd dataset
d1$z <- "data1"
d2$z <- "data2"
d3 <- within(d2, { y = y/2 })
d4 <- rbind(d1, d3)
d4
#     x    y     z
# 1 100 0.10 data1
# 2 200 0.20 data1
# 3 300 0.30 data1
# 4 400 0.40 data1
# 5 100 0.40 data2
# 6 200 0.35 data2
# 7 300 0.30 data2
# 8 400 0.25 data2

坦白地说,我不喜欢不同的坡度。也就是说,蓝色轴上的两个街区是0.1,而红色轴上的两个街区是0.2。如果你说的是两个截然不同的“东西”,则这可能没问题。但是,如果两条线的斜率直接可比,则您可能更希望保持每个块的大小相同。为此,我们将使用一个截距的变换,斜率没有变化。这意味着in-data.frame变换可以是
y=y-0.4
,而绘图补码可以是
~.+0.4
,产生:


PS:从前面和

中得到的提示,这种类型的图形是一个很好的例子,说明了为什么要花很长时间才能将第二个轴放入
ggplot2
:它很容易混淆,导致错误的解释。因此,我将在这里不厌其烦地提供多个指标来说明什么会发生

首先,使用需要在原始轴上进行变换。这通常以截距/斜率公式的形式进行,如
~2*+10
,其中周期表示要缩放的值。在这种情况下,我认为我们可以简单地
~2*

但是,这意味着您需要在原始轴上绘制所有数据,这意味着您需要将
d2$y
预缩放到
d1$y
的限制。非常简单,您只需要反向转换,就像在
秒轴中使用的一样

不过,为了使用
ggplot2
的分组,我将把数据合并到单个data.frame中

d1 = data.frame(x=c(100, 200, 300, 400), y=seq(0.1, 0.4, by=0.1)) # 1st dataset
d2 = data.frame(x=c(100, 200, 300, 400), y=seq(0.8, 0.5, by=-0.1)) # 2nd dataset
d1$z <- "data1"
d2$z <- "data2"
d3 <- within(d2, { y = y/2 })
d4 <- rbind(d1, d3)
d4
#     x    y     z
# 1 100 0.10 data1
# 2 200 0.20 data1
# 3 300 0.30 data1
# 4 400 0.40 data1
# 5 100 0.40 data2
# 6 200 0.35 data2
# 7 300 0.30 data2
# 8 400 0.25 data2

坦白地说,我不喜欢不同的坡度。也就是说,蓝色轴上的两个街区是0.1,而红色轴上的两个街区是0.2。如果你说的是两个截然不同的“东西”,则这可能没问题。但是,如果两条线的斜率直接可比,则您可能更希望保持每个块的大小相同。为此,我们将使用一个截距的变换,斜率没有变化。这意味着in-data.frame变换可以是
y=y-0.4
,而绘图补码可以是
~.+0.4
,产生:


注:从和中得到的提示这实际上是一个很好的例子,说明了为什么双轴图是如此误导。在同一个轴上绘制,你会看到线甚至没有交叉……大脑会忍不住将交叉向上解释为一组变得“大于”,即使值显示在轴上。同意。我真的希望这个例子真的适用于第二个轴有意义的真实数据集。但底线是,我同意,这些图很容易误导。这实际上是一个很好的例子,说明为什么双轴图会误导人。在同一个轴上绘制,你会看到这些线甚至没有交叉…大脑忍不住会将交叉向上解释为一组数据变得“大于”,即使在轴上显示值也是如此。同意。我真的希望这个例子是针对一个真实的数据集,其中第二个轴是有意义的。但底线是,我同意,这些图很容易误导。
library(ggplot2)
ggplot(d4, aes(x=x, y=y, group=z, color=z)) +
  geom_path() +
  geom_point() +
  scale_y_continuous(name="data1", sec.axis = sec_axis(~ 2*., name="data2")) +
  scale_color_manual(name="z", values = mycolors) +
  theme(
    axis.title.y = element_text(color = mycolors["data1"]),
    axis.text.y = element_text(color = mycolors["data1"]),
    axis.title.y.right = element_text(color = mycolors["data2"]),
    axis.text.y.right = element_text(color = mycolors["data2"])
  )