Python中如何将colorbar划分为6个间隔为100的区间?
解决Matplotlib Colorbar限制为6个区间(每区间100)的问题
你当前代码的colorbar出现8个区间,核心原因是使用的Dark2属于离散型配色方案,本身自带8种固定颜色,仅设置ticks无法改变实际区间数量。要实现6个各100的区间,需通过以下调整:
修改后的完整代码
import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np from matplotlib.colors import BoundaryNorm from matplotlib import cm from numpy import nan fig, ax = plt.subplots(1) n = 3 N = 2*n*(n-1) J = [[3, 6, 7, 8, 9, 10, 11]] J[0].sort() XI = np.array([[0, 1, 2, 4, 5]]) X = np.array([[100.1, 200.9, 304.5, 430.9, 578.6]]) C1 = nan # 插入空值 for i in J[0]: X = np.insert(X, i, [C1], axis=1) Amin = 0 Amax = 600.0 # 1. 定义区间边界:0,100,200,...,600(共7个边界,对应6个区间) boundaries = np.arange(Amin, Amax + 100, 100) # 2. 使用BoundaryNorm生成离散区间的归一化器 norm = BoundaryNorm(boundaries, ncolors=6, clip=True) # 3. 截取Dark2的前6种颜色(或替换为连续配色如'viridis') color = cm.get_cmap('Dark2', 6) # 4. 调整颜色映射逻辑:通过norm直接计算颜色索引 color_list = [] for val in X[0]: if not np.isnan(val): color_list.append(color(norm(val))) else: color_list.append((1,1,1,0)) # 空值设为透明 # 绘制图形部分保持不变 id = 0 for j in range(0, n): for k in range(n-1): ax.hlines(200+200*(n-j-1)+5*n, 200*(k+1)+5*n, 200*(k+2)+5*n, zorder=0, linewidth=5.0, colors=color_list[id]) id += 1 for i in range(0, n): rect = mpl.patches.Rectangle((200+200*i, 200+200*j), 10*n, 10*n, linewidth=1, edgecolor='black', facecolor='black') ax.add_patch(rect) if j < n-1: ax.vlines(200+200*i+5*n, 200*(n-1-j)+5*n, 200*(n-j)+5*n, zorder=0, linewidth=5.0, colors=color_list[id]) id += 1 # 5. 生成colorbar,匹配离散区间 cb = fig.colorbar(cm.ScalarMappable(cmap=color, norm=norm)) # 设置刻度为区间中点(更直观),或用boundaries[:-1]显示区间左边界 cb.set_ticks([50, 150, 250, 350, 450, 550]) cb.set_ticklabels(['0-100', '100-200', '200-300', '300-400', '400-500', '500-600']) cb.set_label("ΔP (N/m$^{2}$)") ax.set_xlim(left=0, right=220*n) ax.set_ylim(bottom=0, top=220*n) plt.axis('off') plt.title("Time = 0.0", fontsize=20) plt.show()
关键修改说明
- 替换归一化器:用
BoundaryNorm替代原Normalize,通过boundaries明确指定6个区间的边界,确保颜色与区间严格对应。 - 调整配色方案:将
Dark2截断为6种颜色(cm.get_cmap('Dark2',6)),避免原8色导致的多余区间;若偏好连续配色,可直接替换为viridis、plasma等。 - 优化颜色映射:通过
norm(val)直接计算颜色索引,替代手动比例计算,逻辑更严谨且适配离散区间。 - 自定义colorbar刻度:设置刻度为区间中点,并添加区间范围标签,让colorbar更清晰易懂。
内容的提问来源于stack exchange,提问作者AEinstein
相关产品推荐
相关产品推荐

