R tableGrob тепловая карта или условное форматирование в столбце - PullRequest
0 голосов
/ 27 апреля 2018

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

enter image description here

Спасибо.

Ответы [ 4 ]

0 голосов
/ 16 февраля 2019

Решение, которое я нашел, состояло в следующем: это работает, только если данные в порядке, и вы перечисляете количество строк (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]) 

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

0 голосов
/ 27 апреля 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)

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

enter image description here

0 голосов
/ 27 апреля 2018

Вы можете сделать это в течение 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)
0 голосов
/ 27 апреля 2018

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

heatmap(data.matrix(mtcars))

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

enter image description here,

...