如何使用Matplotlib减少colorbar刻度数量并实现等间距刻度?
问题:减少Matplotlib色条刻度数量并实现等间距划分
需求:将Matplotlib色条设置为8个颜色带,在Amin=257和Amax=454之间等间距划分,每个颜色带长度=(454-257)/8,同时确保色条刻度数值等间距分布。
当前实现代码
import matplotlib as mpl import matplotlib.pyplot as plt from matplotlib.patches import Rectangle import numpy as np from matplotlib.colors import Normalize from matplotlib import cm import math from numpy import nan fig,aPe = plt.subplots(1) n=3 N=2*n*(n-1) J = np.array([[]]) Pe=np.array([[394.20560747663563, 408.7929050665396 , 419.132709901089 , 398.95097406721044, 403.81198021076113, 430.00914784982064, 424.50127213826016, 453.54817733128607, 441.4651085668709 , 447.42507960635163, 413.8982415602072 , 390.3025816600353 ], [394.20560747663563, 408.7929050665396 , 419.132709901089 , 398.95097406721044, 403.81198021076113, 430.00914784982064, 424.50127213826016, 453.5481773312857 , 347.7309476270773 , 257.42585381716805, 413.8982415602072 , 390.3025816600353 ]]) C1 = nan for i in J[0]: Pe = np.insert(Pe, i, [C1], axis=1) print("Pe =", [Pe]) for i in range(0,len(Pe)): Max=max(max(Pe[i]), max(Pe[i])) Min=min(min(Pe[i]), min(Pe[i])) a=Min b=Max Amax= math.ceil(Max) Amin= math.floor(Min) print(Amax, Amin) color = cm.get_cmap('Dark2') norm = Normalize(vmin=Amin, vmax=Amax) color_list = [] for i in range(len(Pe[0])): color_list.append(color(((Pe[0,i])-Amin)/(Amax-Amin))) id = 0 for j in range(0, n): for k in range(n-1): aPe.hlines(200+200*(n-j-1)+5*n, 200*(k+1)+5*n, 200*(k+2)+5*n, zorder=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') aPe.add_patch(rect) if j < n-1: aPe.vlines(200+200*i+5*n, 200*(n-1-j)+5*n, 200*(n-j)+5*n, zorder=0, colors=color_list[id]) id += 1 cb = fig.colorbar(cm.ScalarMappable(cmap=color, norm=norm), ticks=np.arange(Amin, Amax+len(color.colors), len(color.colors))) cb.set_label("Entry pressure (N/m$^{2}$)") aPe.set_xlim(left = 0, right = 220*n) aPe.set_ylim(bottom = 0, top = 220*n) plt.axis('off') plt.show()
当前输出问题
色条刻度数量过多,且刻度间距不均匀,未按8个等间距颜色带的要求划分,与预期效果不符。
预期效果
色条包含8个等间距颜色带,对应9个等间距刻度值(从257到454均匀分布),每个颜色带的数值范围为(454-257)/8=24.625。
解决方案及修改后的代码
关键修改点:
- 固定Amin和Amax:直接设置为需求中的257和454,避免通过数据计算导致范围偏差。
- 生成等间距刻度:使用
np.linspace(Amin, Amax, 9)生成9个等间距刻度点,对应8个颜色区间。 - 确保颜色映射正确:显式指定colormap的颜色数量为8,使用归一化对象直接计算颜色,保证每个数据点对应正确的颜色带。
修改后的完整代码:
import matplotlib as mpl import matplotlib.pyplot as plt from matplotlib.patches import Rectangle import numpy as np from matplotlib.colors import Normalize from matplotlib import cm from numpy import nan fig,aPe = plt.subplots(1) n=3 N=2*n*(n-1) J = np.array([[]]) Pe=np.array([[394.20560747663563, 408.7929050665396 , 419.132709901089 , 398.95097406721044, 403.81198021076113, 430.00914784982064, 424.50127213826016, 453.54817733128607, 441.4651085668709 , 447.42507960635163, 413.8982415602072 , 390.3025816600353 ], [394.20560747663563, 408.7929050665396 , 419.132709901089 , 398.95097406721044, 403.81198021076113, 430.00914784982064, 424.50127213826016, 453.5481773312857 , 347.7309476270773 , 257.42585381716805, 413.8982415602072 , 390.3025816600353 ]]) C1 = nan for i in J[0]: Pe = np.insert(Pe, i, [C1], axis=1) print("Pe =", [Pe]) # 固定为需求的Amin和Amax Amin = 257 Amax = 454 print(Amax, Amin) # 显式指定Dark2 colormap使用8个颜色,匹配需求的8个颜色带 color = cm.get_cmap('Dark2', 8) norm = Normalize(vmin=Amin, vmax=Amax) color_list = [] for val in Pe[0]: color_list.append(color(norm(val))) # 用归一化对象直接计算,简洁不易错 id = 0 for j in range(0, n): for k in range(n-1): aPe.hlines(200+200*(n-j-1)+5*n, 200*(k+1)+5*n, 200*(k+2)+5*n, zorder=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') aPe.add_patch(rect) if j < n-1: aPe.vlines(200+200*i+5*n, 200*(n-1-j)+5*n, 200*(n-j)+5*n, zorder=0, colors=color_list[id]) id += 1 # 生成9个等间距刻度(8个区间对应9个刻度点) ticks = np.linspace(Amin, Amax, 9) cb = fig.colorbar(cm.ScalarMappable(cmap=color, norm=norm), ticks=ticks) cb.set_label("Entry pressure (N/m$^{2}$)") # 可选:将刻度标签转为整数显示 # cb.set_ticklabels([int(t) for t in ticks]) aPe.set_xlim(left = 0, right = 220*n) aPe.set_ylim(bottom = 0, top = 220*n) plt.axis('off') plt.show()
修改说明:
- 显式指定
cm.get_cmap('Dark2', 8)确保colormap使用8个离散颜色,完美匹配需求的8个颜色带。 - 使用
norm(val)直接进行归一化计算,替代手动计算,代码更简洁且不易出错。 np.linspace(Amin, Amax, 9)生成从257到454的9个等间距数值,对应8个颜色区间,保证刻度均匀分布。
内容的提问来源于stack exchange,提问作者user19862793
相关产品推荐
相关产品推荐

