如何用matplotlib按亮度排列并绘制颜色集合
用Matplotlib绘制垂直方形的亮度排序颜色图
核心实现步骤
假设你已经实现了calculate_luminance(color)函数(输入颜色值返回对应亮度),直接按以下步骤实现:
- 对颜色按亮度排序:用你的亮度函数作为排序依据,调整升序/降序满足需求
- 计算方形网格布局:通过颜色总数的平方根取整,让行列数尽可能接近,保证整体呈方形
- 绘制无轴颜色块:用Matplotlib子图绘制每个颜色块,去掉所有坐标轴元素,调整间距让布局紧凑
完整代码示例
import matplotlib.pyplot as plt import math # 替换成你已有的亮度计算函数 def calculate_luminance(color): # 示例:处理十六进制/RGB格式,返回WCAG标准亮度值 if isinstance(color, str): color = color.lstrip('#') r, g, b = [int(color[i:i+2], 16)/255 for i in (0, 2, 4)] else: r, g, b = [x/255 for x in color] return 0.2126 * r + 0.7152 * g + 0.0722 * b # 替换成你的目标颜色集合 color_list = [ "#FF0000", "#00FF00", "#0000FF", "#FFFF00", "#FF00FF", "#00FFFF", "#800000", "#008000", "#000080", "#808000", "#800080", "#008080", "#C0C0C0", "#808080", "#000000", "#FFFFFF" ] # 按亮度升序排序(reverse=True可改为降序) sorted_colors = sorted(color_list, key=calculate_luminance) # 计算方形网格的行列数 total_colors = len(sorted_colors) grid_dim = int(math.ceil(math.sqrt(total_colors))) rows, cols = grid_dim, grid_dim # 创建方形画布 fig, axes = plt.subplots(rows, cols, figsize=(8, 8)) axes = axes.flatten() # 将二维子图数组转为一维,方便遍历 # 逐个绘制颜色块 for ax, color in zip(axes, sorted_colors): ax.set_facecolor(color) # 移除所有坐标轴元素 ax.set_xticks([]) ax.set_yticks([]) for spine in ax.spines.values(): spine.set_visible(False) # 隐藏未使用的子图(当颜色数不是完全平方数时) for ax in axes[total_colors:]: ax.axis('off') # 调整子图间距,让颜色块紧密排列 plt.subplots_adjust(wspace=0.05, hspace=0.05) plt.show()
关键细节说明
- 方形布局控制:通过
grid_dim = int(math.ceil(math.sqrt(total_colors)))确保行列数尽可能相等,配合figsize=(8,8)让画布保持方形 - 无干扰展示:移除坐标轴刻度、边框,避免视觉干扰
- 间距调整:
wspace和hspace参数控制子图间的水平/垂直间距,可根据需求微调数值 - 排序方向:修改
sorted函数的reverse参数,可切换颜色从亮到暗或暗到亮的排列顺序
内容的提问来源于stack exchange,提问作者Aleks K.
相关产品推荐
相关产品推荐

