From 4f9a0030588811716fc392873e365a75a4ecb93c Mon Sep 17 00:00:00 2001 From: Frank Sauerburger <f.sauerburger@cern.ch> Date: Wed, 26 Jun 2019 21:57:06 +0200 Subject: [PATCH] Add hist styling draft --- histogram.ipynb | 15 ++++++------- nnfwtbn/plot.py | 56 ++++++++++++++++++++++++++++++++++++------------- 2 files changed, 49 insertions(+), 22 deletions(-) diff --git a/histogram.ipynb b/histogram.ipynb index 093de90..2537a3a 100644 --- a/histogram.ipynb +++ b/histogram.ipynb @@ -11,11 +11,12 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", + "import seaborn as sns\n", "df = pd.read_hdf(\"test.h5\")\n", "#df = pd.read_hdf(\"demo/mva.h5\")" ] @@ -31,7 +32,7 @@ "p_zll = Process(r\"$Z\\rightarrow\\ell\\ell$\", range=(-599, -500))\n", "p_fake = Process(r\"Fake\", range=(-199, -100))\n", "\n", - "p_sig = Process(r\"Signal\", range=(1, 1000), type='line')" + "p_sig = Process(r\"Signal\", range=(1, 1000))" ] }, { @@ -58,14 +59,14 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 14, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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s68vJiaGxMREvv32W6f7TkhIYNGiRWRlZfHmm28ydOhQDh8+TGhoKFOnTmXq1Kls376d7t27k5CQQI8ePTz5pys/kpSU5HSoaGPM6RJV7OqSAPjF+u9mu3Xb3HhdVSDU7vkaoI99meI09Xz22We25o8qVarIqVOn8pXJysqSwMBAWzn79n8RkYEDB9q2DRgwwOl+1qxZ41azzfHjx6Vfv34ubxS/++67tjLt27cXEZHDhw+7rD8wMNB2M9VdHTp0kOuuu07+93//17ZuwoQJct1118nIkSNt606fPi3h4eEyb948ycrKkgULFkh4eLjtRrL9jdxcueuuXLkiffv2lZEjRxZ4AzNvU88dd9xh27Z//34BJCsry+lryXNzt6B6RSw3tevXry8vvviiZGZmysqVKyUkJER27twpIiJDhw6VESNGyIULF2Tnzp0SExOTr6nHfl/nzp2T66+/XpKTk23t9evWrZOUlBS5cuWKfPDBB/LHH3+IiOV9vf7660VEZPHixbJnzx65evWqHDp0SGrVqiXfffed079BqZLAW009dnYYY0YCAcaYxsaYN6xJ3JWawGpjzFZgHbBURL5x43UFyszM5J///Kdtefz48dSoUSNfuYoVK1KvXj3bct7mHvumnoKaeez77xekZs2abNu2ja+++gqwnJkX1HWrcePGtufbt29HRIiMjOTjjz/mvvvuo23btkRHR1OpUiWqVKlCXFwc48ePZ9u2bW79WMpeYmIip06dcvj9QJcuXTh16pRDN87IyEiWLFnC1KlTiYyM5JVXXmHJkiVERbm+iqxUqRKfffYZJ0+e5K677ir1rp55Y1m8eDFff/01UVFRjB8/nuTkZJo2bQrAm2++SXp6OrVq1WL06NGMGDGCypUrF1hfaGgoy5cvZ8GCBURHR1OrVi0mTpzIlStXAJg7dy716tUjLCyM6dOn236At2fPHnr27ElISAgdOnRg/Pjx3Hzzzd4/AEoVkcuJWIwxVYBJQC/AAMuAZ8UDY/joRCzKFyZOnMiJEyd4//33fR2KKkPOnDlja5Y7ceIEAQEBthPLdevWUalSJV+G56CkE7G4bOMXkYtYEv+k4u5EKV9KTU0lMzOTli1bsn79embNmsW7777r67CUC9/uLFkzdl63xBV+JRsZGWm7/zdlyhRCQkLyDZ9yrSiwqccY09kYM8ZueaEx5jvro3vphKdUyZ0/f57BgwdTtWpVhg0bxiOPPMJtt93m67BUOfLKK6/QokULWrRowRtvvAHA3r17ad68OcOHDycuLo6hQ4c67aFXFhV2xv8vLIOz5boBGIflRu2TwHfeC0spz0lISGDv3r2+DkOVU2vXrmXevHmsX7+e7Oxs2rVrR7du3QgODiYlJYVZs2bRvn17xowZwzvvvMPf//53X4fsUmE3d8NEJMVueY+IbBSRVUCoJ3aeOx5/UlKS/TjTSilVZqxevZq//OUvBAcHExoaysCBA21DvNevX5/27dsDMGrUKFsXbG9YvHixffdOr43HH2G/ICKD7RZrlmSnuTw1Hr9SSvlC3t+5uDNse3F5cjz+ws74U40xf8670hjTH9hVkp0qpVR50aVLFz7//HMuXbpERkYGixYtokuXLgDs37+f9evXA5Yh1e27UJdlhZ3x/wNYaowZgmW8HYA/AR2xDNymlFLXvHbt2jFixAjbDHh/+9vfaNmyJXv37iUuLo5///vfbNmyhZYtWzr9lW1ZVGg/fmNMZeAOoLl11Q5gvif68IP241dFl56ezi233EJKSgq//PILLVq08HVIyk/t3buXIUOG5JuqsTR4tR+/iFwB3BsNTalSUKVKFZYuXerwC26lVNG4NQNXefH8889jjHH7oUrPrl27aN26NaGhofznP/+hXr16/Pe//y1yPYGBgU6H6VCqtDVq1MgnZ/uecM0k/uzsbH799deizhdQLG+++Sbx8fFUrlyZcePG5ds+atQoateuTVhYGE2aNMn3K9GQkBDbo0KFCgQHB9uW7Sded6ZPnz48/fTT+dYvWrSIWrVquTV1oKv4ABYsWEBcXBxVq1alYcOGtu5rebk6FrleeeUVbr75Zs6fP8+DDz7oMkallPe4Myyz1+T24wfHrkrF8c033+QbntlboqOjeeqpp1i2bJnTX+o98cQTzJo1i8qVK5Oamkq3bt1o06aNbUz/jIwMW9l69erx7rvv0rNnT7f2PXbsWCZNmsS//vUvh6uWuXPncscddzgMP10QV/F9++23TJw4kY8++oh27dpx/PjxYh+LXAcPHmT48OFu/Y0nTpxwWnbBggUOY/or5U8WL15s/3unEvXjL+xsuI/d83BgFrANmA/ULMmQoLmPks65a+/OO++U8+fPO6zbt2+f9OvXTyIjIyU0NFR69uzp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\n", "text/plain": [ - "<matplotlib.figure.Figure at 0x7ff6db317208>" + "<matplotlib.figure.Figure at 0x7f855ba95630>" ] }, "metadata": {}, @@ -73,8 +74,8 @@ } ], "source": [ - "hist(df, v_mmc, 40, [p_fake, p_top, p_zll, p_ztt, p_sig], range=(0, 200), selection=c_vbf,\n", - " weight=\"weight\")\n", + "hist(df, v_mmc, 40, [p_fake, p_top, p_zll, p_ztt], [p_sig], range=(0, 200), selection=c_vbf,\n", + " weight=\"weight\", color=[sns.color_palette(\"Blues\"), sns.color_palette()[1:]])\n", "None" ] }, diff --git a/nnfwtbn/plot.py b/nnfwtbn/plot.py index 1f9591c..9167e6c 100644 --- a/nnfwtbn/plot.py +++ b/nnfwtbn/plot.py @@ -46,9 +46,9 @@ def _type_to_histtype(type): type_map = {"fill": "stepfilled", "line": "step"} return type_map[type] -def hist(dataframe, variable, bins, *stacks, data=None, selection=None, - range=None, color=None, blind=None, axes=None, figure=None, - weight=None): +def hist(dataframe, variable, bins, *stacks, selection=None, + range=None, blind=None, axes=None, figure=None, + weight=None, **kwds): """ Creates a histogram of stacked processes. The first argument is the dataframe to operate on. The 'variable' argument defines the x-axis. The @@ -65,15 +65,9 @@ def hist(dataframe, variable, bins, *stacks, data=None, selection=None, in a list are stacked. The type attributes of processes are considered during plotting. - The optional color must have the with same structure as the stacked list - and defines the color of the process. For a list of stacked processes, the - corresponding list of colors can be replaced by a callable which is used - repeatedly for each process in the stack. The colors must be valid - matplotlib colors. - The optional blind argument controls which process should be blinded. The - argument can be a list of processes to blind. By default blinding is - applied to data. Use an empty list to disable blinding. + argument can be a single process, a list of processes or None. By default, + no process is blinded. If the figure argument is omitted, this method creates a new axes and figure. If axes only is omitted, the method creates a new axes from the @@ -85,6 +79,15 @@ def hist(dataframe, variable, bins, *stacks, data=None, selection=None, The weight is used to weight the entries. Entries have unit weight if omitted. The argument can be a string name of a column or a variable object. + + Any other keyword argument is used to define the style. If the keyword + argument is a list, it's length must equal the number of stacks. If the + list item is a list, it is cycled for every stack member. If the list + member is not a list, this value is used for all members of the stack. + If the keyword is not a list, the property is passed directly to + matplotlib. The only exception is 'histtype'. The histtype argument can be + 'step', 'stepfilled' or 'points'. In the former two cases matplotlibs hist + method ist used, in the latter case 'errorbar' is used. """ # Wrap column string by variable if isinstance(variable, str): @@ -119,22 +122,45 @@ def hist(dataframe, variable, bins, *stacks, data=None, selection=None, bins = np.linspace(range[0], range[1], bins + 1) equidistant_bins = True + # Check structure of kwds + new_kwds = {} + for kwd, value in kwds.items(): + if isinstance(value, list): + if len(value) != len(stacks): + raise ValueError("Length of %s must equal number of stacks." + % repr(kwd)) + + # Wrap properties for the whole stack in a list + new_kwds[kwd] = [(_ if isinstance(_, list) else [_]) for _ in value] + + else: + # Single value for all stacks and all processes + new_kwds[kwd] = [[value]]*len(stacks) + kwds = new_kwds + # Handle stack - for stack in stacks: + for i_stack, stack in enumerate(stacks): if isinstance(stack, Process): # Wrap single process stack = [stack] bottom = np.zeros(len(bins) - 1) - for process in stack: + for i_process, process in enumerate(stack): sel = selection & process.selection + # Prepare style + process_kwds = {} + for kwd, props in kwds.items(): + # Cycle through property stacks + stack_props = props[i_stack] + process_kwds[kwd] = stack_props[i_process % len(stack_props)] + n, _, _ = axes.hist(variable(dataframe[sel(dataframe)]), bins=bins, range=range, bottom=bottom, label=process.label, - histtype=_type_to_histtype(process.type), - weights=weight(dataframe[sel(dataframe)])) + weights=weight(dataframe[sel(dataframe)]), + **process_kwds) bottom += n axes.set_xlim((bins.min(), bins.max())) -- GitLab