You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 12:35:23