Lets start by walking through the code you have
# get some uniformly sampled data, padded out a bit
colors_i = np.concatenate((np.linspace(0, 1., N), (0.,0.,0.,0.)))
# sample the input colormap at our sample points
colors_rgba = cmap(colors_i)
# indices for color map
indices = np.linspace(0, 1., N+1)
# dict to pass to the LinearSegmentedColormap
cdict = {}
# loop over the colors
for ki,key in enumerate(('red','green','blue')):
# in each color assemble a list that looks like
#[...,
# (indices[2], colors_rgba[1,ki], colors_rgba[2,ki]),
# (indices[3], colors_rgba[2,ki], colors_rgba[3,ki]),
# ....]
cdict[key] = [ (indices[i], colors_rgba[i-1,ki], colors_rgba[i,ki]) for i in xrange(N+1) ]
# The color for a number between [indices[2], indices[3]] are interpolated
# between colors_rgba[2,ki] and colors_rgba[2,ki] which are the same
# which is what gives you the discrete blocks.
# Construct and return colormap object.
return cols.LinearSegmentedColormap(cmap.name + "_%d"%N, cdict, 1024)
So now the question is how to create a color map with a 'doubled' white band in the middle. I would change the function bit to have it take in two color maps (top and bottom)
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import cm
import matplotlib.colors as cols
from numpy.random import randn
def cmap_double_discretize(cmap_bottom, cmap_top, N, split=.5):
"""
Generates a descritized color map using two existing color maps
Parameters
----------
cmap_bottom : cmap
The bottom cmap
cmap_top : cmap
The top cmap
N : int
The number of bins in each color map
split : float, optional
Where to join the maps, must be in [0, 1]
"""
# sanity check
assert split < 1 and split > 0
# set up the data structure
cdict = {lab: [] for lab in ('red','green','blue')}
# do this in a fancy loop to a) save typing, b) make it easy to
# retrofit to do arbitrary splits
for cmap, ends in zip((cmap_bottom, cmap_top), ((0, split), (split, 1))):
# run over the _whole_ range for each color map
colors_i = np.concatenate((np.linspace(0, 1., N), (0.,0.,0.,0.)))
# map the color
colors_rgba = cmap(colors_i)
# get the values
indices = np.linspace(ends[0], ends[1], N+1, endpoint=True)
for ki,key in enumerate(('red','green','blue')):
cdict[key].extend((indices[i], colors_rgba[i-1,ki], colors_rgba[i,ki]) for i in xrange(N+1))
# print cdict
# Return colormap object.
return cols.LinearSegmentedColormap(cmap.name + "_%d"%N, cdict, 1024)
red_cdict = {'red': [(0, 0, 1),
(1, 1, 0)],
'blue': [(0, 0, 0),
(1, 1, 0)],
'green': [(0, 0, 0),
(1, 1, 0)]}
blue_cdict = {'blue': [(0, 0, 1),
(1, 1, 0),],
'red': [(0, 0, 1),
(1, 0, 0)],
'green': [(0, 0, 1),
(1, 0, 0)]}
red_cmap = cols.LinearSegmentedColormap('red', red_cdict, 1024)
blue_cmap = cols.LinearSegmentedColormap('blue', blue_cdict, 1024)
test_cmap = cmap_double_discretize(red_cmap, blue_cmap, 6)
# these don't actually go to white!
# test_cmap = cmap_double_discretize(cm.get_cmap('Reds_r'), cm.get_cmap('Blues'), 6)
fig, ax = plt.subplots()
data = np.clip(randn(250, 250), -1, 1)
cax = ax.pcolor(data, cmap=test_cmap)
plt.colorbar(cax)
plt.show()

You can easily modify this to split across more than two color maps.