【问题标题】:How to melt and plot multiple datasets over different ranges on the same set of axis?如何在同一组轴上融合和绘制不同范围内的多个数据集?
【发布时间】:2019-10-29 12:21:53
【问题描述】:

这是我第一次在这里发帖,我希望我的问题是明确和适当的。我有一组数据,其头部如下所示:

   wl     ex421  wl     ex309  wl      ex284  wl      ex347
1 431 0.6168224 321 0.1267943 301 0.06392694 361 0.15220484
2 432 0.6687435 322 0.2416268 302 0.05631659 362 0.08961593
3 433 0.6583593 323 0.4665072 303 0.05327245 363 0.13134187
4 434 0.6832814 324 0.3576555 304 0.00000000 364 0.32432432
5 435 0.6427830 325 0.2194976 305 0.12328767 365 0.50308203
6 436 0.7393562 326 0.1866029 306 0.08675799 366 0.34660977

等等。 “wl”列代表波长,有四个不同的范围。其他四列代表在“wl”范围内进行的测量(标准化)。范围也有不同的长度。所有这些都在数据集中间的某个地方部分重叠。 我需要实现的是在同一组轴上显示所有四组“ex###”数据并绘制在各自范围内的图。 x 轴需要适应所有四个“wl”范围。但是,我还没有成功。

过去,当我不得不像这样绘制多组数据时,我只是融化了数据,它总是有效的。像这样的:

df_melt <- melt(df, id.var = 'wl')

然后我会这样绘制:

fluor_plt <- ggplot(fluor_ref2_melt, aes(x=wl,y=value,color=variable)) + 
geom_point(shape = 1, fill = NA) + geom_path(data = fluor_ref2_melt,size = 1) +
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank()) + 
  scale_colour_manual(values = colvec)

但是,因为我有多个名为“wl”的列,它们也有不同的范围,所以发生的情况是 R 只取第一个“wl”列并丢弃所有其他列。然后它基本上通过使用行索引将所有'ex###'值转移到该范围内......所以我得到了下面的框架图:

   wl     ex421    ex309    ex284      ex347
1 431 0.6168224 0.1267943 0.06392694 0.15220484
2 432 0.6687435 0.2416268 0.05631659 0.08961593
3 433 0.6583593 0.4665072 0.05327245 0.13134187
4 434 0.6832814 0.3576555 0.00000000 0.32432432
5 435 0.6427830 0.2194976 0.12328767 0.50308203
6 436 0.7393562 0.1866029 0.08675799 0.34660977

不用说,这是完全错误的...... 因此,我试图规避该问题的一种方法是进入 Excel 并手动上下移动列,以便在数据框中,每一行对应一个“wl”值,无论是否有任何相关的测量值。这摆脱了被“移位”的值,但 R 在第一个之后仍然丢弃了“wl”列。我没有得到一个完全错误的情节,而是得到了正确情节的一部分。第一组观测值 (ex421) 绘制在其整个范围内;在范围重叠的地方可以看到其他部分。 我看过一些过去在这里被问到的类似案例,例如 - Reshape data frame from wide to long with re-occuring column names in R。 但我是 R 新手,我认为我不能完全理解所提出的解决方案。我没有成功地以我希望它被重塑的方式重塑我的数据(为不同的集合保持不同的 'wl' 范围),我不知道之后要给 ggplot 哪些论据。我尝试过使用 data.table,但后来我不知道为 value.name 和 variable.name 赋予什么。 重申一下,我想要实现的是通过在 Excel 中制作单个散点图并向其中添加四个不同系列来绘制电子表格中的四个数据集。

任何意见将不胜感激!

【问题讨论】:

    标签: r ggplot2 reshape2 melt


    【解决方案1】:

    我能想到这个解决方案:

    # data:
    dt <- structure(list(wl = 431:436, 
         ex421 = c(0.6168224, 0.6687435, 0.6583593, 0.6832814, 0.642783, 0.7393562), 
         wl = 321:326, 
         ex309 = c(0.1267943, 0.2416268, 0.4665072, 0.3576555, 0.2194976, 0.1866029), 
         wl = 301:306, 
         ex284 = c(0.06392694, 0.05631659, 0.05327245, 0, 0.12328767, 0.08675799), 
         wl = 361:366, 
         ex347 = c(0.15220484, 0.08961593, 0.13134187, 0.32432432, 0.50308203, 0.34660977)), 
       row.names = c(NA,     -6L), 
       class = c("data.table", "data.frame"))
    
    # get vectors with wl names
    wls <- grep("wl", names(dt))
    
    # get vectors with ex_numbers names
    exs <- grep("ex", names(dt))
    
    # reformat the data:
    newDt <- cbind(stack(dt, select = wls), stack(dt, select = exs))
    
    # Assign reasonable names:
    names(newDt) <- c("wlNumber", "wlInd", "exValue", "exNumber")
    

    现在可以使用任何命令绘制数据了:

    ggplot(newDt, aes(x = wlNumber, y = exValue, color = exNumber))+geom_point()+geom_line()
    

    这种方法的主要优点是您可以将表格分散到许多列中。没关系,只要他们的名字“wl”就可以了(“ex”代表其他变量)。

    【讨论】:

      【解决方案2】:

      在这里我用您的数据加载一个数据框,确保允许使用 check.names = F 重复名称,否则它将重命名 wl 列以区分:

      df <- read.table(
        header = T, check.names = F,
        stringsAsFactors = F,
        text = "   wl     ex421  wl     ex309  wl      ex284  wl      ex347
       431 0.6168224 321 0.1267943 301 0.06392694 361 0.15220484
       432 0.6687435 322 0.2416268 302 0.05631659 362 0.08961593
       433 0.6583593 323 0.4665072 303 0.05327245 363 0.13134187
       434 0.6832814 324 0.3576555 304 0.00000000 364 0.32432432
       435 0.6427830 325 0.2194976 305 0.12328767 365 0.50308203
       436 0.7393562 326 0.1866029 306 0.08675799 366 0.34660977")
      

      那么这是一种重塑的方法,只需堆叠数据的子集。由于没有太多的列对,我认为半手动方法就可以了。它保留了不同的列标题,因此我们可以 gather 将它们变成长格式并映射到您的绘图中的颜色。

      library(tidyverse)
      df2 <- bind_rows(
        df[1:2],
        df[3:4],
        df[5:6],
        df[7:8]
      ) %>%
        gather(variable, value, -wl) %>%
        drop_na()
      
      
      ggplot(df2, aes(x=wl,y=value,color=variable)) + 
        geom_point(shape = 1, fill = NA) + 
        geom_path(size = 1) +
        theme(panel.grid.major = element_blank(), 
              panel.grid.minor = element_blank())
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-08
        • 2018-03-14
        • 2019-07-15
        • 1970-01-01
        • 2020-11-26
        • 2021-08-18
        • 2011-01-19
        相关资源
        最近更新 更多