将多个X,Y列对绘制为数据系列,同时排除(0,0)个点

时间:2015-06-26 16:49:24

标签: r ggplot2 dataframe subset

我正在尝试在一个图中绘制三个数据系列。每个系列的X和Y坐标位于我的数据框的单独列中:

    X1  Y1  X2  Y2  X3  Y3
1   0   1   0   2   0   3
2   1   2   1   3   1   4
3   2   3   2   4   2   5
4   3   4   3   5   3   6
5   4   5   4   6   4   7
6   5   6   5   7   5   8
7   6   7   6   8   6   9
8   0   0   7   9   7   8
9   0   0   8   8   0   0
10  0   0   9   7   0   0

由于每个系列的尾随(0,0)数据点无效,因此最终只能绘制这个点子集:

    X1  Y1  X2  Y2  X3  Y3
1   0   1   0   2   0   3
2   1   2   1   3   1   4
3   2   3   2   4   2   5
4   3   4   3   5   3   6
5   4   5   4   6   4   7
6   5   6   5   7   5   8
7   6   7   6   8   6   9
8           7   9   7   8
9           8   8       
10          9   7       

此外,第一个系列的X轴应该反转:

Correct plot

即使没有先清理数据框,我也很难将列对绘制为ggplot2中的单个系列(参见'legend')。

require(ggplot2)

report <- function(df){
  plot = ggplot(data=df, aes(x=-X1, y=Y1, size=3)) + #inverted X-axis of series 1
    layer(geom="point") +
    geom_point(aes(X2, Y2, colour="red", size=2)) + 
    geom_point(aes(X3, Y3, colour="blue", size=1)) +
    xlab("X") + ylab("Y")
  print(plot)
}

X1 = c(0,1,2,3,4,5,6,0,0,0)
Y1 = c(1,2,3,4,5,6,7,0,0,0)

X2 = c(0,1,2,3,4,5,6,7,8,9)
Y2 = c(2,3,4,5,6,7,8,9,8,7)

X3 = c(0,1,2,3,4,5,6,7,0,0)
Y3 = c(3,4,5,6,7,8,9,8,0,0)

df <- data.frame(X1,Y1,X2,Y2,X3,Y3)
colnames(df) <- c("X1","Y1","X2","Y2","X3","Y3")

report(df)

Incorrect plot

摆脱每个系列中无效(0,0)数据点的最佳方法是什么?如何正确绘制它们?

1 个答案:

答案 0 :(得分:2)

我认为您实际上想要转换data.frame,以使您的ggplot电话更加简洁。以下是使用dplyr包正确绘制数据的更新版本,以转换数据。

回复评论请求有关dplyr的其他信息。它提供了%>%运算符,它只是将左边的参数作为第一个参数传递给右边的函数。它允许更具可读性的R代码。 mutate函数通过手动设置变量添加Series变量,因为知道哪些点是哪个系列的一部分。然后filter函数会删除您指出的不需要的0,0个点。您可以在这些操作之后检查df以查看最终输出。希望这有助于解释下面的代码。这里还有一个link to the dplyr page

library(dplyr)
df <- rbind.data.frame(
    data.frame(X=-X1, Y=Y1),
    data.frame(X=X2, Y=Y2),
    data.frame(X=X3, Y=Y3))
df <- df %>%
    mutate(Series=rep(c('S1', 'S2', 'S3'), each=10)) %>%
    filter(!(X == 0 & Y == 0))
png('foo.png')
ggplot(df) + geom_point(aes(x=X, y=Y, color=Series, size=Series))
dev.off()

enter image description here

此外,如果您想手动设置颜色和大小的值以及添加理想示例图中的行,这里有一个更复杂的ggplot命令:

ggplot(df, aes(x=X, y=Y, color=Series, size=Series)) +
    geom_point() + geom_line(size=1) + theme_bw() +
    scale_color_manual(values=c('black', 'red', 'blue')) +
    scale_size_manual(values=seq(4,2,-1))

enter image description here