Reducing the number of ticks in the colorbar using Matplotlib

Question:

How do I reduce the number of ticks on the colorbar and ensure that the values are equi-spaced? Basically, the 8 color bands have to be equally spaced between Amin=257 and Amax=454 i.e. the length of each colorband =(Amax-Amin)/8. I present the current and expected outputs.

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()

The current output is

enter image description here

The expected output is

enter image description here

Asked By: user19862793

||

Answers:

Once you have created the colorbar, add this line to set the ticks to the way shown in your pic.

cb.set_ticks(np.arange(Amin, Amax+1, (Amax-Amin)/8).astype(np.int64))

Plot

enter image description here

Answered By: Redox
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.