【问题标题】:Return the data from ggplot() in a data frame as the original input data从数据框中的 ggplot() 返回数据作为原始输入数据
【发布时间】:2023-04-01 13:55:01
【问题描述】:

我有一个庞大的数据集(~150000*41) 看起来像

head(Data)

    Time      A1    A2    A3   ...  A40
    12:00:00  0     0     0.1  ...  0.65
    12:00:30  0.15  0.32  0.2  ...  0.54   
    12:01:00  0     0.43  0.14 ...  0
        .
        .
        .

我使用ggplot() 来绘制数据,就像这里的question 一样:

Data <- Data %>%
mutate(data=paste0('Data',data)) %>%
pivot_longer(-c(data,Time))

p <- ggplot(Data, aes(x=factor(Time),y=value,group=name,color=name))+
geom_line()+
facet_wrap(.~data,scales = 'free',ncol=1)+
xlab('Time')

众所周知,ggplot() 将在绘图之前处理数据,以便删除异常值或缺失值。让我们通过“输出数据”调用处理后的数据,这样ggplot() 将绘制输出数据而不是原始数据。在我的工作中,数据框由 150000 行组成,而在绘制数据时,ggplot() 删除了 33 行,因此输出数据由 (150000 - 33) 行组成。

我有兴趣在绘制数据后返回一个包含输出数据的新数据框。即数据框由除已删除行之外的原始数据组成。在我之前的问题中,zx8754 建议使用filter() 手动获取与输出数据相同的数据。现在,我更想知道如何直接从ggplot() 获取数据框。这个question 要求同样的事情,但答案返回一个列表而不是数据框或矩阵,使用:

 Output_data<-ggplot_build(p)

我已经尝试了很多天,并且阅读了很多文档,但我找不到解决方案,尤其是我正在通过 mutate() 管道数据

编辑:jzadra 在相同的类似question 中的答案通过使用为我的问题提供了一个接近的解决方案

    ggplot_build(p)$plot$data

但不返回与原始数据相同的维度。它将所有功能收集在与

相同的列中
   data  Time     name   value
   <chr> <chr>    <chr>  <dbl>
 1 Data1 12:00:00 A1         0
 2 Data1 12:00:00 A2         0
 3 Data1 12:00:00 A3         0.1
 4 Data1 12:00:00 A4         0
 5 Data1 12:00:00 A5         0
 6 Data1 12:00:00 A6         0
 7 Data1 12:00:00 A7         0
 8 Data1 12:00:00 A8         0
 9 Data1 12:00:00 A9         0
10 Data1 12:00:00 A10        0
# … with ... more rows

当我希望得到输出数据时

    Time      A1    A2    A3   ...  A40
    12:00:00  0     0     0.1  ...  0.65
    12:00:30  0.15  0.32  0.2  ...  0.54   
    12:01:00  0     0.43  0.14 ...  0
        .
        .
        .

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    由于您在绘制之前旋转了更长的时间,因此您必须 pivot_wider 才能将其恢复为原始形状。

    library(dplyr)
    library(tidyr)
    
    Data <- ggplot_build(p)$plot$data
    
    Data %>% 
       pivot_wider(names_from = name, values_from = value) %>%
       select(-data)
    #> # A tibble: 1 x 11
    #>   Time      A1    A2    A3    A4    A5    A6    A7    A8    A9   A10
    #>   <time> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
    #> 1 12:00      0     0   0.1     0     0     0     0     0     0     0
    

    【讨论】:

    • 感谢您的回答。你确定这会返回输出数据吗?这不是输入数据吗?也就是说,你不认为这些数据正是在 ggplot() 处理和删除异常值之前的原始数据吗?
    • 根据文档... "ggplot_build() 获取绘图对象,并执行生成可渲染对象所需的所有步骤。此函数输出两部分:数据框(每层一个)和一个面板对象,其中包含有关轴限制、中断等的所有信息。” 您的示例只有一层,但您当然可以测试并找出答案。运行代码你得到正确的行数了吗?
    • 对我来说它似乎返回了原始输入数据而没有处理!返回数据的行数与输入数据完全相同,但应该更少,因为我收到警告 ggplot() 在绘图时删除了 33 行
    • 嗯,layer_data(p) 会返回绘制的 x 和 y 值,但由于它们不再采用相同的格式,它只会返回过滤操作
    • so ,因此,无法在数据框中返回我要查找的内容。非常感谢:)
    猜你喜欢
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 2018-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多