
1. Matplotlib颜色基础从单字符简写到完整色名第一次用Matplotlib画图时我盯着plt.plot(x, y, r--)里的r发愣——这个字母居然能控制颜色后来才发现Matplotlib藏着不少这样的彩蛋。单字符颜色代码就像编程界的摩斯密码用最简短的表达传递丰富信息# 基础单字符颜色代码 blue: b, green: g, red: r, cyan: c, magenta: m, yellow: y, black: k, white: w但实际项目中我们更常用完整英文色名。比如要画一组温度数据折线图import matplotlib.pyplot as plt temperatures [22, 25, 28, 26, 23] plt.plot(temperatures, colorsteelblue, linewidth2) plt.title(Daily Temperature, colordarkslategray) plt.grid(colorlightgray, linestyle--)这里用到的steelblue钢蓝色、darkslategray深石板灰比简单的b、k更能精准表达设计意图。Matplotlib支持的颜色名远不止基础色完整列表可以通过以下代码查看from matplotlib import colors print(list(colors.CSS4_COLORS.keys())) # 输出148种CSS4颜色名称提示在Jupyter Notebook中运行colors.CSS4_COLORS会返回包含十六进制值的字典方便直接复制使用2. 颜色编码的三种核心格式2.1 十六进制颜色码设计师朋友递给我一张UI稿指着某个元素说这里用品牌蓝然后发来#2A5CAA——这就是前端开发最常用的十六进制颜色表示法。在Matplotlib中十六进制字符串可以直接作为颜色参数# 品牌色应用案例 brand_colors { primary: #2A5CAA, secondary: #FFD43B, dark: #333333 } plt.bar([Q1, Q2, Q3], [120, 145, 110], colorbrand_colors[primary]) plt.plot([0.2, 0.8], [0.7, 0.7], colorbrand_colors[secondary], linewidth4, transformplt.gcf().transFigure)十六进制格式的优势在于与网页设计工具无缝对接支持简写形式如#ABC等价于#AABBCC直观反映RGB通道值2.2 RGB/RGBA元组当需要精确控制颜色通道时我会使用0-1范围的RGB元组。比如创建半透明的误差带import numpy as np x np.linspace(0, 10, 100) y np.sin(x) error 0.2 * np.random.rand(100) plt.fill_between(x, y-error, yerror, color(0.2, 0.4, 0.6, 0.3)) # RGBA格式 plt.plot(x, y, color(0.1, 0.3, 0.5)) # RGB格式这里第四个参数0.3表示30%透明度。在绘制重叠图形时透明度能有效提升图表可读性。2.3 灰度字符串制作学术海报时经常需要灰度图表。除了用black还可以用字符串形式的灰度值plt.subplot(121) plt.plot(np.random.rand(10), 0.8) # 浅灰 plt.title(Light Gray, color0.3) # 深灰 plt.subplot(122) plt.scatter(range(5), np.random.rand(5), c0.5) # 中灰 plt.title(Medium Gray, color0)3. 专业颜色库深度对比3.1 CSS4 vs X11颜色标准Matplotlib同时支持CSS4和X11两种颜色标准但有些色名在两个标准中存在差异。比如green在CSS4中是#008000在X11中却是#00FF00。通过以下代码可以查看这些同名不同色的情况from matplotlib.colors import CSS4_COLORS, XKCD_COLORS conflicts [] for name in CSS4_COLORS: if fxkcd:{name} in XKCD_COLORS: if CSS4_COLORS[name] ! XKCD_COLORS[fxkcd:{name}]: conflicts.append(name) print(f存在差异的颜色名{conflicts})3.2 XKCD颜色调查xkcd作者Randall Munroe曾发起颜色命名调查产生了954种有趣的颜色名称。要在Matplotlib中使用它们需要添加xkcd:前缀plt.barh([程序员, 设计师, 产品经理], [8, 6, 7], color[xkcd:bright blue, xkcd:pea green, xkcd:dusty pink])这些名字生动形象比如xkcd:baby puke green婴儿呕吐绿、xkcd:radioactive lime放射性柠檬黄特别适合非正式报告。3.3 Tableau经典配色Tableau的默认配色在数据可视化领域广受好评。Matplotlib通过tab:前缀提供这些颜色categories [A, B, C, D] values [15, 30, 45, 10] plt.pie(values, labelscategories, colors[tab:blue, tab:orange, tab:green, tab:red])Tableau配色特点是饱和度适中、彼此区分度高特别适合分类数据展示。4. 颜色映射Colormap的科学选择4.1 连续型数据配色处理温度、海拔等连续数据时线性渐变的colormap是首选。Matplotlib内置的viridis、plasma是经过优化的色系data np.random.randn(1000).cumsum() plt.scatter(range(1000), data, cdata, cmapviridis, alpha0.6) plt.colorbar(labelValue)实测建议避免使用传统的jet色系虽然颜色鲜艳但存在亮度突变可能误导数据解读4.2 离散型数据配色当需要强调特定阈值时BoundaryNorm配合ListedColormap能创建离散色阶from matplotlib.colors import BoundaryNorm, ListedColormap bounds [-2, -1, 0, 1, 2] cmap ListedColormap([#2b83ba, #abdda4, #ffffbf, #fdae61]) norm BoundaryNorm(bounds, cmap.N) plt.contourf(np.random.randn(100).reshape(10,10), levelsbounds, cmapcmap, normnorm) plt.colorbar(ticksbounds)4.3 分类数据配色处理非有序分类数据时需要确保各颜色在色相上有明显区分。tab20色系提供20种高对比度颜色categories [fGroup {i} for i in range(8)] values np.random.randint(10, 50, size8) plt.bar(categories, values, colorplt.get_cmap(tab20).colors[:8]) plt.xticks(rotation45)5. 高级配色技巧与实践5.1 创建自定义渐变色当项目需要特定品牌渐变时可以用LinearSegmentedColormapfrom matplotlib.colors import LinearSegmentedColormap brand_colors [#2A5CAA, #7FB2FF, #FFFFFF] my_cmap LinearSegmentedColormap.from_list(brand, brand_colors) plt.imshow(np.random.rand(10,10), cmapmy_cmap) plt.colorbar()5.2 颜色循环优化默认的颜色循环可能不够用通过修改rcParams可以扩展plt.rcParams[axes.prop_cycle] plt.cycler( color[#1f77b4, #ff7f0e, #2ca02c, #d62728, #9467bd, #8c564b])5.3 无障碍配色检查为色盲用户考虑可以用colors.to_rgb()转换后检查亮度对比def check_contrast(color1, color2): rgb1 colors.to_rgb(color1) rgb2 colors.to_rgb(color2) lum1 0.299*rgb1[0] 0.587*rgb1[1] 0.114*rgb1[2] lum2 0.299*rgb2[0] 0.587*rgb2[1] 0.114*rgb2[2] return abs(lum1 - lum2) 0.5 # 经验阈值 print(check_contrast(red, blue)) # 输出False print(check_contrast(black, white)) # 输出True6. 实战案例气象数据可视化结合温度降水数据演示专业配色方案# 生成模拟数据 months [Jan, Feb, Mar, Apr, May, Jun] temps [5, 7, 12, 16, 20, 25] rains [45, 40, 50, 60, 80, 120] fig, ax1 plt.subplots(figsize(10,6)) ax1.set_title(Monthly Climate Data, pad20) # 温度折线使用连续色系 temp_color plt.get_cmap(YlOrRd)(0.7) ax1.plot(months, temps, colortemp_color, markero, linewidth2) ax1.set_ylabel(Temperature (°C), colortemp_color) ax1.tick_params(axisy, labelcolortemp_color) # 降水柱状使用离散色系 rain_colors plt.get_cmap(Blues)(np.linspace(0.3, 0.8, len(months))) ax2 ax1.twinx() ax2.bar(months, rains, colorrain_colors, alpha0.7) ax2.set_ylabel(Precipitation (mm), colorrain_colors[-1]) ax2.tick_params(axisy, labelcolorrain_colors[-1]) # 添加图例 ax1.legend([Temperature], locupper left) ax2.legend([Precipitation], locupper right)