From aeac97a58d4c7710c83da30f78d015a6b3528e63 Mon Sep 17 00:00:00 2001 From: zmoon Date: Sat, 6 Nov 2021 12:54:02 -0600 Subject: [PATCH 01/17] initial changes - use Path instead of os.path - check N when loading - starting __all__ --- cmcrameri/__init__.py | 7 ++++++- cmcrameri/cm.py | 29 ++++++++++++++++++----------- tests/test_cmcrameri.py | 12 +++++++----- 3 files changed, 31 insertions(+), 17 deletions(-) diff --git a/cmcrameri/__init__.py b/cmcrameri/__init__.py index 6f5d33b..c13077b 100644 --- a/cmcrameri/__init__.py +++ b/cmcrameri/__init__.py @@ -4,10 +4,15 @@ http://www.fabiocrameri.ch/colourmaps.php See README.md for an overview and instructions """ - from __future__ import absolute_import from . import cm +__all__ = ( + "cm", + "paths", + "show_cmaps", +) + __authors__ = ['Callum Rollo '] diff --git a/cmcrameri/cm.py b/cmcrameri/cm.py index 3f6cda8..337fa11 100755 --- a/cmcrameri/cm.py +++ b/cmcrameri/cm.py @@ -6,31 +6,39 @@ Created by Callum Rollo 2020-05-06 """ +from pathlib import Path +import matplotlib.pyplot as plt import numpy as np -from pathlib import Path from matplotlib.colors import LinearSegmentedColormap -import matplotlib.pyplot as plt -import os + # Find the colormap text files and make a list of the paths -text_file_folder = os.path.join(os.path.dirname(__file__), 'cmaps') -paths = list(Path(text_file_folder).glob('*.txt')) +text_file_folder = Path(__file__).parent / 'cmaps' +paths = sorted(text_file_folder.glob('*.txt')) crameri_cmaps = dict() crameri_cmaps_r = dict() crameri_cmaps_s = dict() for cmap_path in paths: # Name of colour map taken from text file - cmap_name = os.path.split(cmap_path)[1][:-4] - cm_data = np.loadtxt(str(cmap_path)) + cmap_name = cmap_path.stem + is_categorical = cmap_name.endswith("S") + is_cyclic = cmap_name.endswith("O") + + data = np.loadtxt(cmap_path) + N = data.shape[0] + + N0 = 256 if not is_categorical else 100 + assert N == N0, f"N should be {N0} but is {N}" + # Make a linear segmented colour map if cmap_name[-1] == 'S': - crameri_cmaps_s[cmap_name] = LinearSegmentedColormap.from_list(cmap_name, cm_data) + crameri_cmaps_s[cmap_name] = LinearSegmentedColormap.from_list(cmap_name, data) plt.cm.register_cmap(name='cmc.' + cmap_name, cmap=crameri_cmaps_s[cmap_name]) continue - crameri_cmaps[cmap_name] = LinearSegmentedColormap.from_list(cmap_name, cm_data) + crameri_cmaps[cmap_name] = LinearSegmentedColormap.from_list(cmap_name, data) plt.cm.register_cmap(name='cmc.' + cmap_name, cmap=crameri_cmaps[cmap_name]) # reverse the colour map and add this to the dictionary crameri_cmaps_r, mpt fpr categorical maps - crameri_cmaps_r[cmap_name + '_r'] = LinearSegmentedColormap.from_list(cmap_name + '_r', cm_data[::-1, :]) + crameri_cmaps_r[cmap_name + '_r'] = LinearSegmentedColormap.from_list(cmap_name + '_r', data[::-1, :]) plt.cm.register_cmap(name='cmc.' + cmap_name + '_r', cmap=crameri_cmaps_r[cmap_name + '_r']) @@ -38,7 +46,6 @@ def show_cmaps(): """ A rough function for a quick plot of the colourmaps. Nowhere near as pretty as the original see http://www.fabiocrameri.ch/colourmaps.php - :return: """ x = np.linspace(0, 100, 100)[None, :] fig, axs = plt.subplots(int(np.ceil(len(crameri_cmaps) / 7)), 7, figsize=(22, 10)) diff --git a/tests/test_cmcrameri.py b/tests/test_cmcrameri.py index a677bda..e0bf21a 100644 --- a/tests/test_cmcrameri.py +++ b/tests/test_cmcrameri.py @@ -1,10 +1,11 @@ """ Test that the program a) finds the text files and b) creates colourmaps """ +import sys +from pathlib import Path + from matplotlib.colors import LinearSegmentedColormap from matplotlib.pyplot import get_cmap -from pathlib import Path -import sys library_dir = Path(__file__).parent.parent.absolute() sys.path.append(str(library_dir)) @@ -41,6 +42,7 @@ def test_get_cmap(): assert alt_cmap is cmap -test_find_files() -test_cmap_import() -test_get_cmap() +if __name__ == "__main__": + test_find_files() + test_cmap_import() + test_get_cmap() From 37ba48f486d16ed09dfcfd23753873cbbca071e8 Mon Sep 17 00:00:00 2001 From: zmoon Date: Sat, 6 Nov 2021 13:09:47 -0600 Subject: [PATCH 02/17] Categorize cmaps when loading --- cmcrameri/__init__.py | 1 + cmcrameri/cm.py | 38 ++++++++++++++++++++++++++++++++++---- 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/cmcrameri/__init__.py b/cmcrameri/__init__.py index c13077b..f423c87 100644 --- a/cmcrameri/__init__.py +++ b/cmcrameri/__init__.py @@ -6,6 +6,7 @@ """ from __future__ import absolute_import from . import cm +from .cm import show_cmaps __all__ = ( "cm", diff --git a/cmcrameri/cm.py b/cmcrameri/cm.py index 337fa11..1c6d414 100755 --- a/cmcrameri/cm.py +++ b/cmcrameri/cm.py @@ -12,6 +12,27 @@ import numpy as np from matplotlib.colors import LinearSegmentedColormap + +sequential_cmap_names = ( + "batlow", "batlowW", "batlowK", + "devon", "lajolla", "bamako", + "davos", "bilbao", "nuuk", + "oslo", "grayC", "hawaii", + "lapaz", "tokyo", "buda", + "acton", "turku", "imola", +) + +diverging_cmap_names = ( + "broc", "cork", "vik", + "lisbon", "tofino", "berlin", + "roma", "bam", "vanimo", +) + +multi_sequential_cmap_names = ( + "oleron", "bukavu", "fes", +) + + # Find the colormap text files and make a list of the paths text_file_folder = Path(__file__).parent / 'cmaps' paths = sorted(text_file_folder.glob('*.txt')) @@ -19,19 +40,28 @@ crameri_cmaps_r = dict() crameri_cmaps_s = dict() for cmap_path in paths: - # Name of colour map taken from text file + # Name of colour map is taken from the text file name cmap_name = cmap_path.stem is_categorical = cmap_name.endswith("S") - is_cyclic = cmap_name.endswith("O") + # Categorize + cmap_name_base = cmap_name if not is_categorical else cmap_name[:-1] + is_cyclic = cmap_name_base.endswith("O") + is_sequential = cmap_name_base in sequential_cmap_names + is_diverging = cmap_name_base in diverging_cmap_names + is_multi_sequential = cmap_name_base in multi_sequential_cmap_names + assert sum( + [is_cyclic, is_sequential, is_diverging, is_multi_sequential] + ) == 1, f"{cmap_name} not categorized properly" + + # Load data data = np.loadtxt(cmap_path) N = data.shape[0] - N0 = 256 if not is_categorical else 100 assert N == N0, f"N should be {N0} but is {N}" # Make a linear segmented colour map - if cmap_name[-1] == 'S': + if is_categorical: crameri_cmaps_s[cmap_name] = LinearSegmentedColormap.from_list(cmap_name, data) plt.cm.register_cmap(name='cmc.' + cmap_name, cmap=crameri_cmaps_s[cmap_name]) continue From 242fad6358b75e60dd6c2ecc8d70764589448bdb Mon Sep 17 00:00:00 2001 From: zmoon Date: Sat, 6 Nov 2021 13:23:29 -0600 Subject: [PATCH 03/17] Check name for categorical too --- cmcrameri/cm.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/cmcrameri/cm.py b/cmcrameri/cm.py index 1c6d414..1ce61f3 100755 --- a/cmcrameri/cm.py +++ b/cmcrameri/cm.py @@ -7,6 +7,7 @@ 2020-05-06 """ from pathlib import Path +from types import SimpleNamespace import matplotlib.pyplot as plt import numpy as np @@ -32,6 +33,14 @@ "oleron", "bukavu", "fes", ) +categorical_cmap_base_names = tuple( + name + for name in sequential_cmap_names + if name not in {"batlowW", "batlowK"} +) + +cm = SimpleNamespace() # or NamedTuple? + # Find the colormap text files and make a list of the paths text_file_folder = Path(__file__).parent / 'cmaps' @@ -50,9 +59,12 @@ is_sequential = cmap_name_base in sequential_cmap_names is_diverging = cmap_name_base in diverging_cmap_names is_multi_sequential = cmap_name_base in multi_sequential_cmap_names + + # Check categorization assert sum( [is_cyclic, is_sequential, is_diverging, is_multi_sequential] ) == 1, f"{cmap_name} not categorized properly" + assert not is_categorical or cmap_name_base in categorical_cmap_base_names # Load data data = np.loadtxt(cmap_path) From 97d5ed87b00a4d6dbdeee490a5f6e4dd9c362fc0 Mon Sep 17 00:00:00 2001 From: zmoon Date: Sat, 6 Nov 2021 14:16:02 -0600 Subject: [PATCH 04/17] Fix plot for cm as SimpleNamespace --- cmcrameri/__init__.py | 3 +- cmcrameri/_cm.py | 140 ++++++++++++++++++++++++++++++++++++++++++ cmcrameri/cm.py | 107 -------------------------------- 3 files changed, 141 insertions(+), 109 deletions(-) create mode 100755 cmcrameri/_cm.py delete mode 100755 cmcrameri/cm.py diff --git a/cmcrameri/__init__.py b/cmcrameri/__init__.py index f423c87..bce387e 100644 --- a/cmcrameri/__init__.py +++ b/cmcrameri/__init__.py @@ -5,8 +5,7 @@ See README.md for an overview and instructions """ from __future__ import absolute_import -from . import cm -from .cm import show_cmaps +from ._cm import cm, paths, show_cmaps __all__ = ( "cm", diff --git a/cmcrameri/_cm.py b/cmcrameri/_cm.py new file mode 100755 index 0000000..dc4ce52 --- /dev/null +++ b/cmcrameri/_cm.py @@ -0,0 +1,140 @@ +""" +Perceptually uniform colourmaps for geosciences + +Packaging of colourmaps created by Fabio Crameri http://www.fabiocrameri.ch/colourmaps.php + +Created by Callum Rollo +2020-05-06 +""" +from pathlib import Path +from types import SimpleNamespace + +import matplotlib.pyplot as plt +import numpy as np +from matplotlib.colors import ListedColormap + + +sequential_cmap_names = ( + "batlow", "batlowW", "batlowK", + "devon", "lajolla", "bamako", + "davos", "bilbao", "nuuk", + "oslo", "grayC", "hawaii", + "lapaz", "tokyo", "buda", + "acton", "turku", "imola", +) + +diverging_cmap_names = ( + "broc", "cork", "vik", + "lisbon", "tofino", "berlin", + "roma", "bam", "vanimo", +) + +multi_sequential_cmap_names = ( + "oleron", "bukavu", "fes", +) + +categorical_cmap_base_names = tuple( + name + for name in sequential_cmap_names + if name not in {"batlowW", "batlowK"} +) +categorical_cmap_names = tuple( + f"{name}S" + for name in categorical_cmap_base_names +) + +cyclic_cmap_base_names = ( + "roma", "bam", + "broc", "cork", "vik", +) +cyclic_cmap_names = tuple( + f"{name}O" + for name in cyclic_cmap_base_names +) + +cm = SimpleNamespace() # or NamedTuple? + +# Prepended to cmap names when registering +cmap_reg_prefix = "cmc." + + +# Find the colormap text files and make a list of the paths +cmap_dir = Path(__file__).parent / 'cmaps' +paths = sorted(cmap_dir.glob('*.txt')) +for cmap_path in paths: + # Name of colour map is taken from the text file name + cmap_name = cmap_path.stem + + # Categorize + is_categorical = cmap_name.endswith("S") + is_cyclic = cmap_name.endswith("O") + cmap_name_base = cmap_name if not (is_categorical or is_cyclic) else cmap_name[:-1] + if not is_cyclic: + is_sequential = cmap_name_base in sequential_cmap_names + is_diverging = cmap_name_base in diverging_cmap_names + is_multi_sequential = cmap_name_base in multi_sequential_cmap_names + else: + is_sequential = is_diverging = is_multi_sequential = False + + # Check categorization + assert sum( + [is_cyclic, is_sequential, is_diverging, is_multi_sequential] + ) == 1, f"{cmap_name} not categorized properly" + assert not is_categorical or cmap_name_base in categorical_cmap_base_names + assert not is_cyclic or cmap_name_base in cyclic_cmap_base_names, cmap_name + + # Load data + data = np.loadtxt(cmap_path) + N = data.shape[0] + N0 = 256 if not is_categorical else 100 + assert N == N0, f"N should be {N0} but is {N}" + + # Create and register colormap + cmap = ListedColormap(colors=data, name=cmap_name) + plt.cm.register_cmap(name=f"{cmap_reg_prefix}{cmap.name}", cmap=cmap) + setattr(cm, cmap.name, cmap) + + # For non-categorical, also create and register reverse version + if not is_categorical: + cmap = cmap.reversed() + plt.cm.register_cmap(name=f"{cmap_reg_prefix}{cmap.name}", cmap=cmap) + setattr(cm, cmap.name, cmap) + + +def show_cmaps(): + """ + A rough function for a quick plot of the colourmaps. + Nowhere near as pretty as the original, + see https://www.fabiocrameri.ch/colourmaps/ + """ + from itertools import chain + + x = np.linspace(0, 100, 100)[np.newaxis, :] + + # all_names = list(vars(cm)) + n_seq = len(sequential_cmap_names) + n_div = len(diverging_cmap_names) + n_mseq = len(multi_sequential_cmap_names) + n_cyc = len(cyclic_cmap_names) + # n_cat = len(categorical_cmap_base_names) + + ncols = 7 + nrows = int(np.ceil((n_seq + n_div + n_mseq + n_cyc) / ncols)) + + fig, axs = plt.subplots(nrows, ncols, figsize=(22, 10)) + fig.subplots_adjust(hspace=.8, wspace=.08) + fig.set_tight_layout(False) + + for ax in axs.flat: + ax.axis('off') + + for ax, cmap_name in zip( + axs.flat, + sorted(chain( + sequential_cmap_names, diverging_cmap_names, + multi_sequential_cmap_names, cyclic_cmap_names, + )) + ): + cmap = getattr(cm, cmap_name) + ax.pcolor(x, cmap=cmap) + ax.text(5, -0.3, cmap.name, fontsize=26) diff --git a/cmcrameri/cm.py b/cmcrameri/cm.py deleted file mode 100755 index 1ce61f3..0000000 --- a/cmcrameri/cm.py +++ /dev/null @@ -1,107 +0,0 @@ -""" -Perceptually uniform colourmaps for geosciences - -Packaging of colourmaps created by Fabio Crameri http://www.fabiocrameri.ch/colourmaps.php - -Created by Callum Rollo -2020-05-06 -""" -from pathlib import Path -from types import SimpleNamespace - -import matplotlib.pyplot as plt -import numpy as np -from matplotlib.colors import LinearSegmentedColormap - - -sequential_cmap_names = ( - "batlow", "batlowW", "batlowK", - "devon", "lajolla", "bamako", - "davos", "bilbao", "nuuk", - "oslo", "grayC", "hawaii", - "lapaz", "tokyo", "buda", - "acton", "turku", "imola", -) - -diverging_cmap_names = ( - "broc", "cork", "vik", - "lisbon", "tofino", "berlin", - "roma", "bam", "vanimo", -) - -multi_sequential_cmap_names = ( - "oleron", "bukavu", "fes", -) - -categorical_cmap_base_names = tuple( - name - for name in sequential_cmap_names - if name not in {"batlowW", "batlowK"} -) - -cm = SimpleNamespace() # or NamedTuple? - - -# Find the colormap text files and make a list of the paths -text_file_folder = Path(__file__).parent / 'cmaps' -paths = sorted(text_file_folder.glob('*.txt')) -crameri_cmaps = dict() -crameri_cmaps_r = dict() -crameri_cmaps_s = dict() -for cmap_path in paths: - # Name of colour map is taken from the text file name - cmap_name = cmap_path.stem - is_categorical = cmap_name.endswith("S") - - # Categorize - cmap_name_base = cmap_name if not is_categorical else cmap_name[:-1] - is_cyclic = cmap_name_base.endswith("O") - is_sequential = cmap_name_base in sequential_cmap_names - is_diverging = cmap_name_base in diverging_cmap_names - is_multi_sequential = cmap_name_base in multi_sequential_cmap_names - - # Check categorization - assert sum( - [is_cyclic, is_sequential, is_diverging, is_multi_sequential] - ) == 1, f"{cmap_name} not categorized properly" - assert not is_categorical or cmap_name_base in categorical_cmap_base_names - - # Load data - data = np.loadtxt(cmap_path) - N = data.shape[0] - N0 = 256 if not is_categorical else 100 - assert N == N0, f"N should be {N0} but is {N}" - - # Make a linear segmented colour map - if is_categorical: - crameri_cmaps_s[cmap_name] = LinearSegmentedColormap.from_list(cmap_name, data) - plt.cm.register_cmap(name='cmc.' + cmap_name, cmap=crameri_cmaps_s[cmap_name]) - continue - crameri_cmaps[cmap_name] = LinearSegmentedColormap.from_list(cmap_name, data) - plt.cm.register_cmap(name='cmc.' + cmap_name, cmap=crameri_cmaps[cmap_name]) - # reverse the colour map and add this to the dictionary crameri_cmaps_r, mpt fpr categorical maps - crameri_cmaps_r[cmap_name + '_r'] = LinearSegmentedColormap.from_list(cmap_name + '_r', data[::-1, :]) - plt.cm.register_cmap(name='cmc.' + cmap_name + '_r', cmap=crameri_cmaps_r[cmap_name + '_r']) - - -def show_cmaps(): - """ - A rough function for a quick plot of the colourmaps. Nowhere near as pretty as the original - see http://www.fabiocrameri.ch/colourmaps.php - """ - x = np.linspace(0, 100, 100)[None, :] - fig, axs = plt.subplots(int(np.ceil(len(crameri_cmaps) / 7)), 7, figsize=(22, 10)) - fig.subplots_adjust(hspace=.8, wspace=.08) - axs = axs.ravel() - for ax in axs: - ax.axis('off') - for c, cmap_selected in enumerate(sorted(crameri_cmaps.keys())): - colourmap = crameri_cmaps[cmap_selected] - axs[c].pcolor(x, cmap=colourmap) - axs[c].text(5, -0.3, cmap_selected, fontsize=26) - - -# So colourmaps can be called in other programs -locals().update(crameri_cmaps) -locals().update(crameri_cmaps_r) -locals().update(crameri_cmaps_s) From a3622e4b79cae914334a31b3cdfecd3c36d5feb0 Mon Sep 17 00:00:00 2001 From: zmoon Date: Sat, 6 Nov 2021 14:44:52 -0600 Subject: [PATCH 05/17] Back to .cm but clean up namespace a bit --- cmcrameri/__init__.py | 6 +- cmcrameri/_cm.py | 140 --------------------------------------- cmcrameri/cm.py | 149 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 153 insertions(+), 142 deletions(-) delete mode 100755 cmcrameri/_cm.py create mode 100755 cmcrameri/cm.py diff --git a/cmcrameri/__init__.py b/cmcrameri/__init__.py index bce387e..09cf12e 100644 --- a/cmcrameri/__init__.py +++ b/cmcrameri/__init__.py @@ -5,11 +5,13 @@ See README.md for an overview and instructions """ from __future__ import absolute_import -from ._cm import cm, paths, show_cmaps + +from . import cm +from .cm import show_cmaps + __all__ = ( "cm", - "paths", "show_cmaps", ) diff --git a/cmcrameri/_cm.py b/cmcrameri/_cm.py deleted file mode 100755 index dc4ce52..0000000 --- a/cmcrameri/_cm.py +++ /dev/null @@ -1,140 +0,0 @@ -""" -Perceptually uniform colourmaps for geosciences - -Packaging of colourmaps created by Fabio Crameri http://www.fabiocrameri.ch/colourmaps.php - -Created by Callum Rollo -2020-05-06 -""" -from pathlib import Path -from types import SimpleNamespace - -import matplotlib.pyplot as plt -import numpy as np -from matplotlib.colors import ListedColormap - - -sequential_cmap_names = ( - "batlow", "batlowW", "batlowK", - "devon", "lajolla", "bamako", - "davos", "bilbao", "nuuk", - "oslo", "grayC", "hawaii", - "lapaz", "tokyo", "buda", - "acton", "turku", "imola", -) - -diverging_cmap_names = ( - "broc", "cork", "vik", - "lisbon", "tofino", "berlin", - "roma", "bam", "vanimo", -) - -multi_sequential_cmap_names = ( - "oleron", "bukavu", "fes", -) - -categorical_cmap_base_names = tuple( - name - for name in sequential_cmap_names - if name not in {"batlowW", "batlowK"} -) -categorical_cmap_names = tuple( - f"{name}S" - for name in categorical_cmap_base_names -) - -cyclic_cmap_base_names = ( - "roma", "bam", - "broc", "cork", "vik", -) -cyclic_cmap_names = tuple( - f"{name}O" - for name in cyclic_cmap_base_names -) - -cm = SimpleNamespace() # or NamedTuple? - -# Prepended to cmap names when registering -cmap_reg_prefix = "cmc." - - -# Find the colormap text files and make a list of the paths -cmap_dir = Path(__file__).parent / 'cmaps' -paths = sorted(cmap_dir.glob('*.txt')) -for cmap_path in paths: - # Name of colour map is taken from the text file name - cmap_name = cmap_path.stem - - # Categorize - is_categorical = cmap_name.endswith("S") - is_cyclic = cmap_name.endswith("O") - cmap_name_base = cmap_name if not (is_categorical or is_cyclic) else cmap_name[:-1] - if not is_cyclic: - is_sequential = cmap_name_base in sequential_cmap_names - is_diverging = cmap_name_base in diverging_cmap_names - is_multi_sequential = cmap_name_base in multi_sequential_cmap_names - else: - is_sequential = is_diverging = is_multi_sequential = False - - # Check categorization - assert sum( - [is_cyclic, is_sequential, is_diverging, is_multi_sequential] - ) == 1, f"{cmap_name} not categorized properly" - assert not is_categorical or cmap_name_base in categorical_cmap_base_names - assert not is_cyclic or cmap_name_base in cyclic_cmap_base_names, cmap_name - - # Load data - data = np.loadtxt(cmap_path) - N = data.shape[0] - N0 = 256 if not is_categorical else 100 - assert N == N0, f"N should be {N0} but is {N}" - - # Create and register colormap - cmap = ListedColormap(colors=data, name=cmap_name) - plt.cm.register_cmap(name=f"{cmap_reg_prefix}{cmap.name}", cmap=cmap) - setattr(cm, cmap.name, cmap) - - # For non-categorical, also create and register reverse version - if not is_categorical: - cmap = cmap.reversed() - plt.cm.register_cmap(name=f"{cmap_reg_prefix}{cmap.name}", cmap=cmap) - setattr(cm, cmap.name, cmap) - - -def show_cmaps(): - """ - A rough function for a quick plot of the colourmaps. - Nowhere near as pretty as the original, - see https://www.fabiocrameri.ch/colourmaps/ - """ - from itertools import chain - - x = np.linspace(0, 100, 100)[np.newaxis, :] - - # all_names = list(vars(cm)) - n_seq = len(sequential_cmap_names) - n_div = len(diverging_cmap_names) - n_mseq = len(multi_sequential_cmap_names) - n_cyc = len(cyclic_cmap_names) - # n_cat = len(categorical_cmap_base_names) - - ncols = 7 - nrows = int(np.ceil((n_seq + n_div + n_mseq + n_cyc) / ncols)) - - fig, axs = plt.subplots(nrows, ncols, figsize=(22, 10)) - fig.subplots_adjust(hspace=.8, wspace=.08) - fig.set_tight_layout(False) - - for ax in axs.flat: - ax.axis('off') - - for ax, cmap_name in zip( - axs.flat, - sorted(chain( - sequential_cmap_names, diverging_cmap_names, - multi_sequential_cmap_names, cyclic_cmap_names, - )) - ): - cmap = getattr(cm, cmap_name) - ax.pcolor(x, cmap=cmap) - ax.text(5, -0.3, cmap.name, fontsize=26) diff --git a/cmcrameri/cm.py b/cmcrameri/cm.py new file mode 100755 index 0000000..fce1b30 --- /dev/null +++ b/cmcrameri/cm.py @@ -0,0 +1,149 @@ +""" +Perceptually uniform colourmaps for geosciences + +Packaging of colourmaps created by Fabio Crameri http://www.fabiocrameri.ch/colourmaps.php + +Created by Callum Rollo +2020-05-06 +""" +import matplotlib.pyplot as plt +import numpy as np + + +sequential_cmap_names = ( + "batlow", "batlowW", "batlowK", + "devon", "lajolla", "bamako", + "davos", "bilbao", "nuuk", + "oslo", "grayC", "hawaii", + "lapaz", "tokyo", "buda", + "acton", "turku", "imola", +) + +diverging_cmap_names = ( + "broc", "cork", "vik", + "lisbon", "tofino", "berlin", + "roma", "bam", "vanimo", +) + +multi_sequential_cmap_names = ( + "oleron", "bukavu", "fes", +) + +_categorical_cmap_base_names = tuple( + name + for name in sequential_cmap_names + if name not in {"batlowW", "batlowK"} +) +categorical_cmap_names = tuple( + f"{name}S" + for name in _categorical_cmap_base_names +) + +_cyclic_cmap_base_names = ( + "roma", "bam", + "broc", "cork", "vik", +) +cyclic_cmap_names = tuple( + f"{name}O" + for name in _cyclic_cmap_base_names +) + +def _load_cmaps(): + from pathlib import Path + from matplotlib.colors import ListedColormap + + # Prepended to cmap names when registering + cmap_reg_prefix = "cmc." + + + def register(cmap): + # Register in Matplotlib + plt.cm.register_cmap(name=f"{cmap_reg_prefix}{cmap.name}", cmap=cmap) + + # And in the `cmcrameri.cm` namespace + globals().update({cmap.name: cmap}) + + + # Find the colormap text files and make a list of the paths + cmap_data_dir = Path(__file__).parent / 'cmaps' + paths = sorted(cmap_data_dir.glob('*.txt')) + cmaps = {} + for cmap_path in paths: + # Name of colour map is taken from the text file name + cmap_name = cmap_path.stem + + # Categorize + is_categorical = cmap_name.endswith("S") + is_cyclic = cmap_name.endswith("O") + cmap_name_base = cmap_name if not (is_categorical or is_cyclic) else cmap_name[:-1] + if not is_cyclic: + is_sequential = cmap_name_base in sequential_cmap_names + is_diverging = cmap_name_base in diverging_cmap_names + is_multi_sequential = cmap_name_base in multi_sequential_cmap_names + else: + is_sequential = is_diverging = is_multi_sequential = False + + # Check categorization + assert sum( + [is_cyclic, is_sequential, is_diverging, is_multi_sequential] + ) == 1, f"{cmap_name} not categorized properly" + assert not is_categorical or cmap_name_base in _categorical_cmap_base_names + assert not is_cyclic or cmap_name_base in _cyclic_cmap_base_names, cmap_name + + # Load data + data = np.loadtxt(cmap_path) + N = data.shape[0] + N0 = 256 if not is_categorical else 100 + assert N == N0, f"N should be {N0} but is {N}" + + # Create and register colormap + cmap = ListedColormap(colors=data, name=cmap_name) + register(cmap) + + # For non-categorical, also create and register reverse version + if not is_categorical: + register(cmap.reversed()) + + return paths + + +paths = _load_cmaps() + + +def show_cmaps(): + """ + A rough function for a quick plot of the colourmaps. + Nowhere near as pretty as the original, + see https://www.fabiocrameri.ch/colourmaps/ + """ + from itertools import chain + + x = np.linspace(0, 100, 100)[np.newaxis, :] + + # all_names = list(vars(cm)) + n_seq = len(sequential_cmap_names) + n_div = len(diverging_cmap_names) + n_mseq = len(multi_sequential_cmap_names) + n_cyc = len(cyclic_cmap_names) + # n_cat = len(categorical_cmap_base_names) + + ncols = 7 + nrows = int(np.ceil((n_seq + n_div + n_mseq + n_cyc) / ncols)) + + fig, axs = plt.subplots(nrows, ncols, figsize=(22, 10)) + fig.subplots_adjust(hspace=.8, wspace=.08) + fig.set_tight_layout(False) + + for ax in axs.flat: + ax.axis('off') + + for ax, cmap_name in zip( + axs.flat, + sorted(chain( + sequential_cmap_names, diverging_cmap_names, + multi_sequential_cmap_names, cyclic_cmap_names, + )) + ): + cmap = globals()[cmap_name] + ax.pcolor(x, cmap=cmap) + ax.text(5, -0.3, cmap.name, fontsize=26) From dd36673696f833e72c57d2d44e3aad31837775df Mon Sep 17 00:00:00 2001 From: zmoon Date: Sat, 6 Nov 2021 14:46:21 -0600 Subject: [PATCH 06/17] Fix test --- tests/test_cmcrameri.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_cmcrameri.py b/tests/test_cmcrameri.py index e0bf21a..37df487 100644 --- a/tests/test_cmcrameri.py +++ b/tests/test_cmcrameri.py @@ -4,7 +4,7 @@ import sys from pathlib import Path -from matplotlib.colors import LinearSegmentedColormap +from matplotlib.colors import Colormap from matplotlib.pyplot import get_cmap library_dir = Path(__file__).parent.parent.absolute() @@ -23,7 +23,7 @@ def test_cmap_import(): for name, cmap in vars(cm).items(): increment = 1 # See if it is a colormap. - if isinstance(cmap, LinearSegmentedColormap): + if isinstance(cmap, Colormap): if name[-1] != 'S': increment = 0.5 no_cmaps += increment @@ -34,7 +34,7 @@ def test_cmap_import(): def test_get_cmap(): for name, cmap in vars(cm).items(): # See if it is a colormap. - if isinstance(cmap, LinearSegmentedColormap): + if isinstance(cmap, Colormap): # if cmap hasn't been correctly registered as # cmc.name, it will raise a ValueError alt_cmap = get_cmap('cmc.' + name) From 681d2ed3b24312360644efea7c5043d9cfb6245d Mon Sep 17 00:00:00 2001 From: zmoon Date: Sat, 6 Nov 2021 15:08:37 -0600 Subject: [PATCH 07/17] Names by category marked as non-public --- cmcrameri/cm.py | 61 +++++++++++++++++++++++++------------------------ 1 file changed, 31 insertions(+), 30 deletions(-) diff --git a/cmcrameri/cm.py b/cmcrameri/cm.py index fce1b30..db73ec1 100755 --- a/cmcrameri/cm.py +++ b/cmcrameri/cm.py @@ -10,7 +10,7 @@ import numpy as np -sequential_cmap_names = ( +_cmap_names_sequential = ( "batlow", "batlowW", "batlowK", "devon", "lajolla", "bamako", "davos", "bilbao", "nuuk", @@ -19,33 +19,33 @@ "acton", "turku", "imola", ) -diverging_cmap_names = ( +_cmap_names_diverging = ( "broc", "cork", "vik", "lisbon", "tofino", "berlin", "roma", "bam", "vanimo", ) -multi_sequential_cmap_names = ( +_cmap_names_multi_sequential = ( "oleron", "bukavu", "fes", ) -_categorical_cmap_base_names = tuple( +_cmap_base_names_categorical = tuple( name - for name in sequential_cmap_names + for name in _cmap_names_sequential if name not in {"batlowW", "batlowK"} ) -categorical_cmap_names = tuple( +_cmap_names_categorical = tuple( f"{name}S" - for name in _categorical_cmap_base_names + for name in _cmap_base_names_categorical ) -_cyclic_cmap_base_names = ( +_cmap_base_names_cyclic = ( "roma", "bam", "broc", "cork", "vik", ) -cyclic_cmap_names = tuple( +_cmap_names_cyclic = tuple( f"{name}O" - for name in _cyclic_cmap_base_names + for name in _cmap_base_names_cyclic ) def _load_cmaps(): @@ -55,19 +55,17 @@ def _load_cmaps(): # Prepended to cmap names when registering cmap_reg_prefix = "cmc." + cmaps = {} def register(cmap): # Register in Matplotlib plt.cm.register_cmap(name=f"{cmap_reg_prefix}{cmap.name}", cmap=cmap) - - # And in the `cmcrameri.cm` namespace - globals().update({cmap.name: cmap}) - + # Add to dict + cmaps[cmap.name] = cmap # Find the colormap text files and make a list of the paths cmap_data_dir = Path(__file__).parent / 'cmaps' paths = sorted(cmap_data_dir.glob('*.txt')) - cmaps = {} for cmap_path in paths: # Name of colour map is taken from the text file name cmap_name = cmap_path.stem @@ -77,9 +75,9 @@ def register(cmap): is_cyclic = cmap_name.endswith("O") cmap_name_base = cmap_name if not (is_categorical or is_cyclic) else cmap_name[:-1] if not is_cyclic: - is_sequential = cmap_name_base in sequential_cmap_names - is_diverging = cmap_name_base in diverging_cmap_names - is_multi_sequential = cmap_name_base in multi_sequential_cmap_names + is_sequential = cmap_name_base in _cmap_names_sequential + is_diverging = cmap_name_base in _cmap_names_diverging + is_multi_sequential = cmap_name_base in _cmap_names_multi_sequential else: is_sequential = is_diverging = is_multi_sequential = False @@ -87,8 +85,8 @@ def register(cmap): assert sum( [is_cyclic, is_sequential, is_diverging, is_multi_sequential] ) == 1, f"{cmap_name} not categorized properly" - assert not is_categorical or cmap_name_base in _categorical_cmap_base_names - assert not is_cyclic or cmap_name_base in _cyclic_cmap_base_names, cmap_name + assert not is_categorical or cmap_name_base in _cmap_base_names_categorical + assert not is_cyclic or cmap_name_base in _cmap_base_names_cyclic, cmap_name # Load data data = np.loadtxt(cmap_path) @@ -104,10 +102,13 @@ def register(cmap): if not is_categorical: register(cmap.reversed()) - return paths + return paths, cmaps + +paths, cmaps = _load_cmaps() -paths = _load_cmaps() +# Add all cmaps to the `cmcrameri.cm` namespace +locals().update(cmaps) def show_cmaps(): @@ -120,12 +121,12 @@ def show_cmaps(): x = np.linspace(0, 100, 100)[np.newaxis, :] - # all_names = list(vars(cm)) - n_seq = len(sequential_cmap_names) - n_div = len(diverging_cmap_names) - n_mseq = len(multi_sequential_cmap_names) - n_cyc = len(cyclic_cmap_names) - # n_cat = len(categorical_cmap_base_names) + n_all = len(cmaps) + n_seq = len(_cmap_names_sequential) + n_div = len(_cmap_names_diverging) + n_mseq = len(_cmap_names_multi_sequential) + n_cyc = len(_cmap_names_cyclic) + n_cat = len(_cmap_base_names_categorical) ncols = 7 nrows = int(np.ceil((n_seq + n_div + n_mseq + n_cyc) / ncols)) @@ -140,8 +141,8 @@ def show_cmaps(): for ax, cmap_name in zip( axs.flat, sorted(chain( - sequential_cmap_names, diverging_cmap_names, - multi_sequential_cmap_names, cyclic_cmap_names, + _cmap_names_sequential, _cmap_names_diverging, + _cmap_names_multi_sequential, _cmap_names_cyclic, )) ): cmap = globals()[cmap_name] From 7122a7b375f0cfcd1f4f820a64cb910b15fc8cb2 Mon Sep 17 00:00:00 2001 From: zmoon Date: Sat, 6 Nov 2021 15:20:49 -0600 Subject: [PATCH 08/17] Update readme --- README.md | 61 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 37 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index e94e994..8fed855 100644 --- a/README.md +++ b/README.md @@ -11,59 +11,72 @@ # cmcrameri -This is a Python wrapper around Fabio Crameri's perceptually uniform colour maps +This is a Python wrapper around Fabio Crameri's perceptually uniform colour maps. -http://www.fabiocrameri.ch/colourmaps.php + -All credit for creating the colourmaps to Fabio. Any errors in the Python implementation of colourmaps are my own. +All credit for creating the colour maps to Fabio. +Any errors in the Python implementation of colour maps are my own. -This version is based on Scientific Colourmaps Version 7.0 (02.02.2021) +This version is based on *Scientific colour maps* [version 7.0](https://zenodo.org/record/4491293) (02.02.2021). ### Install -With pip: - -`pip install cmcrameri` - -With conda: +With `pip`: +``` +pip install cmcrameri +``` +With `conda`: ``` -conda config --add channels conda-forge -conda install cmcrameri +conda install -c conda-forge cmcrameri ``` + ### Usage example ```python -from cmcrameri import cm +import cmcrameri.cm as cmc import matplotlib.pyplot as plt import numpy as np -x = np.linspace(0, 100, 100)[None, :] -plt.imshow(x, aspect='auto', cmap=cm.batlow) # or any of the other colourmaps made by Fabio Crameri + +x = np.linspace(0, 100, 100)[np.newaxis, :] + +plt.imshow(x, aspect='auto', cmap=cmc.batlow) plt.axis('off') plt.show() ``` +Alternatively, the registered name string can be used. +```python +import cmrameri # required in order to register the colour maps +... +plt.imshow(x, aspect='auto', cmap='cmc.batlow') +``` + ### Extra instructions -You can access all the core colourmaps from Fabio Crameri's list by `cm.` -You can use tab autocompletion on `cm` if your editor supports it +You can access all the core colourmaps from Fabio Crameri's list by `cmcrameri.cm.`. -For a reversed colourmap, append `_r` to the colourmap name +You can use tab autocompletion on `cm` if your editor supports it. -Categorical colormaps have the suffix `S` +For a reversed colourmap, append `_r` to the colourmap name. -For an image of all the available colourmaps without leaving the comfort of your Python session +Categorical colormaps have the suffix `S`. +For an image of all the available colourmaps without leaving the comfort of your Python session: ```python -from cmcrameri.cm import show_cmaps +from cmcrameri import show_cmaps + show_cmaps() ``` +![Figure demonstrating colour maps](cmcrameri/colormaps.png) -To make the underlying RGB values available, the original text files are shipped as part of the package. Find them on your system with: +To make the underlying RGB values available, the original text files are shipped as part of the package. +Find them on your system with: ```python -from cmcrameri import cm -cm.paths +from cmcrameri import paths + +paths ``` ### License This work is licensed under an [MIT license](https://mit-license.org/). - From 39b46fe4422a70f870b74f06af0f18544c50a623 Mon Sep 17 00:00:00 2001 From: zmoon Date: Sat, 6 Nov 2021 16:09:44 -0600 Subject: [PATCH 09/17] wip: fancier plot --- cmcrameri/cm.py | 71 ++++++++++++++++++++++++++++++------------------- 1 file changed, 44 insertions(+), 27 deletions(-) diff --git a/cmcrameri/cm.py b/cmcrameri/cm.py index db73ec1..55787da 100755 --- a/cmcrameri/cm.py +++ b/cmcrameri/cm.py @@ -111,40 +111,57 @@ def register(cmap): locals().update(cmaps) -def show_cmaps(): +def show_cmaps(*, ncols=6, figwidth=8): """ - A rough function for a quick plot of the colourmaps. - Nowhere near as pretty as the original, - see https://www.fabiocrameri.ch/colourmaps/ + For the original, see + https://www.fabiocrameri.ch/colourmaps/ """ - from itertools import chain + import math x = np.linspace(0, 100, 100)[np.newaxis, :] - n_all = len(cmaps) - n_seq = len(_cmap_names_sequential) - n_div = len(_cmap_names_diverging) - n_mseq = len(_cmap_names_multi_sequential) - n_cyc = len(_cmap_names_cyclic) - n_cat = len(_cmap_base_names_categorical) - - ncols = 7 - nrows = int(np.ceil((n_seq + n_div + n_mseq + n_cyc) / ncols)) - - fig, axs = plt.subplots(nrows, ncols, figsize=(22, 10)) - fig.subplots_adjust(hspace=.8, wspace=.08) + groups = { + "Sequential": _cmap_names_sequential, + "Diverging": _cmap_names_diverging, + "Multi-sequential": _cmap_names_multi_sequential, + "Cyclic": _cmap_names_cyclic, + } + nrows = 1 + istarts = [] + for group in groups.values(): + n = len(group) + istarts.append(nrows) + nrows += math.ceil(n / ncols) + if group != groups["Cyclic"]: + nrows += 1 # spacer row + + hratios = [1 for _ in range(nrows)] + for i in istarts: + hratios[i-1] = 0.3 # spacer row + + fig, axs = plt.subplots(nrows, ncols, + figsize=(figwidth, 0.8*(nrows - len(groups) + 1)), + gridspec_kw=dict( + left=0.01, right=0.99, top=0.99, bottom=0.043 * 6/nrows, + hspace=0.8, wspace=0.08, + height_ratios=hratios + ) + ) fig.set_tight_layout(False) for ax in axs.flat: ax.axis('off') - for ax, cmap_name in zip( - axs.flat, - sorted(chain( - _cmap_names_sequential, _cmap_names_diverging, - _cmap_names_multi_sequential, _cmap_names_cyclic, - )) - ): - cmap = globals()[cmap_name] - ax.pcolor(x, cmap=cmap) - ax.text(5, -0.3, cmap.name, fontsize=26) + for istart, (group_name, group) in zip(istarts, groups.items()): + + # Group label + ax_ = axs[istart-1, 0] + ax_.text(0.01, 0, group_name, size=24, c="0.4", style="italic", + va="center", ha="left", transform=ax_.transAxes) + + for ax, cmap_name in zip(axs[istart:].flat, group): + + cmap = cmaps[cmap_name] + ax.pcolor(x, cmap=cmap) + ax.text(0.01 * ncols/6, -0.02, cmap.name, size=14, color="0.2", + va="top", transform=ax.transAxes) From 8e54ea0c94df097745d7497fad3091e59a30e843 Mon Sep 17 00:00:00 2001 From: zmoon Date: Sat, 6 Nov 2021 16:41:23 -0600 Subject: [PATCH 10/17] Better layout for different ncols but still not perfect, due to hspace I think --- cmcrameri/cm.py | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/cmcrameri/cm.py b/cmcrameri/cm.py index 55787da..5bb6cd5 100755 --- a/cmcrameri/cm.py +++ b/cmcrameri/cm.py @@ -133,17 +133,29 @@ def show_cmaps(*, ncols=6, figwidth=8): istarts.append(nrows) nrows += math.ceil(n / ncols) if group != groups["Cyclic"]: - nrows += 1 # spacer row + nrows += 1 # group spacer row hratios = [1 for _ in range(nrows)] + hrel_spacer = 0.3 for i in istarts: - hratios[i-1] = 0.3 # spacer row + hratios[i-1] = hrel_spacer # group spacer row + + nrows_titles = len(groups) + nrows_cmaps = nrows - nrows_titles + hrow = 0.8 + + hbottom = 0.2 + htop = 0.05 + figheight = hbottom + htop + hrow*nrows_cmaps + hrow*hrel_spacer*nrows_titles fig, axs = plt.subplots(nrows, ncols, - figsize=(figwidth, 0.8*(nrows - len(groups) + 1)), + figsize=(figwidth, figheight), gridspec_kw=dict( - left=0.01, right=0.99, top=0.99, bottom=0.043 * 6/nrows, - hspace=0.8, wspace=0.08, + left=0.01, right=0.99, + top=1 - htop/figheight, + bottom=hbottom/figheight, + hspace=0.8 / np.mean(hratios), + wspace=0.08, height_ratios=hratios ) ) @@ -155,13 +167,13 @@ def show_cmaps(*, ncols=6, figwidth=8): for istart, (group_name, group) in zip(istarts, groups.items()): # Group label - ax_ = axs[istart-1, 0] - ax_.text(0.01, 0, group_name, size=24, c="0.4", style="italic", - va="center", ha="left", transform=ax_.transAxes) + ax0 = axs[istart, 0] + ax0.text(0.01, 1.02, group_name, size=24, c="0.4", style="italic", + va="bottom", ha="left", transform=ax0.transAxes) for ax, cmap_name in zip(axs[istart:].flat, group): cmap = cmaps[cmap_name] ax.pcolor(x, cmap=cmap) - ax.text(0.01 * ncols/6, -0.02, cmap.name, size=14, color="0.2", + ax.text(0.01 * ncols/6, -0.03, cmap.name, size=14, color="0.2", va="top", transform=ax.transAxes) From e806fb4387fcef059432b81c564cdc7ef7e6f5d4 Mon Sep 17 00:00:00 2001 From: zmoon Date: Sat, 6 Nov 2021 16:51:36 -0600 Subject: [PATCH 11/17] clean up plot code a bit --- cmcrameri/cm.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmcrameri/cm.py b/cmcrameri/cm.py index 5bb6cd5..bd49d0e 100755 --- a/cmcrameri/cm.py +++ b/cmcrameri/cm.py @@ -118,7 +118,7 @@ def show_cmaps(*, ncols=6, figwidth=8): """ import math - x = np.linspace(0, 100, 100)[np.newaxis, :] + x = np.linspace(0, 1, 256)[np.newaxis, :] groups = { "Sequential": _cmap_names_sequential, @@ -162,7 +162,7 @@ def show_cmaps(*, ncols=6, figwidth=8): fig.set_tight_layout(False) for ax in axs.flat: - ax.axis('off') + ax.set_axis_off() for istart, (group_name, group) in zip(istarts, groups.items()): @@ -175,5 +175,5 @@ def show_cmaps(*, ncols=6, figwidth=8): cmap = cmaps[cmap_name] ax.pcolor(x, cmap=cmap) - ax.text(0.01 * ncols/6, -0.03, cmap.name, size=14, color="0.2", + ax.text(0.01 * ncols/6, -0.03, cmap_name, size=14, color="0.2", va="top", transform=ax.transAxes) From f25c7aca167e50ab959a47dfbcc5d46819578c69 Mon Sep 17 00:00:00 2001 From: zmoon Date: Sat, 6 Nov 2021 19:12:23 -0600 Subject: [PATCH 12/17] Finally fixed the layout for different ncols --- cmcrameri/cm.py | 42 +++++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/cmcrameri/cm.py b/cmcrameri/cm.py index bd49d0e..7576a86 100755 --- a/cmcrameri/cm.py +++ b/cmcrameri/cm.py @@ -120,33 +120,41 @@ def show_cmaps(*, ncols=6, figwidth=8): x = np.linspace(0, 1, 256)[np.newaxis, :] - groups = { - "Sequential": _cmap_names_sequential, - "Diverging": _cmap_names_diverging, - "Multi-sequential": _cmap_names_multi_sequential, - "Cyclic": _cmap_names_cyclic, - } + groups = ( + ("Sequential", _cmap_names_sequential), + ("Diverging", _cmap_names_diverging), + ("Multi-sequential", _cmap_names_multi_sequential), + ("Cyclic", _cmap_names_cyclic), + ) + nrows = 1 istarts = [] - for group in groups.values(): + for group_name, group in groups: n = len(group) istarts.append(nrows) nrows += math.ceil(n / ncols) - if group != groups["Cyclic"]: + if group_name != groups[-1][0]: nrows += 1 # group spacer row + nrows_titles = len(groups) + nrows_cmaps = nrows - nrows_titles + + hrel_spacer = 0.3 # spacer height relative cmap row height hratios = [1 for _ in range(nrows)] - hrel_spacer = 0.3 for i in istarts: hratios[i-1] = hrel_spacer # group spacer row - nrows_titles = len(groups) - nrows_cmaps = nrows - nrows_titles - hrow = 0.8 - + hrow = 0.4 # size of cmap row + hspace = 0.7 # hspace, relative to `hrow` hbottom = 0.2 htop = 0.05 - figheight = hbottom + htop + hrow*nrows_cmaps + hrow*hrel_spacer*nrows_titles + figheight = ( + hbottom + + htop + + hrow*nrows_cmaps + + hrow*hrel_spacer*nrows_titles + + hrow*hspace*(nrows - 1) + ) fig, axs = plt.subplots(nrows, ncols, figsize=(figwidth, figheight), @@ -154,7 +162,7 @@ def show_cmaps(*, ncols=6, figwidth=8): left=0.01, right=0.99, top=1 - htop/figheight, bottom=hbottom/figheight, - hspace=0.8 / np.mean(hratios), + hspace=hspace / np.mean(hratios), wspace=0.08, height_ratios=hratios ) @@ -164,7 +172,7 @@ def show_cmaps(*, ncols=6, figwidth=8): for ax in axs.flat: ax.set_axis_off() - for istart, (group_name, group) in zip(istarts, groups.items()): + for istart, (group_name, group) in zip(istarts, groups): # Group label ax0 = axs[istart, 0] @@ -174,6 +182,6 @@ def show_cmaps(*, ncols=6, figwidth=8): for ax, cmap_name in zip(axs[istart:].flat, group): cmap = cmaps[cmap_name] - ax.pcolor(x, cmap=cmap) + ax.imshow(x, cmap=cmap, aspect="auto") ax.text(0.01 * ncols/6, -0.03, cmap_name, size=14, color="0.2", va="top", transform=ax.transAxes) From 52e0f94d1719e4fc15ae0f4a5a8eb8af704b27b4 Mon Sep 17 00:00:00 2001 From: zmoon Date: Sat, 6 Nov 2021 19:17:02 -0600 Subject: [PATCH 13/17] Make it easy to generate the colormaps image --- README.md | 2 +- cmcrameri/cm.py | 7 ++++++- cmcrameri/colormaps.png | Bin 80019 -> 133932 bytes 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8fed855..4145e38 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,7 @@ import cmcrameri.cm as cmc import matplotlib.pyplot as plt import numpy as np -x = np.linspace(0, 100, 100)[np.newaxis, :] +x = np.linspace(0, 1, 100)[np.newaxis, :] plt.imshow(x, aspect='auto', cmap=cmc.batlow) plt.axis('off') diff --git a/cmcrameri/cm.py b/cmcrameri/cm.py index 7576a86..28d5122 100755 --- a/cmcrameri/cm.py +++ b/cmcrameri/cm.py @@ -162,7 +162,7 @@ def show_cmaps(*, ncols=6, figwidth=8): left=0.01, right=0.99, top=1 - htop/figheight, bottom=hbottom/figheight, - hspace=hspace / np.mean(hratios), + hspace=hspace/np.mean(hratios), wspace=0.08, height_ratios=hratios ) @@ -185,3 +185,8 @@ def show_cmaps(*, ncols=6, figwidth=8): ax.imshow(x, cmap=cmap, aspect="auto") ax.text(0.01 * ncols/6, -0.03, cmap_name, size=14, color="0.2", va="top", transform=ax.transAxes) + + +if __name__ == "__main__": + show_cmaps() + plt.savefig("colormaps.png", dpi=200) diff --git a/cmcrameri/colormaps.png b/cmcrameri/colormaps.png index b691866870b3d51e2c8da421e02019cd78281faa..6f868193af956d193c0f5e3e47716757377effed 100644 GIT binary patch literal 133932 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 B%=iER literal 80019 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 From f29690fc89da6665adb998b5ec83ad107373ede7 Mon Sep 17 00:00:00 2001 From: zmoon Date: Sat, 6 Nov 2021 19:30:29 -0600 Subject: [PATCH 14/17] Fix paths import example --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4145e38..5025ca0 100644 --- a/README.md +++ b/README.md @@ -73,7 +73,7 @@ show_cmaps() To make the underlying RGB values available, the original text files are shipped as part of the package. Find them on your system with: ```python -from cmcrameri import paths +from cmcrameri.cm import paths paths ``` From ad89e025690552896a37a1ed1def7fa4983ef1cd Mon Sep 17 00:00:00 2001 From: zmoon Date: Sat, 6 Nov 2021 19:38:02 -0600 Subject: [PATCH 15/17] Update more Crameri links --- cmcrameri/__init__.py | 10 ++++++---- cmcrameri/cm.py | 5 ++--- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/cmcrameri/__init__.py b/cmcrameri/__init__.py index 09cf12e..a7504e5 100644 --- a/cmcrameri/__init__.py +++ b/cmcrameri/__init__.py @@ -1,8 +1,10 @@ """ -cmcrameri is a package of perceptuallt uniform colourmaps for the geosciences -This is mererly a wrapper for previosuly created colour maps. All credit to Fabio Crameri -http://www.fabiocrameri.ch/colourmaps.php -See README.md for an overview and instructions +cmcrameri is a package of perceptually uniform colour maps for the geosciences. +This is merely a wrapper for previously created colour maps. +All credit to Fabio Crameri +https://www.fabiocrameri.ch/colourmaps/ + +See README.md for an overview and instructions. """ from __future__ import absolute_import diff --git a/cmcrameri/cm.py b/cmcrameri/cm.py index 28d5122..09950ad 100755 --- a/cmcrameri/cm.py +++ b/cmcrameri/cm.py @@ -1,7 +1,6 @@ """ -Perceptually uniform colourmaps for geosciences - -Packaging of colourmaps created by Fabio Crameri http://www.fabiocrameri.ch/colourmaps.php +Packaging of colour maps created by Fabio Crameri +https://www.fabiocrameri.ch/colourmaps/ Created by Callum Rollo 2020-05-06 From 7af2bc97f81b9d4f6b54df0f3a9ebfa578de1b41 Mon Sep 17 00:00:00 2001 From: zmoon Date: Mon, 8 Nov 2021 10:42:17 -0700 Subject: [PATCH 16/17] "colormap" --- CONTRIBUTING.md | 2 +- LICENSE | 2 +- MAINTAINERS.md | 10 +++++----- README.md | 18 +++++++++--------- cmcrameri/__init__.py | 6 +++--- cmcrameri/cm.py | 8 +++++--- setup.py | 2 +- tests/test_cmcrameri.py | 4 ++-- 8 files changed, 27 insertions(+), 25 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3b3429c..8c530bf 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,3 +1,3 @@ -This repo welcomes additions from anyone passionate about colourmaps! This is my first Python package so it's a little rough around the edges. +This repo welcomes additions from anyone passionate about colormaps! This is my first Python package so it's a little rough around the edges. If you do make a PR, please check it against the tests first, this will make it easier for me to merge it and push a new release out to PyPI and conda-forge. diff --git a/LICENSE b/LICENSE index 0729b87..fc6cda0 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Colourmaps in cmcrameri/cm/cmaps: +Colormaps in cmcrameri/cm/cmaps: Copyright (c) 2020 Fabio Crameri Python scripts and packaging: diff --git a/MAINTAINERS.md b/MAINTAINERS.md index 040c7d0..a15eede 100644 --- a/MAINTAINERS.md +++ b/MAINTAINERS.md @@ -1,14 +1,14 @@ -# To update the colourmaps +# To update the colormaps - Download latest version from Zenodo https://zenodo.org/record/4491293 -- From directory above the colourmaps master folder, create a new directrory called cmaps and do some Bash magic to extract colormap .txt files +- From directory above the colormaps master folder, create a new directrory called cmaps and do some Bash magic to extract colormap .txt files `find . -name '*.txt' -exec cp {} ./cmaps \;` -- Remove the discrete colourmaps (those with numbers at the end) +- Remove the discrete colormaps (those with numbers at the end) -- Paste colourmaps to the cmaps directory in cmcrameri +- Paste colormaps to the cmaps directory in cmcrameri -- Run the `show_cmaps`function and save the figure in teh home directory of the project +- Run the `show_cmaps`function and save the figure in the home directory of the project diff --git a/README.md b/README.md index 5025ca0..252b872 100644 --- a/README.md +++ b/README.md @@ -11,12 +11,12 @@ # cmcrameri -This is a Python wrapper around Fabio Crameri's perceptually uniform colour maps. +This is a Python wrapper around Fabio Crameri's perceptually uniform colormaps. -All credit for creating the colour maps to Fabio. -Any errors in the Python implementation of colour maps are my own. +All credit for creating the colormaps to Fabio. +Any errors in the Python implementation of colormaps are my own. This version is based on *Scientific colour maps* [version 7.0](https://zenodo.org/record/4491293) (02.02.2021). @@ -47,28 +47,28 @@ plt.show() ``` Alternatively, the registered name string can be used. ```python -import cmrameri # required in order to register the colour maps +import cmrameri # required in order to register the colormaps with Matplotlib ... plt.imshow(x, aspect='auto', cmap='cmc.batlow') ``` ### Extra instructions -You can access all the core colourmaps from Fabio Crameri's list by `cmcrameri.cm.`. +You can access all the core colormaps from Fabio Crameri's list by `cmcrameri.cm.`. -You can use tab autocompletion on `cm` if your editor supports it. +You can use tab autocompletion on `cmcrameri.cm` if your editor supports it. -For a reversed colourmap, append `_r` to the colourmap name. +For a reversed colormap, append `_r` to the colormap name. Categorical colormaps have the suffix `S`. -For an image of all the available colourmaps without leaving the comfort of your Python session: +For an image of all the available colormaps without leaving the comfort of your Python session: ```python from cmcrameri import show_cmaps show_cmaps() ``` -![Figure demonstrating colour maps](cmcrameri/colormaps.png) +![Figure demonstrating the colormaps](cmcrameri/colormaps.png) To make the underlying RGB values available, the original text files are shipped as part of the package. Find them on your system with: diff --git a/cmcrameri/__init__.py b/cmcrameri/__init__.py index a7504e5..e1a36d4 100644 --- a/cmcrameri/__init__.py +++ b/cmcrameri/__init__.py @@ -1,7 +1,7 @@ """ -cmcrameri is a package of perceptually uniform colour maps for the geosciences. -This is merely a wrapper for previously created colour maps. -All credit to Fabio Crameri +cmcrameri is a package of perceptually uniform colormaps for the geosciences. +This is merely a wrapper for previously created colormaps, +all credit to Fabio Crameri https://www.fabiocrameri.ch/colourmaps/ See README.md for an overview and instructions. diff --git a/cmcrameri/cm.py b/cmcrameri/cm.py index 09950ad..85c0ad9 100755 --- a/cmcrameri/cm.py +++ b/cmcrameri/cm.py @@ -1,5 +1,5 @@ """ -Packaging of colour maps created by Fabio Crameri +Packaging of colormaps created by Fabio Crameri https://www.fabiocrameri.ch/colourmaps/ Created by Callum Rollo @@ -65,8 +65,10 @@ def register(cmap): # Find the colormap text files and make a list of the paths cmap_data_dir = Path(__file__).parent / 'cmaps' paths = sorted(cmap_data_dir.glob('*.txt')) + + # Load data and generate Colormap objects for cmap_path in paths: - # Name of colour map is taken from the text file name + # Name of colormap is taken from the text file name cmap_name = cmap_path.stem # Categorize @@ -84,7 +86,7 @@ def register(cmap): assert sum( [is_cyclic, is_sequential, is_diverging, is_multi_sequential] ) == 1, f"{cmap_name} not categorized properly" - assert not is_categorical or cmap_name_base in _cmap_base_names_categorical + assert not is_categorical or cmap_name_base in _cmap_base_names_categorical, cmap_name assert not is_cyclic or cmap_name_base in _cmap_base_names_cyclic, cmap_name # Load data diff --git a/setup.py b/setup.py index d96ed0e..df9ecf0 100644 --- a/setup.py +++ b/setup.py @@ -16,7 +16,7 @@ license='MIT', long_description=long_description, long_description_content_type='text/markdown', - description = 'Perceptually uniform colourmaps', + description = 'Perceptually uniform colormaps by Fabio Crameri', author = 'Callum Rollo', author_email = 'c.rollo@outlook.com', url = 'https://github.com/callumrollo/cmcrameri', diff --git a/tests/test_cmcrameri.py b/tests/test_cmcrameri.py index 37df487..d7c2d37 100644 --- a/tests/test_cmcrameri.py +++ b/tests/test_cmcrameri.py @@ -1,5 +1,5 @@ """ -Test that the program a) finds the text files and b) creates colourmaps +Test that the program a) finds the text files and b) creates colormaps """ import sys from pathlib import Path @@ -28,7 +28,7 @@ def test_cmap_import(): increment = 0.5 no_cmaps += increment cmap_names.append(name) - # Should be as many colour maps as files plus reversed for non categorical ones + # Should be as many colormaps as files plus reversed for non categorical ones assert int(no_cmaps) == len(cm.paths) def test_get_cmap(): From 17b0ef7df344fe75126f53bfe5093075bbd84f78 Mon Sep 17 00:00:00 2001 From: zmoon Date: Mon, 8 Nov 2021 11:58:13 -0700 Subject: [PATCH 17/17] Simplify statement about paths since the colors can be obtained with `.colors` now --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 252b872..91da5bd 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ show_cmaps() ``` ![Figure demonstrating the colormaps](cmcrameri/colormaps.png) -To make the underlying RGB values available, the original text files are shipped as part of the package. +The original colormap text files are shipped as part of the package. Find them on your system with: ```python from cmcrameri.cm import paths