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

Plotting several X,Y column pairs as data series, while excluding (0,0) points

我正在尝试在一个图中绘制三个数据系列。每个系列的 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轴应该倒转:

即使没有先清理数据框,我也很难在 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)

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

我认为您实际上想要转换 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()

此外,如果您想手动设置颜色和大小的值以及添加理想示例图中的线条,这里有一个更复杂的 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))