如何在Matplotlib中扩展调色板以适配多变量绘图需求?
解决Matplotlib多变量颜色重复问题的方案
针对你遇到的「40个变量循环绘图时,Matplotlib默认10色调色板不够用导致颜色重复」的问题,这里有几个灵活适配任意变量数量的解决方案,保证每个变量都有独有的、区分度高的颜色:
方案1:利用Matplotlib内置Colormap生成连续颜色
Matplotlib提供了大量内置的颜色映射(Colormap),可以直接根据变量数量生成对应数量的离散颜色,而且很多调色板是色盲友好的,比如viridis:
import matplotlib.cm as cm # 获取变量总数,生成对应数量的颜色列表 total_vars = len(num_columns) # 选择viridis调色板,生成total_vars个颜色 color_list = cm.get_cmap('viridis', total_vars)(range(total_vars)) # 循环绘图时直接取对应颜色 for i, col in enumerate(num_columns): plot_cumulative_dynamic_auc(X_test.iloc[:, i], col, color=color_list[i]) ret = concordance_index_ipcw(y_trn, y_test, X_test.iloc[:, i], tau=times[-1])
你可以替换viridis为其他调色板,比如plasma、inferno、cividis(这些都是对色盲友好的选项);如果喜欢鲜艳的颜色,也可以用rainbow。
方案2:用Seaborn生成高区分度调色板
Seaborn的color_palette函数可以轻松生成指定数量的、区分度高的颜色,尤其适合大量变量的场景:
import seaborn as sns # 生成对应变量数量的husl调色板颜色(色相均匀分布,颜色差异明显) color_list = sns.color_palette("husl", n_colors=len(num_columns)) for i, col in enumerate(num_columns): plot_cumulative_dynamic_auc(X_test.iloc[:, i], col, color=color_list[i]) ret = concordance_index_ipcw(y_trn, y_test, X_test.iloc[:, i], tau=times[-1])
husl调色板基于人类视觉感知调整了饱和度和亮度,比基础的hls调色板颜色更柔和、区分度更高。你也可以尝试tab20这类专为多类别设计的调色板。
方案3:手动生成色相循环的颜色(无额外依赖)
如果不想引入Seaborn,也可以通过colorsys模块手动生成均匀分布的色相颜色,完全自定义:
import colorsys total_vars = len(num_columns) color_list = [] for idx in range(total_vars): # 色相从0到1循环,固定饱和度和亮度,保证颜色差异明显 hue = idx / total_vars # 转换为RGB格式(Matplotlib支持RGB元组) rgb_color = colorsys.hsv_to_rgb(hue, 0.7, 0.9) color_list.append(rgb_color) for i, col in enumerate(num_columns): plot_cumulative_dynamic_auc(X_test.iloc[:, i], col, color=color_list[i]) ret = concordance_index_ipcw(y_trn, y_test, X_test.iloc[:, i], tau=times[-1])
额外优化建议
当变量数量达到40个时,图例可能会非常拥挤,你可以通过调整图例位置来避免遮挡图表:
plt.legend(bbox_to_anchor=(1.05, 1), loc='upper left', borderaxespad=0)
这样图例会显示在图表右侧,不占用绘图区域。
内容的提问来源于stack exchange,提问作者Hashriama
相关产品推荐
相关产品推荐

