日历热图:颜色不符合规定
Calendar Heatmap: Colors not as specified
我正在使用 agstudy 修改的日历热图 (discussion and source GitHub)
总的来说,代码工作得很好,但我在让我的颜色代码工作时遇到了问题。
在所示示例中,前 3 周应为红色,第 4 周应为蓝色。这个序列总共应该重复 6 次,即应该有 6 周为蓝色(每 4 周)。
为了实现我的颜色代码,我从文件中加载十六进制代码的颜色列表并将其命名为 'user':
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 到 24 的升序为每周的几天分配了一个单独的数字。即第一周的天数设置为 1,第二周的天数设置为 2,依此类推。列表 colorMicro
包含 24 种颜色,这些颜色应该与各个星期相对应。该列表多次包含颜色。
在我的第二次尝试中,我为所有的日子分配了相同的颜色和相同的数字。同时我把相应的颜色放在列表colorMicro
中。这样,每种颜色在列表中只出现一次,并且与日历中的数字出现的顺序相同。变量 ncolors
我设置为一个很大的数字,现在一切正常。
Example
考虑到 R 之外的数据生成,第一种方法对我来说更容易,但由于某种原因它不起作用。
知道这个事实后,第二种方法也很容易,并且会导致正确的绘图行为。现在可以随意为每一天或每一周分配预定义的颜色,这正是我所需要的。也许这对其他人也有用。
我正在使用 agstudy 修改的日历热图 (discussion and source GitHub)
总的来说,代码工作得很好,但我在让我的颜色代码工作时遇到了问题。
在所示示例中,前 3 周应为红色,第 4 周应为蓝色。这个序列总共应该重复 6 次,即应该有 6 周为蓝色(每 4 周)。
为了实现我的颜色代码,我从文件中加载十六进制代码的颜色列表并将其命名为 'user':
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 到 24 的升序为每周的几天分配了一个单独的数字。即第一周的天数设置为 1,第二周的天数设置为 2,依此类推。列表 colorMicro
包含 24 种颜色,这些颜色应该与各个星期相对应。该列表多次包含颜色。
在我的第二次尝试中,我为所有的日子分配了相同的颜色和相同的数字。同时我把相应的颜色放在列表colorMicro
中。这样,每种颜色在列表中只出现一次,并且与日历中的数字出现的顺序相同。变量 ncolors
我设置为一个很大的数字,现在一切正常。
Example
考虑到 R 之外的数据生成,第一种方法对我来说更容易,但由于某种原因它不起作用。 知道这个事实后,第二种方法也很容易,并且会导致正确的绘图行为。现在可以随意为每一天或每一周分配预定义的颜色,这正是我所需要的。也许这对其他人也有用。