Условное форматирование: сделать ячейки красочными - PullRequest
8 голосов
/ 20 октября 2011

возможно ли сделать следующее:

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)

Я хочу напечатать в файл в формат данных gen таким образом, чтобы он был условно отформатирован в кадре данных 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 х 1000 или даже больше.Я хотел бы быстро узнать общее значение р для каждой категории генов.

Ответы [ 3 ]

5 голосов
/ 20 октября 2011

Звучит так, будто вы хотите имитировать 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))

enter image description here

# 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))

enter image description here

4 голосов
/ 25 октября 2011

Предоставление 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 выводом: результат

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 вывод: результат

r$format <- "odt"
r$create()
2 голосов
/ 25 октября 2011

Если вы действительно хотите сделать это (см. Комментарий @ Joris для лучшего способа), я настоятельно рекомендую отключить Excel и попробовать его в LaTeX.Используйте пакет R xtable в сочетании с пакетом LaTeX \colortbl.

Преимущества:

  • Красивая печать
  • Нет проблем с Excel(экспортировать в Excel очень просто; экспортировать в Excel при сохранении форматирования гораздо сложнее, и рецепт ошибок)

Недостатки:

  • Это не Excel
  • Возможно, понадобится немного поработать, чтобы цвета работали с xtable.Однако вам нужно сделать это только один раз, и тогда это будет работать вечно - вы даже можете выпустить свою функцию в пакете или отправить ее сопровождающим xtable для включения в их пакет и избавить всех остальных от проблем.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...