在几个图中重复使用ggplot中的范围

时间:2018-01-12 09:52:47

标签: r ggplot2

我正在尝试使用R进行数据分析,发现ggplot非常好用。但是有一个我无法工作的功能。

我有几个图并依赖相同的数据框df进行处理,它们应该具有相同的xminxmax s。

我的剥离代码看起来像这样(带有虚拟数据):

import(ggplot2)
df<-data.frame(c(0.3,0.1,0.2),c(0.2,0.1,0.3),c(0.3,0.2,0.1),c(0.5,0.6,0.22))
names(df)=c("X1","Y1","X2","Y2")
pdf("Test.pdf")
plot<-ggplot(df, aes(x = X1, y = Y1, xmin=-0.02, xmax=0.02, ymin=-0.02, ymax=0.02))+geom_path()
print(plot)
plot<-ggplot(df, aes(x = X2, y = Y2, xmin=-0.02, xmax=0.02, ymin=-0.02, ymax=0.02))+geom_path()
print(plot)
dev.off()

在我的情况下,我有更多列,如X3,Y3,...,因此有很多重复。

我必须一直复制所有这些xminxmax变量,因此我的代码中存在很多混乱。

ggplot中有没有办法,我可以在公共对象ranges中分解这些范围,然后将其添加到aes(x=Xp, y=Yp)+ranges

2 个答案:

答案 0 :(得分:1)

制作一系列单个图的一个解决方案是将图保存到对象并仅在需要的地方进行修改:

library(tidyverse) # or magrittr and ggplot2 at the least

p1 <- df %>% 
  ggplot(aes(X1, Y1)) +
  geom_path() +
  coord_cartesian(xlim = c(-0.2, 0.6), ylim = c(-0.2, 0.6))

如果您只想缩放图而不是剪切值,则应使用coord_cartesian()

现在让我们只更改我们想要绘制的列:

p1 + aes(X2, Y2)

您还可以使用%+%轻松更改地图上的数据,如http://ggplot2.tidyverse.org/reference/gg-add.html中所述,因此,如果您有另一个名为df2的数据集,其中列名相同,则可以这样做:

p1 %+% df2

答案 1 :(得分:1)

要了解@ Henrik对答案的评论,您可以使用dplyrtidyr将数据转换为长格式,如下所示:

long_df <-
  df %>%
  gather(X, Xval, starts_with("X")) %>%
  gather(Y, Yval, starts_with("Y"))

以长格式返回数据,如下所示:

    X Xval  Y Yval
1  X1  0.3 Y1 0.20
2  X1  0.1 Y1 0.10
3  X1  0.2 Y1 0.30
4  X2  0.3 Y1 0.20
5  X2  0.2 Y1 0.10
6  X2  0.1 Y1 0.30
7  X1  0.3 Y2 0.50
8  X1  0.1 Y2 0.60
9  X1  0.2 Y2 0.22
10 X2  0.3 Y2 0.50
11 X2  0.2 Y2 0.60
12 X2  0.1 Y2 0.22

每个X / Y配对都有一行。这允许您对ggplot进行一次调用并绘制所有对:

ggplot(
  long_df
  , aes(x = Xval, y = Yval)) +
  geom_point() +
  facet_grid(X~Y)

给出

enter image description here

或者,如果你只想要1/2对(parse_number来自readrtidyverse包的另一部分):

long_df %>%
  mutate(Xnum = parse_number(X)
         , Ynum = parse_number(Y)) %>%
  filter(Xnum == Ynum) %>%
  ggplot(aes(x = Xval, y = Yval)) +
  geom_point() +
  facet_wrap(~X+Y)

给出:

enter image description here

您也可以按照您想要的任何其他配对标准进行过滤。例如。获得X1-Y2和X2-Y1:

long_df %>%
  filter(
    (X == "X1" & Y == "Y2") |
      (X == "X2" & Y == "Y1")) %>%
  ggplot(aes(x = Xval, y = Yval)) +
  geom_point() +
  facet_wrap(~X+Y)

enter image description here