Colormap in PyComplexHeatmap

Default matplotlib colormaps

991fd88bfade4e10a5aa37d2b289b1c1 465091b857e847129d4a965ea32d8ccb 27d2259ab53a4fe4979aa83579a34f82 7a635173a9bd4eac918a2105eac14c7a d7b3b7c7a66249f69b7cb7bdf116a9df decd3f5c176248aea0d2f1258fc14db1 e38d5d2f82b74714ab0c353a71f80965

Build-in colormaps (Not included in matplotlib default cmaps)

In addition to the above matplotlib colormaps, PyComplexHeatmap also provide colormaps from package palettable (run pip install palettable before using palettable colormap). Users can use all those build-in colormaps after import PyComplexHeatmap

[17]:
import os,sys
%matplotlib inline
import matplotlib
import matplotlib.pylab as plt
sys.path.append(os.path.expanduser("~/Projects/Github/PyComplexHeatmap"))
import PyComplexHeatmap
print(PyComplexHeatmap.__version__)
from PyComplexHeatmap.colors import get_palettable_colors
1.7.2.dev0+g8abf70a.d20240415
[18]:
df=get_palettable_colors()
df
[18]:
category prefix name type number max_n colors hex_colors mpl_colors mpl_colormap Name
1094 sequential Acton Acton_20 sequential 20 20 [(46, 33, 77), (59, 45, 88), (74, 58, 101), (8... [#2E214D, #3B2D58, #4A3A65, #594672, #6A527E, ... [(0.1803921568627451, 0.12941176470588237, 0.3... <matplotlib.colors.LinearSegmentedColormap obj... Acton
1095 sequential Acton Acton_20_r sequential 20 20 [(230, 230, 240), (225, 216, 231), (219, 202, ... [#E6E6F0, #E1D8E7, #DBCADD, #D7BDD4, #D5AFCB, ... [(0.9019607843137255, 0.9019607843137255, 0.94... <matplotlib.colors.LinearSegmentedColormap obj... Acton_r
272 sequential Algae Algae_20 sequential 20 20 [[215, 249, 208], [199, 237, 189], [181, 225, ... [#D7F9D0, #C7EDBD, #B5E1A9, #A4D698, #92CB86, ... [(0.8431372549019608, 0.9764705882352941, 0.81... <matplotlib.colors.LinearSegmentedColormap obj... Algae
273 sequential Algae Algae_20_r sequential 20 20 [[18, 36, 20], [22, 47, 29], [24, 59, 38], [26... [#122414, #162F1D, #183B26, #1A472E, #1A5336, ... [(0.07058823529411765, 0.1411764705882353, 0.0... <matplotlib.colors.LinearSegmentedColormap obj... Algae_r
308 sequential Amp Amp_20 sequential 20 20 [[241, 237, 236], [234, 221, 218], [228, 205, ... [#F1EDEC, #EADDDA, #E4CDC6, #DFBEB3, #DBAE9F, ... [(0.9450980392156862, 0.9294117647058824, 0.92... <matplotlib.colors.LinearSegmentedColormap obj... Amp
... ... ... ... ... ... ... ... ... ... ... ...
2719 qualitative Vivid Vivid_10_r qualitative 10 10 [[237, 100, 90], [118, 78, 159], [47, 138, 196... [#ED645A, #764E9F, #2F8AC4, #DAA51B, #24796C, ... [(0.9294117647058824, 0.39215686274509803, 0.3... <matplotlib.colors.LinearSegmentedColormap obj... Vivid_r
238 sequential agGrnYl agGrnYl_7 sequential 7 7 [[36, 86, 104], [15, 114, 121], [13, 143, 129]... [#245668, #0F7279, #0D8F81, #39AB7E, #6EC574, ... [(0.1411764705882353, 0.33725490196078434, 0.4... <matplotlib.colors.LinearSegmentedColormap obj... agGrnYl
239 sequential agGrnYl agGrnYl_7_r sequential 7 7 [[237, 239, 93], [169, 220, 103], [110, 197, 1... [#EDEF5D, #A9DC67, #6EC574, #39AB7E, #0D8F81, ... [(0.9294117647058824, 0.9372549019607843, 0.36... <matplotlib.colors.LinearSegmentedColormap obj... agGrnYl_r
250 sequential agSunset agSunset_7 sequential 7 7 [[75, 41, 145], [135, 44, 162], [192, 54, 157]... [#4B2991, #872CA2, #C0369D, #EA4F88, #FA7876, ... [(0.29411764705882354, 0.1607843137254902, 0.5... <matplotlib.colors.LinearSegmentedColormap obj... agSunset
251 sequential agSunset agSunset_7_r sequential 7 7 [[237, 217, 163], [246, 169, 122], [250, 120, ... [#EDD9A3, #F6A97A, #FA7876, #EA4F88, #C0369D, ... [(0.9294117647058824, 0.8509803921568627, 0.63... <matplotlib.colors.LinearSegmentedColormap obj... agSunset_r

186 rows × 11 columns

[20]:
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
cmaps = {}

gradient = np.linspace(0, 1, 256)
gradient = np.vstack((gradient, gradient))


def plot_color_gradients(category, cmap_list):
    # Create figure and adjust figure height to number of colormaps
    nrows = len(cmap_list)
    figh = 0.35 + 0.15 + (nrows + (nrows - 1) * 0.1) * 0.22
    fig, axs = plt.subplots(nrows=nrows + 1, figsize=(6.4, figh))
    fig.subplots_adjust(top=1 - 0.35 / figh, bottom=0.15 / figh,
                        left=0.2, right=0.99)
    axs[0].set_title(f'{category} colormaps', fontsize=14)

    for ax, name in zip(axs, cmap_list):
        if isinstance(name,str):
            cmap=mpl.colormaps[name]
            text=name
        else:
            cmap=name
            text=name.name
        ax.imshow(gradient, aspect='auto', cmap=cmap)
        ax.text(-0.01, 0.5, text, va='center', ha='right', fontsize=10,
                transform=ax.transAxes)
        N=cmap.N
        if N < 256:
            ax.text(1.01, 0.5, N, va='center', ha='left', fontsize=10,
                transform=ax.transAxes)

    # Turn off *all* ticks & spines, not just the ones with colormaps.
    for ax in axs:
        ax.set_axis_off()

    # Save colormap list for later.
    cmaps[category] = cmap_list
[21]:
plot_color_gradients('Sequential',df.loc[(df.category=='sequential') & (df.Name.apply(lambda x:not x.endswith('_r')))].sort_values('max_n').mpl_colormap.tolist())
../_images/notebooks_colormap_6_0.png
[22]:
plot_color_gradients('Diverging',df.loc[(df.category=='diverging') & (df.Name.apply(lambda x:not x.endswith('_r')))].sort_values('max_n').mpl_colormap.tolist()+['parula'])
../_images/notebooks_colormap_7_0.png
[48]:
# mpl.colormaps['parula']
[24]:
from matplotlib.colors import LinearSegmentedColormap, ListedColormap
df1=df.loc[(df.category=='qualitative') & (df.Name.apply(lambda x:not x.endswith('_r')))].sort_values('max_n')
plot_color_gradients('Qualitative',[ListedColormap(c,name=name) for c,name in zip(
    df1.mpl_colors.tolist(),df1.Name.tolist())]+['random50','random100'])
../_images/notebooks_colormap_9_0.png
[49]:
# mpl.colormaps['random50']

How to use the Build-in cmap?

Just set cmap="custom_cmap" in ClusterMapPlotter or all kinds of annotation

[41]:
from PyComplexHeatmap import *
df = pd.DataFrame(['GroupA'] * 5 + ['GroupB'] * 5, columns=['AB'])
df['CD'] = ['C'] * 3 + ['D'] * 3 + ['G'] * 4
df['EF'] = ['E'] * 6 + ['F'] * 2 + ['H'] * 2
df['F'] = np.random.normal(0, 1, 10)
df.index = ['sample' + str(i) for i in range(1, df.shape[0] + 1)]

df_heatmap = pd.DataFrame(np.random.randn(30, 10), columns=['sample' + str(i) for i in range(1, 11)])
df_heatmap.index = ["Fea" + str(i) for i in range(1, df_heatmap.shape[0] + 1)]
df_heatmap.iloc[1, 2] = np.nan

plt.figure(figsize=(3.5, 5))
cm = ClusterMapPlotter(
        data=df_heatmap,
        col_cluster=True,row_cluster=True,
        col_split=df.AB,row_split=2,
        col_split_gap=0.5,row_split_gap=0.8,
        label='values',row_dendrogram=True,
        show_rownames=False,show_colnames=True,
        tree_kws={'row_cmap': 'Set1'},verbose=0,legend_gap=5,
        cmap='Vik',xticklabels_kws={'labelrotation':-90,'labelcolor':'blue'},
        ylabel="Features",xlabel="Samples")
# plt.savefig("example0.pdf", bbox_inches='tight')
plt.show()
../_images/notebooks_colormap_12_0.png

A suffix “_r” could be added to all cmap to reverse the colormap, for example:

[47]:
plt.figure(figsize=(3.5, 5))
cm = ClusterMapPlotter(
        data=df_heatmap,
        col_cluster=True,row_cluster=True,
        col_split=df.AB,row_split=2,
        col_split_gap=0.5,row_split_gap=0.8,
        label='values',row_dendrogram=True,
        show_rownames=True,show_colnames=True,row_names_side='right',
        tree_kws={'row_cmap': 'Set1'},verbose=0,legend_gap=5,
        cmap='RedYellowBlue_r',xticklabels_kws={'labelrotation':-90,'labelcolor':'blue'}) #PuOr_r,RdYlGn_r
plt.show()
../_images/notebooks_colormap_14_0.png