【问题标题】:How can I color data points in R based on a pattern match?如何根据模式匹配为 R 中的数据点着色?
【发布时间】:2012-06-24 06:07:21
【问题描述】:

我有一个这种形式的数据框:

             V1 V2                       V3          V4       V5         V6       V7           V8
1 0610007C21Rik  -   chr5:31351012-31356737 1.33732e-05 0.752381  0.9965090 0.000000 1.777419e-05
2 0610007L01Rik  - chr5:130695613-130717165 1.67168e+00 1.673120  0.0000000 3.453930 4.997847e-01
3 0610007P08Rik  -  chr13:63916627-64000808 7.06033e-01 0.000000  0.0815767 0.318051 1.000000e+00
4 0610007P14Rik  -  chr12:87157066-87165495 0.00000e+00 0.000000  0.0000000 5.494230          NaN
5 0610007P22Rik  -  chr17:25377114-25379603 4.99696e+00 0.908254  0.9076130 3.639250 8.461946e-01
6 0610009B22Rik  -  chr11:51499151-51502136 6.53363e-01 8.500980 13.5797000 0.000000 7.137192e-02

我正在使用此命令绘制 log2(V4) 与 log2(V5):

plot(log2(df[,4]) ~ log2(df[,5]), xlim=c(0,10), ylim=c(0,10))

我想根据 V1 中的模式匹配对点进行着色。例如,如何将 0610007C21Rik 和 0610007L01Rik 涂成绿色,将 0610007P22Rik 和 0610007P14Rik 涂成红色? 我已经尝试将另一列添加到指定颜色的数据框中,但必须有更简单的方法。

【问题讨论】:

  • 一个可能相关的问题:Color data point in R plot
  • 这非常接近,但我无法将两个条件与不同的颜色结合起来。 codeplot(x, x, col=ifelse(x==3, "red", "black"))
  • 可以在对plot 的调用中向col 提供任何函数,因此您可以编写自定义函数来使用任何数据执行任何操作。

标签: r bioinformatics


【解决方案1】:

这是一个基本的 R 解决方案:

df$V1 的每个唯一值将颜色列表定义为命名向量一次。请注意每个要着色的点名称周围的""

col.list <- c(
              "0610007C21Rik"="green",
              "0610007L01Rik"="green",
              "0610007P22Rik"="red",
              "0610007P14Rik"="red"
             )

然后使用df$V1 进行绘图以查找您刚刚定义的col.list 向量中的值。

plot(
     log2(df[,4]) ~ log2(df[,5]), 
     xlim=c(0,10),
     ylim=c(0,10),
     col=col.list[paste(df$V1)]
    )

要解决以下 OP 的评论,请在 plot 调用中使用它:

... col=ifelse(df$V1 %in% names(col.list),col.list[paste(df$V1)],"black")

这使得完整的调用看起来像:

plot( 
      log2(df[,4]) ~ log2(df[,5]),
      xlim=c(0,10),
      ylim=c(0,10),
      col=ifelse(df$V1 %in% names(col.list),col.list[paste(df$V1)],"black")
    )

【讨论】:

  • 谢谢!这接近我想要实现的目标。但是,它不会绘制 col.list 中未指定的点。由于完整的数据框有超过 20,000 行,我怎样才能让它以黑色绘制 col.list 中未提及的所有内容?
  • @JoshuaA - 请参阅上面我认为可以解决问题的编辑。
【解决方案2】:

看看 ggplot2 包。

如果您输入数据框,它将使人们更容易帮助编写代码。

这是一个看起来有点像你的数据的例子,但是有更好的方法来记录转换。

df <- data.frame(sample(LETTERS[1:5],20, replace=TRUE), abs(rnorm(20)/100), abs(runif(20)*10))
colnames(df) <- c('V1','V4','V5')


library(ggplot2)

p <- ggplot(df, aes(log2(V4) , log2(V5)))
p + geom_point(aes(colour = V1))

【讨论】:

  • 感谢您的回答。我不想为每一行提供唯一的颜色,因为整个数据框中有超过 20,000 个。具体来说,我想做的是根据 V1 中的条目制作 10 个绿色和 19 个红色。在我的简短示例中,如何通过在第一列中搜索这些条目将 0610007C21Rik 和 0610007L01Rik 设为绿色,将 0610007P22Rik 和 0610007P14Rik 设为红色?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
  • 2020-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 2016-06-17
相关资源
最近更新 更多