I am trying to extract discrete colors from a matplotlib colormap by manipulating this example. However, I cannot find the N
discrete colors that are extracted from the colormap.
In the code below I've used cmap._segmentdata
, but I've found that it is the definition of the entire colormap. Given a colormap and an integer N
, how do I extract N
discrete colors from the colormap and export them in hex-format?
from pylab import * delta = 0.01 x = arange(-3.0, 3.0, delta) y = arange(-3.0, 3.0, delta) X,Y = meshgrid(x, y) Z1 = bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0) Z2 = bivariate_normal(X, Y, 1.5, 0.5, 1, 1) Z = Z2 - Z1 # difference of Gaussians cmap = cm.get_cmap('seismic', 5) # PiYG cmap_colors = cmap._segmentdata def print_hex(r,b,g): if not(0 <= r <= 255 or 0 <= b <= 255 or 0 <= g <= 255): raise ValueError('rgb not in range(256)') print '#%02x%02x%02x' % (r, b, g) for i in range(len(cmap_colors['blue'])): r = int(cmap_colors['red'][i][2]*255) b = int(cmap_colors['blue'][i][2]*255) g = int(cmap_colors['green'][i][2]*255) print_hex(r, g, b) im = imshow(Z, cmap=cmap, interpolation='bilinear', vmax=abs(Z).max(), vmin=-abs(Z).max()) axis('off') colorbar() show()
Scientifically, the human brain perceives various intuition based on the different colors they see. Matplotlib provides some nice colormaps you can use, such as Sequential colormaps, Diverging colormaps, Cyclic colormaps, and Qualitative colormaps.
Colormap. The new default colormap used by matplotlib. cm. ScalarMappable instances is 'viridis' (aka option D).
You can get a tuple of rgba values for the segment with index i
by calling cmap(i)
. There is also already a function that turns rgb values into hex. As Joe Kington wrote in the comments, you can use matplotlib.colors.rgb2hex
. Therefore, a possible solution would be:
from pylab import * cmap = cm.get_cmap('seismic', 5) # PiYG for i in range(cmap.N): rgba = cmap(i) # rgb2hex accepts rgb or rgba print(matplotlib.colors.rgb2hex(rgba))
The output is:
#00004c #0000ff #ffffff #ff0000 #7f0000
For future reference: My CMasher package provides a function called take_cmap_colors()
(https://cmasher.readthedocs.io/user/usage.html#taking-colormap-colors), which allows one to take any number of discrete colors from a given colormap and return them in any format (8-bit, normalized or HEX) they want.
So, if you for example wanted to take 5 colors in HEX from the viridis
colormap, you could do this with:
import cmasher as cmr colors = cmr.take_cmap_colors('viridis', 5, return_fmt='hex')
or if you want all colors in HEX from a colormap in a specific value range, you can do that with:
colors = cmr.take_cmap_colors('viridis', None, cmap_range=(0.2, 0.8), return_fmt='hex')
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With