【问题标题】:Conditional formatting: making cells colorful条件格式:使单元格丰富多彩
【发布时间】:2011-10-19 21:15:13
【问题描述】:

是否可以做到以下几点:

loc1 <- c("Aa", "Aa", "aa", "Aa")
loc2 <- c("aa", "aa", "aa", "AA")
loc3 <- c("aa", "Aa", "aa", "aa")
gen <- data.frame(loc1, loc2, loc3)

loc1g <- c(0.01, 0.5, 1, 0.75)
loc2g <- c(0.2, 0.1, 0.2, 0.6)
loc3g <- c(0.8, 0.8, 0.55, 1)
pval <- data.frame(loc1g, loc2g, loc3g)

我想打印到一个文件以生成数据帧,这种方式由 pval 数据帧有条件地格式化。生成颜色的比 (row1, col1) 的平均值取决于 pvale (row1, col1)。以下是颜色编码:

0 to 0.3   is "red" text color 
0.31 to 0.7 is "yellow"
> 0.7  is "red" 

gen[1,1] 将以红色文本颜色打印为“Aa”,依此类推....

感谢您的帮助。

编辑:

我对打印而不是在图表中绘图更感兴趣。如果我可以将输出保存为 MS excel 并在 MSEXCEL 中打开,那就太好了。我也可以是其他类型的文本编辑器格式,可以读取颜色编码的文本。因为我的原始数据矩阵的尺寸应该是 1000 x 1000 甚至更大。我想快速了解每个 gen 类别的 p 值。

【问题讨论】:

  • 你想到了什么样的文件?可以将其作为图形、乳胶文件或 Excel 来执行,仅举几个选项。
  • 还要澄清一下,您不能以纯文本形式执行此操作,例如交互式 R 会话中的输出。纯文本没有颜色...
  • 您可以使用某种降​​价语言生成表格(参见例如ascii 包),但要做好准备:基本的 R 控制台/GUI/IDE 将无法对其进行解析/着色。 HTML/LaTeX/xls 可能是另一种选择。
  • 感谢您的帮助,请查看我的编辑...。如果您详细说明或提供有目的的解决方案的代码,我将不胜感激,抱歉我的知识有限...
  • 我不明白你为什么不只使用 R 来找出哪些 p 值是“不可靠的”。即使对 1000 x 1000 的矩阵进行颜色编码,也难以阅读。

标签: excel r formatting


【解决方案1】:

听起来你想模仿 Excel。以下是几个例子:

x = 1:ncol(pval)
y = 1:nrow(pval)

# Colored backgrounds
dev.new(width=4, height=4)
image(x, y, t(as.matrix(pval)),
  col = c('red', 'yellow', 'red'),
  breaks = c(0, 0.3, 0.7, 1),
  xaxt='n', 
  yaxt='n', 
  ylim=c(max(y)+0.5, min(y)-0.5), 
  xlab='', 
  ylab='')
centers = expand.grid(y, x)
text(centers[,2], centers[,1], unlist(gen))

# Colored text
dev.new(width=4, height=4)
image(x,y, matrix(0, length(x), length(y)),
  col='white',
  xaxt='n', 
  yaxt='n', 
  ylim=c(max(y)+0.5, min(y)-0.5), 
  xlab='', 
  ylab='')
pvals = unlist(pval)
cols = rep('red', length(pvals))
cols[pvals>0.3 & pvals<=0.7] = 'yellow'
text(centers[,2], centers[,1], unlist(gen), col=cols)
grid(length(x),length(y))

【讨论】:

  • 谢谢,这样做似乎很有趣....如果我想部分看,可以是部分解决方案。请查看我最近对问题的编辑,我对更多基于文本的输出打印而不是图形感兴趣......我的想象力是做一些我们可以在 excel 中做的事情,尽管我相信 excel 提供单元格本身的值格式而不是来自其他矩阵。
【解决方案2】:

给出一个类似 POC 的答案,它使用了一个丑陋的循环而不是最漂亮的设计:

加载例如。 xlxs 包能够写入 Excel 2007 格式:

library(xlsx)

让我们创建一个工作簿和一个工作表(参见手册!):

wb <- createWorkbook()
sheet <- createSheet(wb, "demo")

定义一些在电子表格中使用的样式:

red <- createCellStyle(wb, fillBackgroundColor="tomato", fillForegroundColor="yellow", fillPattern="BIG_SPOTS")
yellow <- createCellStyle(wb, fillBackgroundColor="yellow", fillForegroundColor="tomato", fillPattern="BRICKS1")

还有将每个单元格以适当格式粘贴到电子表格的丑陋循环:

for (i in 1:nrow(pval)) {
    rows <- createRow(sheet, rowIndex=i)
    for (j in 1:ncol(pval)) {
        cell.1 <- createCell(rows, colIndex=j)[[1,1]]
        setCellValue(cell.1, gen[i,j])
        if ((pval[i,j] < 0.3) | (pval[i,j] > 0.7)) {
            setCellStyle(cell.1, red)
        } else {
            setCellStyle(cell.1, yellow)
        }
    }
}

保存 Excel 文件:

saveWorkbook(wb, '/tmp/demo.xls')

结果:demo.xls


ascii的替代解决方案:

ascii.data.frame() 可以将数据帧导出为多种格式,并能够添加一些格式。例如。导出到pandoc,首先将每个单元格的样式定义为一个与pval相同维度的数组:

style <- matrix('d', dim(pval)[1], dim(pval)[2])
style[pval < 0.3 | pval > 0.7] <- 's'

设置所需的输出:

options(asciiType = "pandoc")

并导出数据框:

> ascii(gen, style=cbind('h', style))

    **loc1**   **loc2**   **loc3**  
--- ---------- ---------- ----------
1   Aa         **aa**     **aa**    
2   **Aa**     **aa**     Aa        
3   **aa**     aa         **aa**    
4   **Aa**     **AA**     **aa**    
--- ---------- ---------- ----------

使用ascii::Report,您可以轻松地将其转换为 pdf、odt 或 html。试试看 :) 带有 HTML 输出的小演示:result

r <- Report$new()
r$add(section("Demo"))
r$add(ascii(gen, style=cbind('h', style)))
options(asciiType = "pandoc")
r$backend <- "pandoc"
r$format <- "html"
r$create()

odt 输出:result

r$format <- "odt"
r$create()

【讨论】:

    【解决方案3】:

    如果您真的想要这样做(请参阅@Joris 的评论以获得更好的方法),我强烈建议您放弃 Excel 并在 LaTeX 中尝试。将 R 包 xtableLaTeX package \colortbl 结合使用。

    优点:

    • 漂亮的印刷
    • 没有 Excel 麻烦(导出到 Excel 很容易;导出到 Excel 的同时保持格式更难,而且容易出错)

    缺点:

    • 这不是 Excel
    • 可能需要一些工作才能使颜色与xtable 配合使用。但是,您只需执行一次,它就会永远工作——您甚至可以在一个包中发布您的函数,或者将其提交给 xtable 维护者以包含在他们的包中,这样就可以省去其他人的麻烦。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-29
      • 1970-01-01
      • 2023-03-27
      • 2011-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多