大家好,我是你们的小帅学长。
你图看起来不专业,往往是配色在误导信息。
很多同学画图到后期会陷入一个非常“隐蔽”的坑:线条、字号、布局都调得差不多了,但图还是“不像论文图”。
原因往往不是你画得不对,而是颜色在说谎。
连续变量你用了彩虹色,让读者以为有很多“分界点”;
分类变量你用了渐变色,让读者以为它有大小顺序;
正负偏差你用了单色系,让读者根本看不出“往哪偏”。
这一篇我们把“配色选择”讲成一个可执行的决策逻辑:先判断变量类型 → 再选色带类型 → 最后做可读性检查。
01.先给结论:颜色选择 = 变量类型选择
你只需要思考一个问题:
你这张图表达的数据是什么类型?
通常就三类:
连续变量
离散/分类变量
发散变量
接下来就分别对应三种色带:
连续 → Sequential(顺序色带)
离散 → Qualitative(定性色带)
发散 → Diverging(发散色带)
02.连续变量:用“顺序色带”
顺序色带的特征是:
亮度/深浅随数值单调变化;
读者一眼就能判断“更大/更小”。
03.离散/分类:用“定性色带”,不要用渐变
分类变量的核心是:
类别之间没有大小关系;
所以颜色应该是“彼此可区分”,而不是“深浅代表大小”。
04.发散变量:以“参考值”为中心,用发散色带
发散色带的关键是:
中心颜色代表参考值(通常是 0),两侧颜色对称;
这样读者一眼就看出“正偏/负偏”“增/减”。
05.颜色之外最容易被忽略的 2 件事
1)色条(colorbar)要写清单位
没单位的色条等于让读者猜。
2)范围要可解释
连续图不要随意自动缩放;
发散图尽量对称;
分类图要固定映射关系(同一类永远同一个颜色)。
06.直接给你可复制模板
1)连续色带
import osimport numpy as npimport matplotlib as mplimport matplotlib.pyplot as pltfrom matplotlib import font_manager as fmfm.fontManager.addfont(r"C:\Windows\Fonts\times.ttf")fm.fontManager.addfont(r"C:\Windows\Fonts\simsun.ttc")mpl.rcParams["font.family"] = ["Times New Roman", "SimSun"]mpl.rcParams["axes.unicode_minus"] = FalseOUT_DIR = r"D:\py_figs"os.makedirs(OUT_DIR, exist_ok=True)# 假数据:二维连续变量data = np.random.rand(50, 80) * 10 + 280fig, ax = plt.subplots(figsize=(6, 4))im = ax.imshow(data, cmap="viridis")# 连续:顺序色带ax.set_title("连续变量示例:LST 强度分布")cbar = fig.colorbar(im, ax=ax)cbar.set_label("LST (K) / 地表温度(K)")fig.savefig(os.path.join(OUT_DIR, "cmap_sequential.jpg"), dpi=300, bbox_inches="tight")plt.close(fig)

2)离散分类
import osimport numpy as npimport matplotlib as mplimport matplotlib.pyplot as pltfrom matplotlib import font_manager as fmfm.fontManager.addfont(r"C:\Windows\Fonts\times.ttf")fm.fontManager.addfont(r"C:\Windows\Fonts\simsun.ttc")mpl.rcParams["font.family"] = ["Times New Roman", "SimSun"]mpl.rcParams["axes.unicode_minus"] = FalseOUT_DIR = r"D:\py_figs"os.makedirs(OUT_DIR, exist_ok=True)labels = ["水体", "城市", "植被", "裸地"]values = [35, 22, 40, 18]fig, ax = plt.subplots(figsize=(6, 4))colors = plt.get_cmap("tab10").colors[:len(labels)]# 离散:定性色带ax.bar(labels, values, color=colors)ax.set_title("离散变量示例:地类面积统计")ax.set_ylabel("Area (%) / 面积占比(%)")fig.savefig(os.path.join(OUT_DIR, "cmap_qualitative.jpg"), dpi=300, bbox_inches="tight")plt.close(fig)

3)发散色带
import osimport numpy as npimport matplotlib as mplimport matplotlib.pyplot as pltfrom matplotlib import font_manager as fmfm.fontManager.addfont(r"C:\Windows\Fonts\times.ttf")fm.fontManager.addfont(r"C:\Windows\Fonts\simsun.ttc")mpl.rcParams["font.family"] = ["Times New Roman", "SimSun"]mpl.rcParams["axes.unicode_minus"] = FalseOUT_DIR = r"D:\py_figs"os.makedirs(OUT_DIR, exist_ok=True)# 假数据:误差场(正负)err = (np.random.randn(50, 80)) * 1.2 # K# 发散:必须对称范围a = 3.0fig, ax = plt.subplots(figsize=(6, 4))im = ax.imshow(err, cmap="RdBu_r", vmin=-a, vmax=a)ax.set_title("发散变量示例:Bias (pred - true)")cbar = fig.colorbar(im, ax=ax)cbar.set_label("Bias (K) / 偏差(K)")fig.savefig(os.path.join(OUT_DIR, "cmap_diverging.jpg"), dpi=300, bbox_inches="tight")plt.close(fig)

配色不是美化,而是数据语义的一部分——连续用顺序色带、分类用定性色带、正负偏差用发散色带;颜色选对了,图才能把结论讲清楚。
——期待你的关注——