Календарная тепловая карта: цвета не соответствуют указанному
Я использую модификацию календарной карты от agstudy ( обсуждение и источник GitHub)
В целом, код работает очень хорошо, но у меня возникают проблемы с работой моего цветового кода.
В показанном примере первые 3 недели должны быть окрашены в красный цвет, а четвертый - в синий. Всего эта последовательность должна повторяться 6 раз, то есть должно быть 6 недель, окрашенных в синий цвет (каждые 4-е).
Чтобы получить свой код цвета, я загружаю список цветов в шестнадцатеричном коде из файла и называю его "пользователь":
col.sty <- switch(color,
'user'=data_2$colorMicro,
'r2b'=c("#0571B0", "#92C5DE", "#F7F7F7", "#F4A582", "#CA0020"), #red to blue
'r2g'=c("#D61818", "#FFAE63", "#FFFFBD", "#B5E384") , #red to green
'w2b'=c("#045A8D", "#2B8CBE", "#74A9CF", "#BDC9E1", "#F1EEF6"), #white to blue
'b2w'=grey.colors(5) )## black to white
# assign("col.sty", get(color))
calendar.pal <- colorRampPalette((col.sty), space = "rgb")
Содержимое data_2:
colorMicro
#CC0000
#CC0000
#CC0000
#00CCFF
#CC0000
#CC0000
#CC0000
#00CCFF
#CC0000
#CC0000
#CC0000
#00CCFF
#CC0000
#CC0000
#CC0000
#00CCFF
#CC0000
#CC0000
#CC0000
#00CCFF
#CC0000
#CC0000
#CC0000
#00CCFF
Это 24 значения цвета за 24 недели, которые я хочу представить в тепловой карте. Переменная ncolors
установлен на 24 и cuts
установлен на ncolors-1.
Я немного изменил свои настройки уровня графика по сравнению с кодом из agstudy.
# major plot ------------------------------------------------------------------
p <- levelplot(value~woty*dotw | yr, data=dat, border = "black",
layout = c(1, nyr%%7),
col.regions = calendar.pal(ncolors),
aspect='iso',
between = list(x=0, y=c(1,1)),
strip=TRUE,
main =varname,
panel = function(x,y,z,...) {
panel.levelplot(x,y,z,...)
ll <- list(...)
at = pretty(dat$pvalue)
ind.pch <- cut(dat$pvalue, at, include.lowest = TRUE, labels = FALSE)
pch.symbols <- pch.symbol[ind.pch]
subscripts <- ll$subscripts
x <- x[subscripts]
y <- y[subscripts]
pch.symbols <- pch.symbols[subscripts]
a=ifelse(dat$pvalue==0,15,ifelse(dat$pvalue==1,16,ifelse(dat$pvalue==2,17,ifelse(dat$pvalue==3,18,ifelse(dat$pvalue==4,25,ifelse(dat$pvalue==5,10,ifelse(dat$pvalue==6,65,ifelse(dat$pvalue==7,66,ifelse(dat$pvalue==67,S,NA)))))))))
b=ifelse(dat$pvalue==0,"blue1",ifelse(dat$pvalue==1,"darkorange4",ifelse(dat$pvalue==2,"red",ifelse(dat$pvalue==3,"seashell4",ifelse(dat$pvalue==4,"magenta",ifelse(dat$pvalue==5,"limegreen",ifelse(dat$pvalue>5,'yellow','black')))))))
panel.xyplot(x, y,fill =col.symbol ,col.symbol =b,
pch = a, cex=cex.symbol,
, ...)
calendar.division(...)
},
scales= scales,
cuts = ncolors-1,
colorkey= list(at=seq(from=1, to=24, by=1), col = calendar.pal(ncolors), width = 0.6, height = 0.5),
xlim =extendrange(dat$woty,f=0.01),
xlab="",ylab="",
ylim=extendrange(dat$dotw,f=0.1),
subscripts=TRUE,
par.settings = calendar.theme)
p
}
Я не могу выяснить, почему цвета смещены и не соответствуют предполагаемому цветовому коду. У кого-нибудь есть идея, в чем может быть причина?
1 ответ
Наконец, я узнал, как это работает:
В моей первой попытке я назначил дням каждой недели индивидуальный номер в порядке возрастания от 1 до 24. Т.е. значения дней недели один были установлены на 1, дни недели два на 2 и так далее. Список colorMicro
содержал 24 цвета, которые должны были соответствовать отдельным неделям. Список содержал цвета несколько раз.
Во второй попытке я назначил всем дням одного цвета один и тот же номер. В то же время я поместил соответствующие цвета в списке colorMicro
, Таким образом, каждый цвет появляется в списке только один раз и в том же порядке, что и цифры в календаре. Переменная ncolors
Я установил большое количество, и теперь все работает как нужно. пример
Первый способ был для меня проще с точки зрения генерации данных вне R, но по какой-то причине он не работает. Зная этот факт, второй путь также прост и приводит к правильному поведению при построении. Теперь можно назначать предопределенные цвета на каждый день или неделю по собственному желанию, что мне и нужно. Может быть, это полезно и для других.