R tableGrob тепловая карта или условное форматирование в столбце

Есть ли способ создать аналогичный эффект условному форматированию в Excel -> цветовые шкалы, чтобы представить таблицу в объекте grid.table / tablegrob? Цветовой индикатор должен быть красным для более низких значений и зеленым для более высоких значений в столбце. Такой формат объекта необходим, чтобы таблица могла быть представлена ​​в формате сетки вместе с графиками.

введите описание изображения здесь

Спасибо.


person KRStam    schedule 27.04.2018    source источник


Ответы (4)


Вы можете сделать это в tableGrob. Вы создаете вектор цветов, а затем назначаете их ячейкам.

Итак, используя данные из ответа Клеменса:

library(gridExtra)
library(grid)

# define colour vector
# change `vec` argument of `findInterval` to suit your cut-points
cols <- c("red" ,"orange", "green") [findInterval(my_data$Balance, c(-Inf, 1e4, 2e4, Inf))]
# or 
# https://stackoverflow.com/questions/34517031/red-amber-green-sequential-palette-for-treemap-in-r
cols <- colorRampPalette(c("red", "yellow", "green"))(nrow(my_data))[rank(my_data$Balance)]


# create tales individually for each column
# this make it easy to assign colours to rows
t1 <- tableGrob(my_data["Balance"], 
               theme=ttheme_default(
                      core=list(bg_params = list(fill=cols)),
                      colhead = list(bg_params=list(fill="white", col="grey90"))), 
                      rows = NULL)
t2 <- tableGrob(my_data["ID"], 
               theme=ttheme_default(
                      core=list(bg_params = list(fill="white", col="grey90")),
                      colhead = list(bg_params=list(fill="white", col="grey90"))),
                      rows = NULL)

# join tables
tab <- gtable_combine(t2, t1)
# grid.newpage() ; grid.draw(tab)



# if also want to add black border
# https://stackoverflow.com/questions/31506294/gtable-put-a-black-line-around-all-cells-in-the-table-body
library(gtable)
tab <- gtable::gtable_add_grob(tab, 
                             grobs = rectGrob(gp=gpar(fill=NA, lwd=2)), 
                             t = 1, b = nrow(tab), l = 1, r = ncol(tab))

grid.newpage() ; grid.draw(tab)
person user20650    schedule 27.04.2018

Для этого можно использовать tableHTML:

library(tableHTML)

для набора данных:

set.seed(666)
my_data <- data.frame(ID = 101:117,
                      Balance = sample(-1000:60000, 17))

    ID Balance
1  101   46237
2  102   11030
3  103   58657
4  104   11280
5  105   21034
6  106   44296
7  107   58697
8  108   29381
9  109    -188
10 110   14854
11 111   46322
12 112      -2
13 113    4839
14 114    7670
15 115   11875
16 116   48475
17 117    1228

Затем вы можете создать таблицу HTML с помощью функции tableHTML(). Затем примените ранг цвета с темой RAG ко 2-му столбцу таблицы:

my_data %>% 
  tableHTML(rownames = FALSE,
            widths = c(50, 100)) %>% 
  add_css_conditional_column(columns = 2,
                             colour_rank_theme = 'RAG',
                             decreasing = TRUE)

Результат выглядит так:

введите описание изображения здесь

person clemens    schedule 27.04.2018
comment
Спасибо за ваш вклад. Знаете ли вы, можно ли использовать html в сеточной графике вместе с ggplots для отчетности в формате pdf (все на одной странице)? - person KRStam; 27.04.2018
comment
это зависит от движка конвертации. Самым простым решением было бы использовать пакет webshot для создания снимка экрана HTML. вы можете сохранить его, используя write_tableHTML() - person clemens; 27.04.2018

Наиболее естественным решением для этого является использование heatmap()?

heatmap(data.matrix(mtcars))

Будет создана тепловая карта с некоторыми параметрами цвета по умолчанию. Вы можете изменить цвет, используя дополнительный параметр (например, col = cm.colors(256)) или свою собственную цветовую палитру для достижения желаемого результата.

введите здесь описание изображения,

person onlyphantom    schedule 27.04.2018

Решение, которое я нашел, заключалось в следующем ... это работает, только если данные в порядке и вы указываете количество строк (17 на основе вашего снимка экрана):

theme=ttheme_default(
                  core=list(bg_params = list(fill=blues9[1:17]) or
theme=ttheme_default(
                  core=list(bg_params = list(fill=blues9[1:17]) 

Надеюсь, это поможет. Я сам тоже ищу альтернативы

person Aman    schedule 15.02.2019