如何用ggplot2绘制基于颜色距离排序的调色板数据框
用ggplot2绘制按颜色相似度排序的调色板条形图
需求说明
我有如下数据集,希望用ggplot2绘制调色板样式的图表,呈现为彼此相连的条形,每个条形对应数据集中的一种颜色,同时按颜色相近程度排序(基于颜色距离计算)。
修正后的完整代码
library(ggplot2) library(tidyr) library(dplyr) library(stringr) # 数据集 color_palette <- tibble::tribble( ~Subfolder, ~Color1, ~Color2, ~Color3, ~Color4, ~Color5, "images/folder_1", "#1A1016", "#38282A", "#975D42", "#C8B7A2", "#E0D8C9", "images/folder_2", "#2A2523", "#A97C5E", "#BDAC95", "#D6CCBC", "#F0EAE1" ) # 转换为长格式,提取颜色原始顺序 color_palette_long <- color_palette %>% pivot_longer(cols = -Subfolder, names_to = "ColorOrder", values_to = "Color") %>% mutate(ColorOrder = as.numeric(str_extract(ColorOrder, "\\d+"))) # 定义RGB颜色距离计算函数 color_distance <- function(color1, color2) { col1 <- as.numeric(col2rgb(color1)) col2 <- as.numeric(col2rgb(color2)) sqrt(sum((col1 - col2)^2)) } # 分组计算颜色距离并按相似度排序 color_palette_long <- color_palette_long %>% group_by(Subfolder) %>% mutate( base_color = Color[ColorOrder == 1], Distance = color_distance(Color, base_color) ) %>% arrange(Subfolder, Distance) %>% mutate(group_id = row_number()) %>% ungroup() # 绘制调色板条形图 ggplot(color_palette_long, aes(x = Subfolder, y = 1, fill = Color)) + geom_col(position = "fill", color = NA) + scale_fill_identity() + labs(x = NULL, y = NULL) + theme_minimal() + theme( axis.text.y = element_blank(), axis.ticks.y = element_blank(), panel.grid = element_blank() )
关键细节说明
- 颜色距离计算修正:原代码中
rowwise()下的Color[1]会误取全列首个颜色作为基准,这里改为按Subfolder分组,取每组内原始第一个颜色为基准,确保每个调色板的距离计算逻辑正确。 - 相似度排序:通过
arrange(Subfolder, Distance)让每个子文件夹下的颜色按与基准色的距离从小到大排序,实现相近颜色条形相邻。 - 条形相连设置:使用
geom_col(position="fill")让同组颜色条形在x轴方向紧密拼接,形成完整的调色板条带,同时移除边框线保证视觉连贯。 - 主题优化:去掉y轴元素和网格线,让图表更聚焦于调色板的颜色展示。
内容的提问来源于stack exchange,提问作者Paula
相关产品推荐
相关产品推荐

