二分图交互颜色与数值不匹配问题求助(plotweb)
R语言plotweb绘制二分图颜色异常问题排查
我使用R语言的plotweb函数绘制二分图时,希望将交互值≥1000的元素设为半透明黄色(adjustcolor("#E6AB02", alpha.f=0.5)),<1000的设为半透明灰色(adjustcolor("grey80", alpha.f=0.5)),但实际输出图像颜色不符合预期:大交互值对应的粗条未显示黄色,小值细条也未显示灰色。
问题代码
plotweb(data.mat, method="normal", text.rot = 90, labsize = 1, y.width.low = 0.05, col.high = "#66A61E", #col.interaction = "#E6AB02", col.low = "#E7298A", bor.col.interaction = NA, arrow="none", empty=TRUE, plot.axes=FALSE, ybig=1, col.interaction = (ifelse(data.mat[,] < 1000, adjustcolor("grey80", alpha.f=0.5), adjustcolor("#E6AB02", alpha.f = 0.5))))
数据集
> dput(data.mat) structure(c(7336L, 1640L, 26293L, 111533L, 71255L, 161705L, 104046L, 169975L, 395822L, 153999L, 6780L, 10866L, 131162L, 239110L, 130786L, 88922L, 46725L, 99169L, 109625L, 203947L, 2258L, 550L, 47109L, 1813L, 362753L, 14451L, 17025L, 30251L, 308L, 34412L, 11L, 0L, 56988L, 1360L, 4L, 5L, 107L, 31L, 56L, 868L, 31775L, 31L, 327L, 19L, 180L, 4284L, 77L, 27L, 0L, 854L, 5L, 143L, 4622L, 264L, 7945L, 51L, 14545L, 32L, 8L, 126L, 66L, 0L, 6L, 14130L, 5L, 9L, 165L, 1017L, 5L, 115L, 65L, 5L, 9572L, 77L, 820L, 165L, 521L, 788L, 17L, 538L), dim = c(10L, 8L), dimnames = list(c("Arctium lappa", "Cichorium intybus", "Circium arvense", "Circium vulgare", "Hypericum perforatum", "Leucanthemum vulgare", "Plantago lanceolata", "Trifolium pratense", "Trifolium repens", "Tripleurospermum inodorum"), c("Cladosporium", "Alternaria", "Aureobasidium", "X....1", "Golovinomyces", "Podosphaera", "Ampelomyces", "X....2")))
异常输出
图像中二分图的交互条颜色未按预期区分:大交互值对应的粗条未显示设定的半透明黄色,小值对应的细条也未显示半透明灰色。
问题原因
ifelse函数无法正确处理adjustcolor返回的颜色向量。adjustcolor会返回包含RGBA信息的向量(长度为4),而ifelse会将整个向量视为单个元素进行判断,最终仅返回一个颜色值,导致所有交互条都使用同一种颜色,无法实现按值区分。
修正方案
先创建一个与数据集维度完全匹配的颜色矩阵,根据交互值逐个赋值对应颜色,再传入col.interaction参数:
修正后代码
# 先创建颜色矩阵,初始全部设为半透明灰色 color_mat <- matrix(adjustcolor("grey80", alpha.f=0.5), nrow = nrow(data.mat), ncol = ncol(data.mat)) # 将交互值≥1000的位置替换为半透明黄色 color_mat[data.mat >= 1000] <- adjustcolor("#E6AB02", alpha.f = 0.5) # 绘制二分图 plotweb(data.mat, method="normal", text.rot = 90, labsize = 1, y.width.low = 0.05, col.high = "#66A61E", col.low = "#E7298A", bor.col.interaction = NA, arrow="none", empty=TRUE, plot.axes=FALSE, ybig=1, col.interaction = color_mat)
内容的提问来源于stack exchange,提问作者Katherine Chau
相关产品推荐
相关产品推荐

