如何在保留映射的前提下调暗/调亮自定义Seaborn调色板
调整自定义Seaborn调色板亮度的方法
你可以通过转换颜色的HSV色彩空间,调整明度(Value)通道来整体调暗或调亮调色板,同时完全保留原有的类型-颜色映射关系。以下是具体实现步骤:
核心思路
将所有颜色从RGB格式转换为HSV格式,调整V值(小于1调暗,大于1调亮,注意不要超过1),再转换回RGB格式,最后生成新的调色板字典。
完整代码示例
import seaborn as sns import matplotlib.colors as mcolors import matplotlib.pyplot as plt # 原自定义调色板 pkmn_type_colors_palette = { 'Grass': '#78C850', 'Fire': '#F08030', 'Water': '#6890F0', 'Bug': '#A8B820', 'Normal': '#A8A878', 'Poison': '#A040A0', 'Electric': '#F8D030', 'Ground': '#E0C068', 'Fairy': '#EE99AC', 'Fighting': '#C03028', 'Psychic': '#F85888', 'Rock': '#B8A038', 'Ghost': '#705898', 'Ice': '#98D8D8', 'Dragon': '#7038F8', 'Dark': sns.xkcd_rgb['dark indigo'], 'Flying': sns.xkcd_rgb['sky'], 'Steel': sns.xkcd_rgb['steel'], } # 定义亮度调整函数 def adjust_palette_brightness(palette, factor): """ 调整调色板的整体亮度 :param palette: 原调色板字典 :param factor: 亮度系数,<1调暗,>1调亮(建议范围0.2-1.8) :return: 调整后的新调色板 """ new_palette = {} for type_name, color in palette.items(): # 将颜色转换为RGB浮点值(0-1) rgb = mcolors.to_rgb(color) # 转HSV h, s, v = mcolors.rgb_to_hsv(rgb) # 调整明度,确保不超过1 new_v = min(v * factor, 1.0) # 转回RGB new_rgb = mcolors.hsv_to_rgb((h, s, new_v)) # 转十六进制格式 new_palette[type_name] = mcolors.to_hex(new_rgb) return new_palette # 生成调暗50%的调色板(factor=0.5) dimmed_palette = adjust_palette_brightness(pkmn_type_colors_palette, 0.5) # 生成调亮20%的调色板(factor=1.2) brightened_palette = adjust_palette_brightness(pkmn_type_colors_palette, 1.2) # 测试画图(以调暗版本为例) sns.violinplot(x='Type1', hue='Type1', y='Defense', data=poke_df, palette=dimmed_palette) plt.show()
关键说明
factor参数:取值小于1时会降低亮度(调暗),大于1时提高亮度(调亮),建议控制在0.2到1.8之间,避免颜色失真。- 兼容性:不管原调色板中的颜色是十六进制字符串还是xkcd颜色名,
mcolors.to_rgb()都能统一转换为标准RGB格式,确保所有颜色都能被正确调整。 - 映射保留:新调色板的键(宝可梦类型)和原字典完全一致,不会破坏原有的类型-颜色对应关系。
内容的提问来源于stack exchange,提问作者bryanchubh
相关产品推荐
相关产品推荐

