# yellowbrick.style.palettes
# Implements the variety of colors that yellowbrick allows access to by name.
#
# Author: Patrick O'Melveny
# Author: Benjamin Bengfort
#
# Copyright (C) 2016 The scikit-yb developers
# For license information, see LICENSE.txt
#
# ID: palettes.py [c6aff34] benjamin@bengfort.com $
"""
Implements the variety of colors that yellowbrick allows access to by name.
This code was originally based on Seaborn's rcmody.py but has since been
cleaned up to be Yellowbrick-specific and to dereference tools we don't use.
Note that these functions alter the matplotlib rc dictionary on the fly.
"""
#########################################################################
## Imports
#########################################################################
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.colors as mplcol
from itertools import cycle
from .colors import get_color_cycle
from yellowbrick.exceptions import YellowbrickValueError
##########################################################################
## Exports
##########################################################################
__all__ = ["color_palette", "set_color_codes"]
##########################################################################
## Special, Named Colors
##########################################################################
YB_KEY = "#111111" # The yellowbrick key (black) color is very dark grey
LINE_COLOR = YB_KEY # Colors for best fit lines, diagonals, etc.
##########################################################################
## Color Palettes
## Note all 6/7 color palettes can be mapped to bgrmyck color codes
## via the `set_color_codes` function, make sure they are ordered!
##########################################################################
PALETTES = {
# "name": ['blue', 'green', 'red', 'maroon', 'yellow', 'cyan']
# The yellowbrick default palette
"yellowbrick": ["#0272a2", "#9fc377", "#ca0b03", "#a50258", "#d7c703", "#88cada"],
# The following are from ColorBrewer
"accent": ["#386cb0", "#7fc97f", "#f0027f", "#beaed4", "#ffff99", "#fdc086"],
"dark": ["#7570b3", "#66a61e", "#d95f02", "#e7298a", "#e6ab02", "#1b9e77"],
"pastel": ["#cbd5e8", "#b3e2cd", "#fdcdac", "#f4cae4", "#fff2ae", "#e6f5c9"],
"bold": ["#377eb8", "#4daf4a", "#e41a1c", "#984ea3", "#ffff33", "#ff7f00"],
"muted": ["#80b1d3", "#8dd3c7", "#fb8072", "#bebada", "#ffffb3", "#fdb462"],
# The reset colors back to the original mpl color codes
"reset": [
"#0000ff",
"#008000",
"#ff0000",
"#bf00bf",
"#bfbf00",
"#00bfbf",
"#000000",
],
# Colorblind colors
"colorblind": ["#0072B2", "#009E73", "#D55E00", "#CC79A7", "#F0E442", "#56B4E9"],
"sns_colorblind": [
"#0072B2",
"#009E73",
"#D55E00",
"#CC79A7",
"#F0E442",
"#56B4E9",
],
# The following are Seaborn colors
"sns_deep": ["#4C72B0", "#55A868", "#C44E52", "#8172B2", "#CCB974", "#64B5CD"],
"sns_muted": ["#4878CF", "#6ACC65", "#D65F5F", "#B47CC7", "#C4AD66", "#77BEDB"],
"sns_pastel": ["#92C6FF", "#97F0AA", "#FF9F9A", "#D0BBFF", "#FFFEA3", "#B0E0E6"],
"sns_bright": ["#003FFF", "#03ED3A", "#E8000B", "#8A2BE2", "#FFC400", "#00D7FF"],
"sns_dark": ["#001C7F", "#017517", "#8C0900", "#7600A1", "#B8860B", "#006374"],
# Other palettes
"flatui": ["#34495e", "#2ecc71", "#e74c3c", "#9b59b6", "#f4d03f", "#3498db"],
"paired": [
"#a6cee3",
"#1f78b4",
"#b2df8a",
"#33a02c",
"#fb9a99",
"#e31a1c",
"#cab2d6",
"#6a3d9a",
"#ffff99",
"#b15928",
"#fdbf6f",
"#ff7f00",
],
"set1": [
"#377eb8",
"#4daf4a",
"#e41a1c",
"#984ea3",
"#ffff33",
"#ff7f00",
"#a65628",
"#f781bf",
"#999999",
],
# colors extracted from this blog post during pycon2017:
# http://lewisandquark.tumblr.com/
"neural_paint": [
"#167192",
"#6e7548",
"#c5a2ab",
"#00ccff",
"#de78ae",
"#ffcc99",
"#3d3f42",
"#ffffcc",
],
}
SEQUENCES = {
"ddl_heat": {
12: [
"#DBDBDB",
"#DCD5CC",
"#DCCEBE",
"#DDC8AF",
"#DEC2A0",
"#DEBB91",
"#DFB583",
"#DFAE74",
"#E0A865",
"#E1A256",
"#E19B48",
"#E29539",
]
},
"YlGn": {
3: ["#f7fcb9", "#addd8e", "#31a354"],
4: ["#ffffcc", "#c2e699", "#78c679", "#238443"],
5: ["#ffffcc", "#c2e699", "#78c679", "#31a354", "#006837"],
6: ["#ffffcc", "#d9f0a3", "#addd8e", "#78c679", "#31a354", "#006837"],
7: [
"#ffffcc",
"#d9f0a3",
"#addd8e",
"#78c679",
"#41ab5d",
"#238443",
"#005a32",
],
8: [
"#ffffe5",
"#f7fcb9",
"#d9f0a3",
"#addd8e",
"#78c679",
"#41ab5d",
"#238443",
"#005a32",
],
9: [
"#ffffe5",
"#f7fcb9",
"#d9f0a3",
"#addd8e",
"#78c679",
"#41ab5d",
"#238443",
"#006837",
"#004529",
],
},
"YlGnBu": {
3: ["#edf8b1", "#7fcdbb", "#2c7fb8"],
4: ["#ffffcc", "#a1dab4", "#41b6c4", "#225ea8"],
5: ["#ffffcc", "#a1dab4", "#41b6c4", "#2c7fb8", "#253494"],
6: ["#ffffcc", "#c7e9b4", "#7fcdbb", "#41b6c4", "#2c7fb8", "#253494"],
7: [
"#ffffcc",
"#c7e9b4",
"#7fcdbb",
"#41b6c4",
"#1d91c0",
"#225ea8",
"#0c2c84",
],
8: [
"#ffffd9",
"#edf8b1",
"#c7e9b4",
"#7fcdbb",
"#41b6c4",
"#1d91c0",
"#225ea8",
"#0c2c84",
],
9: [
"#ffffd9",
"#edf8b1",
"#c7e9b4",
"#7fcdbb",
"#41b6c4",
"#1d91c0",
"#225ea8",
"#253494",
"#081d58",
],
},
"GnBu": {
3: ["#e0f3db", "#a8ddb5", "#43a2ca"],
4: ["#f0f9e8", "#bae4bc", "#7bccc4", "#2b8cbe"],
5: ["#f0f9e8", "#bae4bc", "#7bccc4", "#43a2ca", "#0868ac"],
6: ["#f0f9e8", "#ccebc5", "#a8ddb5", "#7bccc4", "#43a2ca", "#0868ac"],
7: [
"#f0f9e8",
"#ccebc5",
"#a8ddb5",
"#7bccc4",
"#4eb3d3",
"#2b8cbe",
"#08589e",
],
8: [
"#f7fcf0",
"#e0f3db",
"#ccebc5",
"#a8ddb5",
"#7bccc4",
"#4eb3d3",
"#2b8cbe",
"#08589e",
],
9: [
"#f7fcf0",
"#e0f3db",
"#ccebc5",
"#a8ddb5",
"#7bccc4",
"#4eb3d3",
"#2b8cbe",
"#0868ac",
"#084081",
],
},
"BuGn": {
3: ["#e5f5f9", "#99d8c9", "#2ca25f"],
4: ["#edf8fb", "#b2e2e2", "#66c2a4", "#238b45"],
5: ["#edf8fb", "#b2e2e2", "#66c2a4", "#2ca25f", "#006d2c"],
6: ["#edf8fb", "#ccece6", "#99d8c9", "#66c2a4", "#2ca25f", "#006d2c"],
7: [
"#edf8fb",
"#ccece6",
"#99d8c9",
"#66c2a4",
"#41ae76",
"#238b45",
"#005824",
],
8: [
"#f7fcfd",
"#e5f5f9",
"#ccece6",
"#99d8c9",
"#66c2a4",
"#41ae76",
"#238b45",
"#005824",
],
9: [
"#f7fcfd",
"#e5f5f9",
"#ccece6",
"#99d8c9",
"#66c2a4",
"#41ae76",
"#238b45",
"#006d2c",
"#00441b",
],
},
"PuBuGn": {
3: ["#ece2f0", "#a6bddb", "#1c9099"],
4: ["#f6eff7", "#bdc9e1", "#67a9cf", "#02818a"],
5: ["#f6eff7", "#bdc9e1", "#67a9cf", "#1c9099", "#016c59"],
6: ["#f6eff7", "#d0d1e6", "#a6bddb", "#67a9cf", "#1c9099", "#016c59"],
7: [
"#f6eff7",
"#d0d1e6",
"#a6bddb",
"#67a9cf",
"#3690c0",
"#02818a",
"#016450",
],
8: [
"#fff7fb",
"#ece2f0",
"#d0d1e6",
"#a6bddb",
"#67a9cf",
"#3690c0",
"#02818a",
"#016450",
],
9: [
"#fff7fb",
"#ece2f0",
"#d0d1e6",
"#a6bddb",
"#67a9cf",
"#3690c0",
"#02818a",
"#016c59",
"#014636",
],
},
"PuBu": {
3: ["#ece7f2", "#a6bddb", "#2b8cbe"],
4: ["#f1eef6", "#bdc9e1", "#74a9cf", "#0570b0"],
5: ["#f1eef6", "#bdc9e1", "#74a9cf", "#2b8cbe", "#045a8d"],
6: ["#f1eef6", "#d0d1e6", "#a6bddb", "#74a9cf", "#2b8cbe", "#045a8d"],
7: [
"#f1eef6",
"#d0d1e6",
"#a6bddb",
"#74a9cf",
"#3690c0",
"#0570b0",
"#034e7b",
],
8: [
"#fff7fb",
"#ece7f2",
"#d0d1e6",
"#a6bddb",
"#74a9cf",
"#3690c0",
"#0570b0",
"#034e7b",
],
9: [
"#fff7fb",
"#ece7f2",
"#d0d1e6",
"#a6bddb",
"#74a9cf",
"#3690c0",
"#0570b0",
"#045a8d",
"#023858",
],
},
"BuPu": {
3: ["#e0ecf4", "#9ebcda", "#8856a7"],
4: ["#edf8fb", "#b3cde3", "#8c96c6", "#88419d"],
5: ["#edf8fb", "#b3cde3", "#8c96c6", "#8856a7", "#810f7c"],
6: ["#edf8fb", "#bfd3e6", "#9ebcda", "#8c96c6", "#8856a7", "#810f7c"],
7: [
"#edf8fb",
"#bfd3e6",
"#9ebcda",
"#8c96c6",
"#8c6bb1",
"#88419d",
"#6e016b",
],
8: [
"#f7fcfd",
"#e0ecf4",
"#bfd3e6",
"#9ebcda",
"#8c96c6",
"#8c6bb1",
"#88419d",
"#6e016b",
],
9: [
"#f7fcfd",
"#e0ecf4",
"#bfd3e6",
"#9ebcda",
"#8c96c6",
"#8c6bb1",
"#88419d",
"#810f7c",
"#4d004b",
],
},
"RdPu": {
3: ["#fde0dd", "#fa9fb5", "#c51b8a"],
4: ["#feebe2", "#fbb4b9", "#f768a1", "#ae017e"],
5: ["#feebe2", "#fbb4b9", "#f768a1", "#c51b8a", "#7a0177"],
6: ["#feebe2", "#fcc5c0", "#fa9fb5", "#f768a1", "#c51b8a", "#7a0177"],
7: [
"#feebe2",
"#fcc5c0",
"#fa9fb5",
"#f768a1",
"#dd3497",
"#ae017e",
"#7a0177",
],
8: [
"#fff7f3",
"#fde0dd",
"#fcc5c0",
"#fa9fb5",
"#f768a1",
"#dd3497",
"#ae017e",
"#7a0177",
],
9: [
"#fff7f3",
"#fde0dd",
"#fcc5c0",
"#fa9fb5",
"#f768a1",
"#dd3497",
"#ae017e",
"#7a0177",
"#49006a",
],
},
"PuRd": {
3: ["#e7e1ef", "#c994c7", "#dd1c77"],
4: ["#f1eef6", "#d7b5d8", "#df65b0", "#ce1256"],
5: ["#f1eef6", "#d7b5d8", "#df65b0", "#dd1c77", "#980043"],
6: ["#f1eef6", "#d4b9da", "#c994c7", "#df65b0", "#dd1c77", "#980043"],
7: [
"#f1eef6",
"#d4b9da",
"#c994c7",
"#df65b0",
"#e7298a",
"#ce1256",
"#91003f",
],
8: [
"#f7f4f9",
"#e7e1ef",
"#d4b9da",
"#c994c7",
"#df65b0",
"#e7298a",
"#ce1256",
"#91003f",
],
9: [
"#f7f4f9",
"#e7e1ef",
"#d4b9da",
"#c994c7",
"#df65b0",
"#e7298a",
"#ce1256",
"#980043",
"#67001f",
],
},
"OrRd": {
3: ["#fee8c8", "#fdbb84", "#e34a33"],
4: ["#fef0d9", "#fdcc8a", "#fc8d59", "#d7301f"],
5: ["#fef0d9", "#fdcc8a", "#fc8d59", "#e34a33", "#b30000"],
6: ["#fef0d9", "#fdd49e", "#fdbb84", "#fc8d59", "#e34a33", "#b30000"],
7: [
"#fef0d9",
"#fdd49e",
"#fdbb84",
"#fc8d59",
"#ef6548",
"#d7301f",
"#990000",
],
8: [
"#fff7ec",
"#fee8c8",
"#fdd49e",
"#fdbb84",
"#fc8d59",
"#ef6548",
"#d7301f",
"#990000",
],
9: [
"#fff7ec",
"#fee8c8",
"#fdd49e",
"#fdbb84",
"#fc8d59",
"#ef6548",
"#d7301f",
"#b30000",
"#7f0000",
],
},
"YlOrRd": {
3: ["#ffeda0", "#feb24c", "#f03b20"],
4: ["#ffffb2", "#fecc5c", "#fd8d3c", "#e31a1c"],
5: ["#ffffb2", "#fecc5c", "#fd8d3c", "#f03b20", "#bd0026"],
6: ["#ffffb2", "#fed976", "#feb24c", "#fd8d3c", "#f03b20", "#bd0026"],
7: [
"#ffffb2",
"#fed976",
"#feb24c",
"#fd8d3c",
"#fc4e2a",
"#e31a1c",
"#b10026",
],
8: [
"#ffffcc",
"#ffeda0",
"#fed976",
"#feb24c",
"#fd8d3c",
"#fc4e2a",
"#e31a1c",
"#b10026",
],
9: [
"#ffffcc",
"#ffeda0",
"#fed976",
"#feb24c",
"#fd8d3c",
"#fc4e2a",
"#e31a1c",
"#bd0026",
"#800026",
],
},
"YlOrBr": {
3: ["#fff7bc", "#fec44f", "#d95f0e"],
4: ["#ffffd4", "#fed98e", "#fe9929", "#cc4c02"],
5: ["#ffffd4", "#fed98e", "#fe9929", "#d95f0e", "#993404"],
6: ["#ffffd4", "#fee391", "#fec44f", "#fe9929", "#d95f0e", "#993404"],
7: [
"#ffffd4",
"#fee391",
"#fec44f",
"#fe9929",
"#ec7014",
"#cc4c02",
"#8c2d04",
],
8: [
"#ffffe5",
"#fff7bc",
"#fee391",
"#fec44f",
"#fe9929",
"#ec7014",
"#cc4c02",
"#8c2d04",
],
9: [
"#ffffe5",
"#fff7bc",
"#fee391",
"#fec44f",
"#fe9929",
"#ec7014",
"#cc4c02",
"#993404",
"#662506",
],
},
"Purples": {
3: ["#efedf5", "#bcbddc", "#756bb1"],
4: ["#f2f0f7", "#cbc9e2", "#9e9ac8", "#6a51a3"],
5: ["#f2f0f7", "#cbc9e2", "#9e9ac8", "#756bb1", "#54278f"],
6: ["#f2f0f7", "#dadaeb", "#bcbddc", "#9e9ac8", "#756bb1", "#54278f"],
7: [
"#f2f0f7",
"#dadaeb",
"#bcbddc",
"#9e9ac8",
"#807dba",
"#6a51a3",
"#4a1486",
],
8: [
"#fcfbfd",
"#efedf5",
"#dadaeb",
"#bcbddc",
"#9e9ac8",
"#807dba",
"#6a51a3",
"#4a1486",
],
9: [
"#fcfbfd",
"#efedf5",
"#dadaeb",
"#bcbddc",
"#9e9ac8",
"#807dba",
"#6a51a3",
"#54278f",
"#3f007d",
],
},
"Blues": {
3: ["#deebf7", "#9ecae1", "#3182bd"],
4: ["#eff3ff", "#bdd7e7", "#6baed6", "#2171b5"],
5: ["#eff3ff", "#bdd7e7", "#6baed6", "#3182bd", "#08519c"],
6: ["#eff3ff", "#c6dbef", "#9ecae1", "#6baed6", "#3182bd", "#08519c"],
7: [
"#eff3ff",
"#c6dbef",
"#9ecae1",
"#6baed6",
"#4292c6",
"#2171b5",
"#084594",
],
8: [
"#f7fbff",
"#deebf7",
"#c6dbef",
"#9ecae1",
"#6baed6",
"#4292c6",
"#2171b5",
"#084594",
],
9: [
"#f7fbff",
"#deebf7",
"#c6dbef",
"#9ecae1",
"#6baed6",
"#4292c6",
"#2171b5",
"#08519c",
"#08306b",
],
},
"Greens": {
3: ["#e5f5e0", "#a1d99b", "#31a354"],
4: ["#edf8e9", "#bae4b3", "#74c476", "#238b45"],
5: ["#edf8e9", "#bae4b3", "#74c476", "#31a354", "#006d2c"],
6: ["#edf8e9", "#c7e9c0", "#a1d99b", "#74c476", "#31a354", "#006d2c"],
7: [
"#edf8e9",
"#c7e9c0",
"#a1d99b",
"#74c476",
"#41ab5d",
"#238b45",
"#005a32",
],
8: [
"#f7fcf5",
"#e5f5e0",
"#c7e9c0",
"#a1d99b",
"#74c476",
"#41ab5d",
"#238b45",
"#005a32",
],
9: [
"#f7fcf5",
"#e5f5e0",
"#c7e9c0",
"#a1d99b",
"#74c476",
"#41ab5d",
"#238b45",
"#006d2c",
"#00441b",
],
},
"Oranges": {
3: ["#fee6ce", "#fdae6b", "#e6550d"],
4: ["#feedde", "#fdbe85", "#fd8d3c", "#d94701"],
5: ["#feedde", "#fdbe85", "#fd8d3c", "#e6550d", "#a63603"],
6: ["#feedde", "#fdd0a2", "#fdae6b", "#fd8d3c", "#e6550d", "#a63603"],
7: [
"#feedde",
"#fdd0a2",
"#fdae6b",
"#fd8d3c",
"#f16913",
"#d94801",
"#8c2d04",
],
8: [
"#fff5eb",
"#fee6ce",
"#fdd0a2",
"#fdae6b",
"#fd8d3c",
"#f16913",
"#d94801",
"#8c2d04",
],
9: [
"#fff5eb",
"#fee6ce",
"#fdd0a2",
"#fdae6b",
"#fd8d3c",
"#f16913",
"#d94801",
"#a63603",
"#7f2704",
],
},
"Reds": {
3: ["#fee0d2", "#fc9272", "#de2d26"],
4: ["#fee5d9", "#fcae91", "#fb6a4a", "#cb181d"],
5: ["#fee5d9", "#fcae91", "#fb6a4a", "#de2d26", "#a50f15"],
6: ["#fee5d9", "#fcbba1", "#fc9272", "#fb6a4a", "#de2d26", "#a50f15"],
7: [
"#fee5d9",
"#fcbba1",
"#fc9272",
"#fb6a4a",
"#ef3b2c",
"#cb181d",
"#99000d",
],
8: [
"#fff5f0",
"#fee0d2",
"#fcbba1",
"#fc9272",
"#fb6a4a",
"#ef3b2c",
"#cb181d",
"#99000d",
],
9: [
"#fff5f0",
"#fee0d2",
"#fcbba1",
"#fc9272",
"#fb6a4a",
"#ef3b2c",
"#cb181d",
"#a50f15",
"#67000d",
],
},
"Greys": {
3: ["#f0f0f0", "#bdbdbd", "#636363"],
4: ["#f7f7f7", "#cccccc", "#969696", "#525252"],
5: ["#f7f7f7", "#cccccc", "#969696", "#636363", "#252525"],
6: ["#f7f7f7", "#d9d9d9", "#bdbdbd", "#969696", "#636363", "#252525"],
7: [
"#f7f7f7",
"#d9d9d9",
"#bdbdbd",
"#969696",
"#737373",
"#525252",
"#252525",
],
8: [
"#ffffff",
"#f0f0f0",
"#d9d9d9",
"#bdbdbd",
"#969696",
"#737373",
"#525252",
"#252525",
],
9: [
"#ffffff",
"#f0f0f0",
"#d9d9d9",
"#bdbdbd",
"#969696",
"#737373",
"#525252",
"#252525",
"#000000",
],
},
"PuOr": {
3: ["#f1a340", "#f7f7f7", "#998ec3"],
4: ["#e66101", "#fdb863", "#b2abd2", "#5e3c99"],
5: ["#e66101", "#fdb863", "#f7f7f7", "#b2abd2", "#5e3c99"],
6: ["#b35806", "#f1a340", "#fee0b6", "#d8daeb", "#998ec3", "#542788"],
7: [
"#b35806",
"#f1a340",
"#fee0b6",
"#f7f7f7",
"#d8daeb",
"#998ec3",
"#542788",
],
8: [
"#b35806",
"#e08214",
"#fdb863",
"#fee0b6",
"#d8daeb",
"#b2abd2",
"#8073ac",
"#542788",
],
9: [
"#b35806",
"#e08214",
"#fdb863",
"#fee0b6",
"#f7f7f7",
"#d8daeb",
"#b2abd2",
"#8073ac",
"#542788",
],
10: [
"#7f3b08",
"#b35806",
"#e08214",
"#fdb863",
"#fee0b6",
"#d8daeb",
"#b2abd2",
"#8073ac",
"#542788",
"#2d004b",
],
11: [
"#7f3b08",
"#b35806",
"#e08214",
"#fdb863",
"#fee0b6",
"#f7f7f7",
"#d8daeb",
"#b2abd2",
"#8073ac",
"#542788",
"#2d004b",
],
},
"BrBG": {
3: ["#d8b365", "#f5f5f5", "#5ab4ac"],
4: ["#a6611a", "#dfc27d", "#80cdc1", "#018571"],
5: ["#a6611a", "#dfc27d", "#f5f5f5", "#80cdc1", "#018571"],
6: ["#8c510a", "#d8b365", "#f6e8c3", "#c7eae5", "#5ab4ac", "#01665e"],
7: [
"#8c510a",
"#d8b365",
"#f6e8c3",
"#f5f5f5",
"#c7eae5",
"#5ab4ac",
"#01665e",
],
8: [
"#8c510a",
"#bf812d",
"#dfc27d",
"#f6e8c3",
"#c7eae5",
"#80cdc1",
"#35978f",
"#01665e",
],
9: [
"#8c510a",
"#bf812d",
"#dfc27d",
"#f6e8c3",
"#f5f5f5",
"#c7eae5",
"#80cdc1",
"#35978f",
"#01665e",
],
10: [
"#543005",
"#8c510a",
"#bf812d",
"#dfc27d",
"#f6e8c3",
"#c7eae5",
"#80cdc1",
"#35978f",
"#01665e",
"#003c30",
],
11: [
"#543005",
"#8c510a",
"#bf812d",
"#dfc27d",
"#f6e8c3",
"#f5f5f5",
"#c7eae5",
"#80cdc1",
"#35978f",
"#01665e",
"#003c30",
],
},
"PRGn": {
3: ["#af8dc3", "#f7f7f7", "#7fbf7b"],
4: ["#7b3294", "#c2a5cf", "#a6dba0", "#008837"],
5: ["#7b3294", "#c2a5cf", "#f7f7f7", "#a6dba0", "#008837"],
6: ["#762a83", "#af8dc3", "#e7d4e8", "#d9f0d3", "#7fbf7b", "#1b7837"],
7: [
"#762a83",
"#af8dc3",
"#e7d4e8",
"#f7f7f7",
"#d9f0d3",
"#7fbf7b",
"#1b7837",
],
8: [
"#762a83",
"#9970ab",
"#c2a5cf",
"#e7d4e8",
"#d9f0d3",
"#a6dba0",
"#5aae61",
"#1b7837",
],
9: [
"#762a83",
"#9970ab",
"#c2a5cf",
"#e7d4e8",
"#f7f7f7",
"#d9f0d3",
"#a6dba0",
"#5aae61",
"#1b7837",
],
10: [
"#40004b",
"#762a83",
"#9970ab",
"#c2a5cf",
"#e7d4e8",
"#d9f0d3",
"#a6dba0",
"#5aae61",
"#1b7837",
"#00441b",
],
11: [
"#40004b",
"#762a83",
"#9970ab",
"#c2a5cf",
"#e7d4e8",
"#f7f7f7",
"#d9f0d3",
"#a6dba0",
"#5aae61",
"#1b7837",
"#00441b",
],
},
"PiYG": {
3: ["#e9a3c9", "#f7f7f7", "#a1d76a"],
4: ["#d01c8b", "#f1b6da", "#b8e186", "#4dac26"],
5: ["#d01c8b", "#f1b6da", "#f7f7f7", "#b8e186", "#4dac26"],
6: ["#c51b7d", "#e9a3c9", "#fde0ef", "#e6f5d0", "#a1d76a", "#4d9221"],
7: [
"#c51b7d",
"#e9a3c9",
"#fde0ef",
"#f7f7f7",
"#e6f5d0",
"#a1d76a",
"#4d9221",
],
8: [
"#c51b7d",
"#de77ae",
"#f1b6da",
"#fde0ef",
"#e6f5d0",
"#b8e186",
"#7fbc41",
"#4d9221",
],
9: [
"#c51b7d",
"#de77ae",
"#f1b6da",
"#fde0ef",
"#f7f7f7",
"#e6f5d0",
"#b8e186",
"#7fbc41",
"#4d9221",
],
10: [
"#8e0152",
"#c51b7d",
"#de77ae",
"#f1b6da",
"#fde0ef",
"#e6f5d0",
"#b8e186",
"#7fbc41",
"#4d9221",
"#276419",
],
11: [
"#8e0152",
"#c51b7d",
"#de77ae",
"#f1b6da",
"#fde0ef",
"#f7f7f7",
"#e6f5d0",
"#b8e186",
"#7fbc41",
"#4d9221",
"#276419",
],
},
"RdBu": {
3: ["#ef8a62", "#f7f7f7", "#67a9cf"],
4: ["#ca0020", "#f4a582", "#92c5de", "#0571b0"],
5: ["#ca0020", "#f4a582", "#f7f7f7", "#92c5de", "#0571b0"],
6: ["#b2182b", "#ef8a62", "#fddbc7", "#d1e5f0", "#67a9cf", "#2166ac"],
7: [
"#b2182b",
"#ef8a62",
"#fddbc7",
"#f7f7f7",
"#d1e5f0",
"#67a9cf",
"#2166ac",
],
8: [
"#b2182b",
"#d6604d",
"#f4a582",
"#fddbc7",
"#d1e5f0",
"#92c5de",
"#4393c3",
"#2166ac",
],
9: [
"#b2182b",
"#d6604d",
"#f4a582",
"#fddbc7",
"#f7f7f7",
"#d1e5f0",
"#92c5de",
"#4393c3",
"#2166ac",
],
10: [
"#67001f",
"#b2182b",
"#d6604d",
"#f4a582",
"#fddbc7",
"#d1e5f0",
"#92c5de",
"#4393c3",
"#2166ac",
"#053061",
],
11: [
"#67001f",
"#b2182b",
"#d6604d",
"#f4a582",
"#fddbc7",
"#f7f7f7",
"#d1e5f0",
"#92c5de",
"#4393c3",
"#2166ac",
"#053061",
],
},
"RdGy": {
3: ["#ef8a62", "#ffffff", "#999999"],
4: ["#ca0020", "#f4a582", "#bababa", "#404040"],
5: ["#ca0020", "#f4a582", "#ffffff", "#bababa", "#404040"],
6: ["#b2182b", "#ef8a62", "#fddbc7", "#e0e0e0", "#999999", "#4d4d4d"],
7: [
"#b2182b",
"#ef8a62",
"#fddbc7",
"#ffffff",
"#e0e0e0",
"#999999",
"#4d4d4d",
],
8: [
"#b2182b",
"#d6604d",
"#f4a582",
"#fddbc7",
"#e0e0e0",
"#bababa",
"#878787",
"#4d4d4d",
],
9: [
"#b2182b",
"#d6604d",
"#f4a582",
"#fddbc7",
"#ffffff",
"#e0e0e0",
"#bababa",
"#878787",
"#4d4d4d",
],
10: [
"#67001f",
"#b2182b",
"#d6604d",
"#f4a582",
"#fddbc7",
"#e0e0e0",
"#bababa",
"#878787",
"#4d4d4d",
"#1a1a1a",
],
11: [
"#67001f",
"#b2182b",
"#d6604d",
"#f4a582",
"#fddbc7",
"#ffffff",
"#e0e0e0",
"#bababa",
"#878787",
"#4d4d4d",
"#1a1a1a",
],
},
"RdYlBu": {
3: ["#fc8d59", "#ffffbf", "#91bfdb"],
4: ["#d7191c", "#fdae61", "#abd9e9", "#2c7bb6"],
5: ["#d7191c", "#fdae61", "#ffffbf", "#abd9e9", "#2c7bb6"],
6: ["#d73027", "#fc8d59", "#fee090", "#e0f3f8", "#91bfdb", "#4575b4"],
7: [
"#d73027",
"#fc8d59",
"#fee090",
"#ffffbf",
"#e0f3f8",
"#91bfdb",
"#4575b4",
],
8: [
"#d73027",
"#f46d43",
"#fdae61",
"#fee090",
"#e0f3f8",
"#abd9e9",
"#74add1",
"#4575b4",
],
9: [
"#d73027",
"#f46d43",
"#fdae61",
"#fee090",
"#ffffbf",
"#e0f3f8",
"#abd9e9",
"#74add1",
"#4575b4",
],
10: [
"#a50026",
"#d73027",
"#f46d43",
"#fdae61",
"#fee090",
"#e0f3f8",
"#abd9e9",
"#74add1",
"#4575b4",
"#313695",
],
11: [
"#a50026",
"#d73027",
"#f46d43",
"#fdae61",
"#fee090",
"#ffffbf",
"#e0f3f8",
"#abd9e9",
"#74add1",
"#4575b4",
"#313695",
],
},
"Spectral": {
3: ["#fc8d59", "#ffffbf", "#99d594"],
4: ["#d7191c", "#fdae61", "#abdda4", "#2b83ba"],
5: ["#d7191c", "#fdae61", "#ffffbf", "#abdda4", "#2b83ba"],
6: ["#d53e4f", "#fc8d59", "#fee08b", "#e6f598", "#99d594", "#3288bd"],
7: [
"#d53e4f",
"#fc8d59",
"#fee08b",
"#ffffbf",
"#e6f598",
"#99d594",
"#3288bd",
],
8: [
"#d53e4f",
"#f46d43",
"#fdae61",
"#fee08b",
"#e6f598",
"#abdda4",
"#66c2a5",
"#3288bd",
],
9: [
"#d53e4f",
"#f46d43",
"#fdae61",
"#fee08b",
"#ffffbf",
"#e6f598",
"#abdda4",
"#66c2a5",
"#3288bd",
],
10: [
"#9e0142",
"#d53e4f",
"#f46d43",
"#fdae61",
"#fee08b",
"#e6f598",
"#abdda4",
"#66c2a5",
"#3288bd",
"#5e4fa2",
],
11: [
"#9e0142",
"#d53e4f",
"#f46d43",
"#fdae61",
"#fee08b",
"#ffffbf",
"#e6f598",
"#abdda4",
"#66c2a5",
"#3288bd",
"#5e4fa2",
],
},
"RdYlGn": {
3: ["#fc8d59", "#ffffbf", "#91cf60"],
4: ["#d7191c", "#fdae61", "#a6d96a", "#1a9641"],
5: ["#d7191c", "#fdae61", "#ffffbf", "#a6d96a", "#1a9641"],
6: ["#d73027", "#fc8d59", "#fee08b", "#d9ef8b", "#91cf60", "#1a9850"],
7: [
"#d73027",
"#fc8d59",
"#fee08b",
"#ffffbf",
"#d9ef8b",
"#91cf60",
"#1a9850",
],
8: [
"#d73027",
"#f46d43",
"#fdae61",
"#fee08b",
"#d9ef8b",
"#a6d96a",
"#66bd63",
"#1a9850",
],
9: [
"#d73027",
"#f46d43",
"#fdae61",
"#fee08b",
"#ffffbf",
"#d9ef8b",
"#a6d96a",
"#66bd63",
"#1a9850",
],
10: [
"#a50026",
"#d73027",
"#f46d43",
"#fdae61",
"#fee08b",
"#d9ef8b",
"#a6d96a",
"#66bd63",
"#1a9850",
"#006837",
],
11: [
"#a50026",
"#d73027",
"#f46d43",
"#fdae61",
"#fee08b",
"#ffffbf",
"#d9ef8b",
"#a6d96a",
"#66bd63",
"#1a9850",
"#006837",
],
},
}
## Special, backward compatible color map.
ddlheatmap = mplcol.ListedColormap(SEQUENCES["ddl_heat"][12], "DDL Heat", 12)
## Default Color Sequence
DEFAULT_SEQUENCE = "RdBu"
##########################################################################
## Palette Object
##########################################################################
class ColorPalette(list):
"""
A wrapper for functionality surrounding a list of colors, including a
context manager that allows the palette to be set with a with statement.
"""
def __init__(self, name_or_list):
"""
Can initialize the ColorPalette with either a name or a list.
Parameters
----------
name_or_list :
specify a palette name or a list of RGB or Hex values
"""
if isinstance(name_or_list, str):
if name_or_list not in PALETTES:
raise YellowbrickValueError(
"'{}' is not a recognized palette!".format(name_or_list)
)
name_or_list = PALETTES[name_or_list]
super(ColorPalette, self).__init__(name_or_list)
def __enter__(self):
"""
Open the context and assign the pallete to the mpl.rcParams
"""
from .rcmod import set_palette
self._orig_palette = color_palette()
set_palette(self)
return self
def __exit__(self, *args):
"""
Close the context and restore the original palette
"""
from .rcmod import set_palette
set_palette(self._orig_palette)
def as_hex(self):
"""
Return a color palette with hex codes instead of RGB values.
"""
hex = [mpl.colors.rgb2hex(rgb) for rgb in self]
return ColorPalette(hex)
def as_rgb(self):
"""
Return a color palette with RGB values instead of hex codes.
"""
rgb = [mpl.colors.colorConverter.to_rgb(hex) for hex in self]
return ColorPalette(rgb)
def plot(self, size=1):
"""
Plot the values in the color palette as a horizontal array.
See Seaborn's palplot function for inspiration.
Parameters
----------
size : int
scaling factor for size of the plot
"""
n = len(self)
fig, ax = plt.subplots(1, 1, figsize=(n * size, size))
ax.imshow(
np.arange(n).reshape(1, n),
cmap=mpl.colors.ListedColormap(list(self)),
interpolation="nearest",
aspect="auto",
)
ax.set_xticks(np.arange(n) - 0.5)
ax.set_yticks([-0.5, 0.5])
ax.set_xticklabels([])
ax.set_yticklabels([])
##########################################################################
## Palette Functions
##########################################################################
[docs]def color_palette(palette=None, n_colors=None):
"""
Return a color palette object with color definition and handling.
Calling this function with ``palette=None`` will return the current
matplotlib color cycle.
This function can also be used in a ``with`` statement to temporarily
set the color cycle for a plot or set of plots.
Parameters
----------
palette : None or str or sequence
Name of a palette or ``None`` to return the current palette. If a
sequence the input colors are used but possibly cycled.
Available palette names from :py:mod:`yellowbrick.colors.palettes` are:
.. hlist::
:columns: 3
* :py:const:`accent`
* :py:const:`dark`
* :py:const:`paired`
* :py:const:`pastel`
* :py:const:`bold`
* :py:const:`muted`
* :py:const:`colorblind`
* :py:const:`sns_colorblind`
* :py:const:`sns_deep`
* :py:const:`sns_muted`
* :py:const:`sns_pastel`
* :py:const:`sns_bright`
* :py:const:`sns_dark`
* :py:const:`flatui`
* :py:const:`neural_paint`
n_colors : None or int
Number of colors in the palette. If ``None``, the default will depend
on how ``palette`` is specified. Named palettes default to 6 colors
which allow the use of the names "bgrmyck", though others do have more
or less colors; therefore reducing the size of the list can only be
done by specifying this parameter. Asking for more colors than exist
in the palette will cause it to cycle.
Returns
-------
list(tuple)
Returns a ColorPalette object, which behaves like a list, but can be
used as a context manager and possesses functions to convert colors.
.. seealso::
:func:`.set_palette`
Set the default color cycle for all plots.
:func:`.set_color_codes`
Reassign color codes like ``"b"``, ``"g"``, etc. to
colors from one of the yellowbrick palettes.
:func:`..colors.resolve_colors`
Resolve a color map or listed sequence of colors.
"""
if palette is None:
palette = get_color_cycle()
if n_colors is None:
n_colors = len(palette)
elif not isinstance(palette, str):
if n_colors is None:
n_colors = len(palette)
else:
if palette.lower() not in PALETTES:
raise YellowbrickValueError(
"'{}' is not a recognized palette!".format(palette)
)
palette = PALETTES[palette.lower()]
if n_colors is None:
n_colors = len(palette)
# Always return as many colors as we asked for
pal_cycle = cycle(palette)
palette = [next(pal_cycle) for _ in range(n_colors)]
# Always return in RGB tuple format
try:
palette = map(mpl.colors.colorConverter.to_rgb, palette)
palette = ColorPalette(palette)
except ValueError:
raise YellowbrickValueError(
"Could not generate a palette for %s" % str(palette)
)
return palette
[docs]def set_color_codes(palette="accent"):
"""
Change how matplotlib color shorthands are interpreted.
Calling this will change how shorthand codes like "b" or "g"
are interpreted by matplotlib in subsequent plots.
Parameters
----------
palette : str
Named yellowbrick palette to use as the source of colors.
See Also
--------
set_palette : Color codes can also be set through the function that
sets the matplotlib color cycle.
"""
if palette not in PALETTES:
raise YellowbrickValueError("'{}' is not a recognized palette!".format(palette))
# Fetch the colors and adapt the length
colors = PALETTES[palette]
if len(colors) > 7:
# Truncate colors that are longer than 7
colors = colors[:7]
elif len(colors) < 7:
# Add the key (black) color to colors that are shorter than 7
colors = colors + [YB_KEY]
# Set the color codes on matplotlib
for code, color in zip("bgrmyck", colors):
rgb = mpl.colors.colorConverter.to_rgb(color)
mpl.colors.colorConverter.colors[code] = rgb
mpl.colors.colorConverter.cache[code] = rgb
##########################################################################
## Sequence Functions
##########################################################################
def color_sequence(palette=None, n_colors=None):
"""
Return a `ListedColormap` object from a named sequence palette. Useful
for continuous color scheme values and color maps.
Calling this function with ``palette=None`` will return the default
color sequence: Color Brewer RdBu.
Parameters
----------
palette : None or str or sequence
Name of a palette or ``None`` to return the default palette. If a
sequence the input colors are used to create a ListedColormap.
The currently implemented color sequences are from Color Brewer.
Available palette names from :py:mod:`yellowbrick.colors.palettes` are:
.. hlist::
:columns: 3
* :py:const: Blues
* :py:const: BrBG
* :py:const: BuGn
* :py:const: BuPu
* :py:const: GnBu
* :py:const: Greens
* :py:const: Greys
* :py:const: OrRd
* :py:const: Oranges
* :py:const: PRGn
* :py:const: PiYG
* :py:const: PuBu
* :py:const: PuBuGn
* :py:const: PuOr
* :py:const: PuRd
* :py:const: Purples
* :py:const: RdBu
* :py:const: RdGy
* :py:const: RdPu
* :py:const: RdYlBu
* :py:const: RdYlGn
* :py:const: Reds
* :py:const: Spectral
* :py:const: YlGn
* :py:const: YlGnBu
* :py:const: YlOrBr
* :py:const: YlOrRd
* :py:const: ddl_heat
n_colors : None or int
Number of colors in the palette. If ``None``, the default will depend
on how ``palette`` is specified - selecting the largest sequence for
that palette name. Note that sequences have a minimum lenght of 3 - if
a number of colors is specified that is not available for the sequence
a ``ValueError`` is raised.
Returns
-------
colormap
Returns a ListedColormap object, an artist object from the matplotlib
library that can be used wherever a colormap is necessary.
"""
# Select the default colormap if None is passed in.
palette = palette or DEFAULT_SEQUENCE
# Create a listed color map from the sequence
if not isinstance(palette, str):
return mplcol.ListedColormap(palette)
# Otherwise perform a case-insensitive lookup
sequences = {key.lower(): key for key in SEQUENCES.keys()}
if palette.lower() not in sequences:
raise YellowbrickValueError("'{}' is not a recognized palette!".format(palette))
# Collect the palette into the dictionary of lists.
n_palettes = SEQUENCES[sequences[palette.lower()]]
# If no definitive color is passed in, maximize it.
if n_colors is None:
n_colors = max(n_palettes.keys())
else:
if n_colors not in n_palettes.keys():
raise YellowbrickValueError(
"No {} palette of length {}".format(palette, n_colors)
)
# Return the color map from the sequence
return mplcol.ListedColormap(n_palettes[n_colors], name=palette, N=n_colors)