Source code for curie.plotting

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import matplotlib.pyplot as plt

LIGHT = """#1abc9c #2ecc71 #3498db #9b59b6 #34495e #f1c40f #e67e22 #e74c3c #ecf0f1 #95a5a6
#81ecec #55efc4 #74b9ff #a29bfe #636e72 #ffeaa7 #fab1a0 #ff7675 #dfe6e9 #b2bec3
#7ed6df #badc58 #686de0 #e056fd #30336b #f6e58d #ffbe76 #ff7979 #dff9fb #95afc0
#00a8ff #4cd137 #273c75 #9c88ff #353b48 #fbc531 #e67e22 #e84118 #f5f6fa #7f8fa6
#00d2d3 #1dd1a1 #54a0ff #5f27cd #576574 #feca57 #e67e22 #ff6b6b #ecf0f1 #8395a7
#70a1ff #7bed9f #70a1ff #5352ed #57606f #eccc68 #ff7f50 #ff6b81 #ffffff #dfe4ea
#12CBC4 #C4E538 #0652DD #FDA7DF #833471 #FFC312 #EE5A24 #ED4C67 #ecf0f1 #95a5a6
#38ada9 #b8e994 #6a89cc #6a89cc #1e3799 #fad390 #fa983a #f8c291 #ecf0f1 #95a5a6
#2bcbba #26de81 #4b7bec #a55eea #778ca3 #fed330 #fd9644 #fc5c65 #ecf0f1 #d1d8e0
#9AECDB #55E6C1 #25CCF7 #D6A2E8 #3B3B98 #F8EFBA #FEA47F #FD7272 #ecf0f1 #CAD3C8
#63cdda #2ecc71 #778beb #cf6a87 #596275 #f7d794 #f3a683 #e77f67 #ecf0f1 #95a5a6
#34ace0 #33d9b2 #706fd3 #40407a #34495e #ffb142 #ff793f #ff5252 #f7f1e3 #d1ccc0
#34e7e4 #0be881 #4bcffa #575fcf #485460 #ffdd59 #ffc048 #ff5e57 #ecf0f1 #d2dae2
#7efff5 #32ff7e #18dcff #7d5fff #4b4b4b #fffa65 #ffaf40 #ff4d4d #ecf0f1 #95a5a6"""

DARK = """#16a085 #27ae60 #2980b9 #8e44ad #2c3e50 #f39c12 #d35400 #c0392b #bdc3c7 #7f8c8d
#00cec9 #00b894 #0984e3 #6c5ce7 #2d3436 #fdcb6e #e17055 #d63031 #b2bec3 #636e72
#22a6b3 #6ab04c #4834d4 #be2edd #130f40 #f9ca24 #f0932b #eb4d4b #c7ecee #535c68
#0097e6 #44bd32 #192a56 #8c7ae6 #2f3640 #e1b12c #d35400 #c23616 #dcdde1 #718093
#01a3a4 #10ac84 #2e86de #341f97 #222f3e #ff9f43 #d35400 #ee5253 #bdc3c7 #8395a7
#1e90ff #2ed573 #1e90ff #3742fa #2f3542 #ffa502 #ff6348 #ff4757 #f1f2f6 #ced6e0
#1289A7 #A3CB38 #1B1464 #D980FA #6F1E51 #F79F1F #EA2027 #B53471 #bdc3c7 #7f8c8d
#079992 #78e08f #4a69bd #4a69bd #0c2461 #f6b93b #e58e26 #e55039 #bdc3c7 #7f8c8d
#0fb9b1 #20bf6b #3867d6 #8854d0 #4b6584 #f7b731 #fa8231 #eb3b5a #bdc3c7 #a5b1c2
#BDC581 #58B19F #1B9CFC #82589F #182C61 #EAB543 #F97F51 #FC427B #bdc3c7 #2C3A47
#3dc1d3 #27ae60 #546de5 #c44569 #303952 #f5cd79 #f19066 #e15f41 #bdc3c7 #7f8c8d
#227093 #218c74 #474787 #2c2c54 #2c3e50 #cc8e35 #cd6133 #b33939 #aaa69d #84817a
#00d8d6 #05c46b #0fbcf9 #3c40c6 #1e272e #ffd32a #ffa801 #ff3f34 #bdc3c7 #808e9b
#67e6dc #3ae374 #17c0eb #7158e2 #3d3d3d #fff200 #ff9f1a #ff3838 #bdc3c7 #7f8c8d"""

