我正在尝试使用R进行数据分析,发现ggplot
非常好用。但是有一个我无法工作的功能。
我有几个图并依赖相同的数据框df
进行处理,它们应该具有相同的xmin
和xmax
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,...
,因此有很多重复。
我必须一直复制所有这些xmin
和xmax
变量,因此我的代码中存在很多混乱。
ggplot
中有没有办法,我可以在公共对象ranges
中分解这些范围,然后将其添加到aes(x=Xp, y=Yp)+ranges
?
答案 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对答案的评论,您可以使用dplyr
和tidyr
将数据转换为长格式,如下所示:
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)
给出
或者,如果你只想要1/2对(parse_number
来自readr
,tidyverse
包的另一部分):
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)
给出:
您也可以按照您想要的任何其他配对标准进行过滤。例如。获得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)