【问题标题】:Plotting several X,Y column pairs as data series, while excluding (0,0) points将多个 X、Y 列对绘制为数据系列,同时排除 (0,0) 点
【发布时间】:2015-06-26 16:49:23
【问题描述】:

我正在尝试在一个图中绘制三个数据系列。每个系列的 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 中的单个系列(参见“图例”)。

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) 数据点的最佳方法是什么,我应该如何正确绘制它们?

【问题讨论】:

    标签: r ggplot2 dataframe subset


    【解决方案1】:

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

    回应在dplyr 上要求提供更多信息的评论。它提供了%&gt;% 运算符,它只是将左侧的参数作为第一个参数传递给右侧的函数。它允许更具可读性的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))
    

    【讨论】:

    • 您可以将rbind.data.frame 替换为rbind
    • 您在@NickK 的评论中是否遗漏了什么?不确定您是否指的是dplyr 函数bind_rows,但我当然可以这样做,我只是选择不这样做。
    • 非常感谢您的回复,这似乎工作得很好。您愿意更详细地解释一下 mutate 函数是如何工作的吗? df &lt;- df %&gt;% mutate(Series=rep(c('S1', 'S2', 'S3'), each=10)) %&gt;%
    猜你喜欢
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    • 2011-02-18
    • 1970-01-01
    • 2014-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多