global CURRENT_PALETTE, CURRENT_SHADE
CURRENT_PALETTE = 'default'
CURRENT_SHADE = 'dark'

[docs] def colormap(palette=None, shade=None, aslist=False): """Broad spectrum of hex-formatted colors for plotting Function to provide a broad palette of colors for plotting, inspired by the FlatUI color picker at https://flatuicolors.com/ Parameters ---------- palette : str, optional Choice of color palette. Options are `default`, `american`, `aussie`, `british`, `canadian`, `chinese`, `french`, `german`, `indian`, `russian`, `spanish`, `swedish` and `turkish`. shade : str, optional `light` or `dark` theme. Default is `dark`. aslist : bool, optional Specifies whether to return the colormap as a dictionary, e.g. {'k':'#000000', 'w':'#ffffff'} or as a list, e.g. ['#000000', '#ffffff']. Default is `False` (returns dictionary) Returns ------- colormap : dict or list Colormap in list or dictionary format Examples -------- >>> cm = ci.colormap() >>> print(cm) {'b': '#2980b9', 'g': '#27ae60', 'k': '#2c3e50', 'o': '#d35400', 'aq': '#16a085', 'p': '#8e44ad', 'r': '#c0392b', 'gy': '#7f8c8d', 'w': '#bdc3c7', 'y': '#f39c12'} >>> cm_list = ci.colormap(aslist=True) >>> cm_british_light = ci.colormap('british', 'light') """ pmap = ['default','american','aussie','british','canadian', 'chinese','dutch','french','german','indian','russian', 'spanish','swedish','turkish'] cmap = ['aq','g','b','p','k','y','o','r','w','gy'] global CURRENT_PALETTE, CURRENT_SHADE if palette is None: palette = CURRENT_PALETTE if shade is None: shade = CURRENT_SHADE if palette.lower() not in pmap: palette = 'default' if shade.lower()=='light': cl = LIGHT.split('\n')[pmap.index(palette.lower())].split(' ') else: cl = DARK.split('\n')[pmap.index(palette.lower())].split(' ') CURRENT_PALETTE = palette.lower() CURRENT_SHADE = shade.lower() if aslist: return [cl[n] for n in [4,9,7,2,1,6,0,5,3]] return {cmap[n]:cl[n] for n in range(len(cl))}
[docs] def set_style(style='default', palette='default', shade='dark'): """Preset styles for generating plots Adjusts default font sizes, colors and spacing for plots, with presets based on the intended application (i.e. `poster`, `paper`, etc.) Parameters ---------- style : str, optional Preset style based on intended application of the plot. Options are `paper`, `poster`, `presentation`, and the default: `default`. palette : str, optional Sets colormap palette for plots, see `colormap` for detailed options. shade : str, optional Sets colormap shade for plots, see `colormap` for detailed options Examples -------- >>> ci.set_style('paper') >>> ci.set_style('poster', shade='dark') >>> ci.set_style('presentation', palette='aussie') """ from cycler import cycler cm = colormap(palette=palette, shade=shade) plt.rcParams['axes.prop_cycle'] = cycler(color=[cm['k'],cm['r'],cm['b'],cm['gy'],cm['g'],cm['p'],cm['o'],cm['aq'],cm['y']]) plt.rcParams['font.family']='sans-serif' plt.rcParams['figure.autolayout'] = 'True' plt.rcParams['xtick.minor.visible']='True' plt.rcParams['ytick.minor.visible']='True' plt.rcParams['xtick.major.size']='5' plt.rcParams['xtick.minor.size']='3.5' plt.rcParams['ytick.major.size']='5' plt.rcParams['ytick.minor.size']='3.5' if style.lower()=='paper': plt.rcParams['font.size']='14' plt.rcParams['axes.labelsize']='16' plt.rcParams['legend.fontsize']='12' plt.rcParams['axes.titlepad']='10' plt.rcParams['xtick.major.pad']='6' plt.rcParams['ytick.major.pad']='6' plt.rcParams['xtick.major.width']='1.25' plt.rcParams['xtick.minor.width']='1.05' plt.rcParams['ytick.major.width']='1.25' plt.rcParams['ytick.minor.width']='1.05' plt.rcParams['axes.linewidth']='1.05' plt.rcParams['lines.markersize']='4.0' plt.rcParams['lines.linewidth'] = '2.2' plt.rcParams['errorbar.capsize']='4.5' plt.rcParams['lines.markeredgewidth']='1.2' elif style.lower()=='poster': plt.rcParams['font.size']='16' plt.rcParams['axes.labelsize']='18' plt.rcParams['legend.fontsize']='14' plt.rcParams['axes.titlepad']='12' plt.rcParams['xtick.major.pad']='8' plt.rcParams['ytick.major.pad']='8' plt.rcParams['xtick.major.width']='1.5' plt.rcParams['xtick.minor.width']='1.2' plt.rcParams['ytick.major.width']='1.5' plt.rcParams['ytick.minor.width']='1.2' plt.rcParams['axes.linewidth']='1.4' plt.rcParams['lines.markersize']='4.5' plt.rcParams['lines.linewidth'] = '2.8' plt.rcParams['errorbar.capsize']='5.0' plt.rcParams['lines.markeredgewidth']='1.4' elif style.lower()=='presentation': plt.rcParams['font.size']='15' plt.rcParams['axes.labelsize']='17' plt.rcParams['legend.fontsize']='12' plt.rcParams['axes.titlepad']='10' plt.rcParams['xtick.major.pad']='7' plt.rcParams['ytick.major.pad']='7' plt.rcParams['xtick.major.width']='1.25' plt.rcParams['xtick.minor.width']='1.05' plt.rcParams['ytick.major.width']='1.25' plt.rcParams['ytick.minor.width']='1.05' plt.rcParams['axes.linewidth']='1.15' plt.rcParams['lines.markersize']='4.0' plt.rcParams['lines.linewidth'] = '2.4' plt.rcParams['errorbar.capsize']='5.0' plt.rcParams['lines.markeredgewidth']='1.4' else: ### default plt.rcParams['font.size']='14' plt.rcParams['axes.labelsize']='15' plt.rcParams['legend.fontsize']='11' plt.rcParams['axes.titlepad']='8' plt.rcParams['xtick.major.pad']='5' plt.rcParams['ytick.major.pad']='5' plt.rcParams['xtick.major.width']='1.25' plt.rcParams['xtick.minor.width']='1.05' plt.rcParams['ytick.major.width']='1.25' plt.rcParams['ytick.minor.width']='1.05' plt.rcParams['axes.linewidth']='1.05' plt.rcParams['lines.markersize']='3.5' plt.rcParams['lines.linewidth'] = '2.0' plt.rcParams['errorbar.capsize']='4.2' plt.rcParams['lines.markeredgewidth']='1.15'
def _init_plot(**kwargs): if any([i in kwargs for i in ['style', 'palette', 'shade']]): st = kwargs['style'] if 'style' in kwargs else 'default' pa = kwargs['palette'] if 'palette' in kwargs else 'default' sh = kwargs['shade'] if 'shade' in kwargs else 'dark' set_style(style=st, palette=pa, shade=sh) f, ax = None, None if 'f' in kwargs and 'ax' in kwargs: f, ax = kwargs['f'], kwargs['ax'] N = kwargs['_N_plots'] if '_N_plots' in kwargs else 1 if f is None or ax is None: if 'figsize' in kwargs: f, ax = plt.subplots(1, N, figsize=kwargs['figsize']) else: f, ax = plt.subplots(1, N) return f, ax def _draw_plot(fig, axis, **kwargs): f, ax = fig, axis if '_default_log' in kwargs: if kwargs['_default_log']: ax.set_yscale('log') else: ax.set_yscale('linear') if 'scale' in kwargs: s = kwargs['scale'].lower() if s in ['log','logy']: ax.set_yscale('log') elif s in ['lin','liny','linear']: ax.set_yscale('linear') elif s=='logx': ax.set_xscale('log') elif s=='linx': ax.set_xscale('linear') elif s in ['linlog','loglog','loglin','linlin']: ax.set_xscale(s[:3].replace('lin','linear')) ax.set_yscale(s[3:].replace('lin','linear')) f.tight_layout() if 'saveas' in kwargs: if kwargs['saveas'] is not None: if kwargs['saveas'].endswith('.pickle'): import pickle as pl with open(kwargs['saveas'],'wb') as fl: pl.dump(f, fl) else: f.savefig(kwargs['saveas']) if 'return_plot' in kwargs: if kwargs['return_plot']: return f, ax if 'show' in kwargs: if kwargs['show']: plt.show() else: plt.show() plt.close()