Base R绘图图例颜色异常及ggplot循环绘图技术求助
问题1:Base R绘图图例颜色修复
你当前图例只显示一个聚类颜色的原因是,legend()的col参数传入了每个样本的颜色向量(factor(df_syn$Cluster)会生成与样本数等长的颜色索引),但图例只需要对应每个唯一聚类的颜色。
修改方案:先把Cluster转为因子,提取其水平值,再为每个水平分配对应颜色:
set.seed(42) ## 保证结果可复现 df_syn <- as.data.frame(matrix(runif(n=50, min=1, max=20), nrow=10)) names(df_syn) <- c('A', 'B', 'C', 'D', 'E') df_cr <- data.frame(Cluster=c('A', 'A', 'B', 'B', 'C', 'C', 'C', 'C', 'A', 'B')) df_syn <- cbind(df_cr, df_syn) D <- ncol(df_syn[, 2:6]) # 提前定义聚类因子,方便后续调用 cluster_factor <- factor(df_syn$Cluster) cluster_levels <- levels(cluster_factor) # 获取每个聚类对应的颜色 cluster_colors <- palette()[seq_along(cluster_levels)] for (i in 2:D) { for (j in 2:D) { if (i == j) { plot(0, 0, type="n", xaxt="n", yaxt="n") text(0, 0, names(df_syn[i])) } else { Z <- robCompositions::pivotCoord(df_syn[, c(i, j, 2:D[-c(i, j)])], method="symm") plot(Z[, 1:2], xlab=colnames(df_syn[i]), ylab=colnames(df_syn[j]), col=cluster_factor, pch=19) # 图例使用聚类水平和对应颜色 legend("bottomright", legend=cluster_levels, pch=19, ncol=1, col=cluster_colors) } } }
问题2:ggplot循环绘图实现
ggplot在循环中需要显式调用print()才能显示图像,同时需要将计算后的枢轴坐标与聚类信息合并为数据框,方便ggplot调用:
set.seed(42) ## 保证结果可复现 df_syn <- as.data.frame(matrix(runif(n=50, min=1, max=20), nrow=10)) names(df_syn) <- c('A', 'B', 'C', 'D', 'E') df_cr <- data.frame(Cluster=c('A', 'A', 'B', 'B', 'C', 'C', 'C', 'C', 'A', 'B')) df_syn <- cbind(df_cr, df_syn) D <- ncol(df_syn[, 2:6]) # 加载ggplot2 library(ggplot2) for (i in 2:D) { for (j in 2:D) { if (i == j) { # 绘制对角线的变量名图,用ggplot实现 p <- ggplot() + geom_text(aes(x=0, y=0, label=names(df_syn[i])), size=10) + theme_void() print(p) } else { Z <- robCompositions::pivotCoord(df_syn[, c(i, j, 2:D[-c(i, j)])], method="symm") # 合并数据:枢轴坐标 + 聚类信息 plot_data <- cbind(Z[, 1:2], Cluster=df_syn$Cluster) # 重命名列,方便ggplot调用 colnames(plot_data) <- c("x", "y", "Cluster") p <- ggplot(plot_data, aes(x=x, y=y, color=Cluster)) + geom_point(size=3, shape=19) + labs(x=colnames(df_syn[i]), y=colnames(df_syn[j])) + theme_bw() + theme(legend.position="bottomright") # 循环中必须print才能显示图像 print(p) } } }
说明
- Base R部分:通过提前提取聚类水平和对应颜色,确保图例颜色与点的颜色一一对应。
- ggplot部分:将计算结果与聚类信息合并为数据框,利用
aes(color=Cluster)自动映射颜色,循环中通过print(p)触发图像显示。
内容的提问来源于stack exchange,提问作者jukkaper
相关产品推荐
相关产品推荐

