You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 17:15:38