Цветовые палитры в таблицах данных R

#r #dt

#r #dt

Вопрос:

Любопытно, почему мы не можем применить стиль расходящихся типов datatables .

В приведенном ниже коде iris нет NAs, и для простоты я хочу применить расходящуюся схему к 150 записям. Все столбцы получат цвет, примененный к разделителю.Ранг длины, но тривиально делать это по столбцам…

 library(DT);library(colorspace);library(dplyr)
data(iris)
dt=datatable(iris) 

for (x in colnames(iris)) {
  if(x=='Species')next
  dt=dt %>% 
    formatStyle(x, color = tolower(diverging_hsv(150)[rank(iris$Sepal.Length)]))
}
  

Сообщение об ошибке отсутствует, но это не работает

Обратите внимание, что разные наборы данных с NAs искажают цвет:

 dt <- datatable(airquality) 

these=c('Wind','Ozone')
for (x in these) {
  #v <- full_seq(unique(airquality[[x]]), .1)
  v = airquality[[x]]
  cs <- diverging_hsv(length(v))
  dt <- dt %>% 
    formatStyle(x, backgroundColor = styleEqual(v, cs))
}
  

Комментарии:

1. Это не имеет ничего общего со NA значениями — вы отображаете значения не по порядку, а также, не дедуплицируя значения, одни и те же значения отображаются более чем на один цвет, где существуют дубликаты. Если вам нужен градиент, который не зависит от разницы в значениях, вы можете просто сделать v <- sort(unique(airquality[[x]])) . Вы также можете рассмотреть возможность использования styleInterval() which сопоставляет цвета с привязанными значениями.

Ответ №1:

Похоже, вы не можете передать вектор значений непосредственно в аргумент color of formatStyle() вместо этого вы можете использовать вспомогательную функцию styleEqual() для сопоставления значений с цветами от 1 до 1:

 library(DT)
library(colorspace)
library(dplyr)
library(tidyr)

dt <- datatable(iris) 

for (x in colnames(iris)) {
  if (x == 'Species') next 
  v <- full_seq(unique(iris[[x]]), .1)
  cs <- diverging_hsv(length(v))
  dt <- dt %>% 
    formatStyle(x, color = styleEqual(v, cs))
}
  

Комментарии:

1. Я соглашусь с этим, хотя я удалил зависимость tidyr и просто пошел v = iris[[x]] . Умное и простое решение, спасибо.

2. Возможно, это не так надежно, как предполагалось изначально… airquality имеет неправильную окраску (что-то связанное с упорядочением или сортировкой)? см., Например, сообщение OG