├── requirements.txt ├── examples ├── htext.gif ├── htext.png ├── Example1.png ├── Example3_bbox.png ├── Example4_inset.png ├── Example5_fontsizes.png ├── Example8_textalign.png ├── Example2_path_effects.png ├── Example9_arrowprops.png ├── bbox_and_path_effects.png ├── highlight_text_logo.png ├── inline_syntax_example.png ├── Example6_extra_linespacing.png ├── title_bboxes_example-spiegel.png ├── Example7_annotationbbox_bboxprops.png ├── color_encoded_title-petermckeever.png ├── example_financial-times_jburnmurdoch.png ├── highlight_text_bbox_and_path_effects.png ├── Das_Infektionsgeschehen_in_Europa-Der_Spiegel.png └── htext_logo.ipynb ├── highlight_text ├── __init__.py ├── highlight_text.code-workspace └── htext.py ├── setup.py ├── LICENSE.txt ├── .gitignore ├── README.md └── notebooks ├── title_bbox_encoding_spiegel-de.ipynb └── color_encoded_title-petermckeever.ipynb /requirements.txt: -------------------------------------------------------------------------------- 1 | numpy 2 | matplotlib -------------------------------------------------------------------------------- /examples/htext.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/znstrider/highlight_text/HEAD/examples/htext.gif -------------------------------------------------------------------------------- /examples/htext.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/znstrider/highlight_text/HEAD/examples/htext.png -------------------------------------------------------------------------------- /highlight_text/__init__.py: -------------------------------------------------------------------------------- 1 | from highlight_text.htext import ax_text, fig_text, HighlightText 2 | -------------------------------------------------------------------------------- /examples/Example1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/znstrider/highlight_text/HEAD/examples/Example1.png -------------------------------------------------------------------------------- /examples/Example3_bbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/znstrider/highlight_text/HEAD/examples/Example3_bbox.png -------------------------------------------------------------------------------- /highlight_text/highlight_text.code-workspace: -------------------------------------------------------------------------------- 1 | { 2 | "folders": [ 3 | { 4 | "path": "." 5 | } 6 | ] 7 | } -------------------------------------------------------------------------------- /examples/Example4_inset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/znstrider/highlight_text/HEAD/examples/Example4_inset.png -------------------------------------------------------------------------------- /examples/Example5_fontsizes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/znstrider/highlight_text/HEAD/examples/Example5_fontsizes.png -------------------------------------------------------------------------------- /examples/Example8_textalign.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/znstrider/highlight_text/HEAD/examples/Example8_textalign.png -------------------------------------------------------------------------------- /examples/Example2_path_effects.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/znstrider/highlight_text/HEAD/examples/Example2_path_effects.png -------------------------------------------------------------------------------- /examples/Example9_arrowprops.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/znstrider/highlight_text/HEAD/examples/Example9_arrowprops.png -------------------------------------------------------------------------------- /examples/bbox_and_path_effects.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/znstrider/highlight_text/HEAD/examples/bbox_and_path_effects.png -------------------------------------------------------------------------------- /examples/highlight_text_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/znstrider/highlight_text/HEAD/examples/highlight_text_logo.png -------------------------------------------------------------------------------- /examples/inline_syntax_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/znstrider/highlight_text/HEAD/examples/inline_syntax_example.png -------------------------------------------------------------------------------- /examples/Example6_extra_linespacing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/znstrider/highlight_text/HEAD/examples/Example6_extra_linespacing.png -------------------------------------------------------------------------------- /examples/title_bboxes_example-spiegel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/znstrider/highlight_text/HEAD/examples/title_bboxes_example-spiegel.png -------------------------------------------------------------------------------- /examples/Example7_annotationbbox_bboxprops.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/znstrider/highlight_text/HEAD/examples/Example7_annotationbbox_bboxprops.png -------------------------------------------------------------------------------- /examples/color_encoded_title-petermckeever.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/znstrider/highlight_text/HEAD/examples/color_encoded_title-petermckeever.png -------------------------------------------------------------------------------- /examples/example_financial-times_jburnmurdoch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/znstrider/highlight_text/HEAD/examples/example_financial-times_jburnmurdoch.png -------------------------------------------------------------------------------- /examples/highlight_text_bbox_and_path_effects.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/znstrider/highlight_text/HEAD/examples/highlight_text_bbox_and_path_effects.png -------------------------------------------------------------------------------- /examples/Das_Infektionsgeschehen_in_Europa-Der_Spiegel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/znstrider/highlight_text/HEAD/examples/Das_Infektionsgeschehen_in_Europa-Der_Spiegel.png -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | import setuptools 2 | 3 | with open("README.md", "r") as fh: 4 | long_description = fh.read() 5 | 6 | setuptools.setup( 7 | name="highlight_text", 8 | version="0.2", 9 | author="znstrider", 10 | author_email="mindfulstrider@gmail.com", 11 | description="matplotlib functions to plot text with color highlighted substrings", 12 | long_description=long_description, 13 | long_description_content_type="text/markdown", 14 | url="https://github.com/znstrider/highlight_text", 15 | packages=setuptools.find_packages(), 16 | classifiers=[ 17 | "Programming Language :: Python :: 3", 18 | "License :: OSI Approved :: MIT License", 19 | "Operating System :: OS Independent", 20 | "Framework :: Matplotlib", 21 | "Topic :: Scientific/Engineering :: Visualization" 22 | ], 23 | python_requires='>=3.6', 24 | ) -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) [year] [fullname] 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | plots/ 3 | __pycache__/ 4 | *.code-workspace 5 | *.vscode 6 | *.py[cod] 7 | *$py.class 8 | 9 | # C extensions 10 | *.so 11 | 12 | # Distribution / packaging 13 | .Python 14 | build/ 15 | develop-eggs/ 16 | dist/ 17 | downloads/ 18 | eggs/ 19 | .eggs/ 20 | lib/ 21 | lib64/ 22 | parts/ 23 | sdist/ 24 | var/ 25 | wheels/ 26 | pip-wheel-metadata/ 27 | share/python-wheels/ 28 | *.egg-info/ 29 | .installed.cfg 30 | *.egg 31 | MANIFEST 32 | 33 | # PyInstaller 34 | # Usually these files are written by a python script from a template 35 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 36 | *.manifest 37 | *.spec 38 | 39 | # Installer logs 40 | pip-log.txt 41 | pip-delete-this-directory.txt 42 | 43 | # Unit test / coverage reports 44 | htmlcov/ 45 | .tox/ 46 | .nox/ 47 | .coverage 48 | .coverage.* 49 | .cache 50 | nosetests.xml 51 | coverage.xml 52 | *.cover 53 | *.py,cover 54 | .hypothesis/ 55 | .pytest_cache/ 56 | 57 | # Translations 58 | *.mo 59 | *.pot 60 | 61 | # Django stuff: 62 | *.log 63 | local_settings.py 64 | db.sqlite3 65 | db.sqlite3-journal 66 | 67 | # Flask stuff: 68 | instance/ 69 | .webassets-cache 70 | 71 | # Scrapy stuff: 72 | .scrapy 73 | 74 | # Sphinx documentation 75 | docs/_build/ 76 | 77 | # PyBuilder 78 | target/ 79 | 80 | # Jupyter Notebook 81 | .ipynb_checkpoints 82 | 83 | # IPython 84 | profile_default/ 85 | ipython_config.py 86 | 87 | # pyenv 88 | .python-version 89 | 90 | # pipenv 91 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 92 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 93 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 94 | # install all needed dependencies. 95 | #Pipfile.lock 96 | 97 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 98 | __pypackages__/ 99 | 100 | # Celery stuff 101 | celerybeat-schedule 102 | celerybeat.pid 103 | 104 | # SageMath parsed files 105 | *.sage.py 106 | 107 | # Environments 108 | .env 109 | .venv 110 | env/ 111 | venv/ 112 | ENV/ 113 | env.bak/ 114 | venv.bak/ 115 | 116 | # Spyder project settings 117 | .spyderproject 118 | .spyproject 119 | 120 | # Rope project settings 121 | .ropeproject 122 | 123 | # mkdocs documentation 124 | /site 125 | 126 | # mypy 127 | .mypy_cache/ 128 | .dmypy.json 129 | dmypy.json 130 | 131 | # Pyre type checker 132 | .pyre/ 133 | 134 | # vscode workspace 135 | *.code-workspace -------------------------------------------------------------------------------- /examples/htext_logo.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "### Imports" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 7, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [ 16 | "import matplotlib.pyplot as plt\n", 17 | "from matplotlib.patches import RegularPolygon\n", 18 | "from highlight_text.htext import htext\n", 19 | "from math import pi" 20 | ] 21 | }, 22 | { 23 | "cell_type": "markdown", 24 | "metadata": {}, 25 | "source": [ 26 | "### Logo" 27 | ] 28 | }, 29 | { 30 | "cell_type": "code", 31 | "execution_count": 8, 32 | "metadata": {}, 33 | "outputs": [ 34 | { 35 | "data": { 36 | "image/png": "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\n", 37 | "text/plain": [ 38 | "
" 39 | ] 40 | }, 41 | "metadata": { 42 | "needs_background": "light" 43 | }, 44 | "output_type": "display_data" 45 | } 46 | ], 47 | "source": [ 48 | "fig, ax = plt.subplots()\n", 49 | "ax.set_aspect(aspect='equal') # set this before using htext\n", 50 | "plt.ylim(0., 1)\n", 51 | "plt.xlim(0., 1)\n", 52 | "\n", 53 | "poly = RegularPolygon(xy = (0.5, 0.5), numVertices = 6, radius = 0.45, orientation = pi,\n", 54 | " edgecolor = 'k', facecolor = '#f2f2f2', lw = 5)\n", 55 | "ax.add_patch(poly)\n", 56 | "\n", 57 | "texts = htext(s = '\\nTEXT', x = 0.5, y = 0.5, color = 'k', fontsize = 24,\n", 58 | " highlight_colors = ['#ff8600'], highlight_weights = ['bold'],\n", 59 | " highlight_styles = ['italic'], string_weight = 'regular',\n", 60 | " ha = 'center', va = 'center')\n", 61 | "\n", 62 | "plt.axis('off');" 63 | ] 64 | } 65 | ], 66 | "metadata": { 67 | "kernelspec": { 68 | "display_name": "Python 3", 69 | "language": "python", 70 | "name": "python3" 71 | }, 72 | "language_info": { 73 | "codemirror_mode": { 74 | "name": "ipython", 75 | "version": 3 76 | }, 77 | "file_extension": ".py", 78 | "mimetype": "text/x-python", 79 | "name": "python", 80 | "nbconvert_exporter": "python", 81 | "pygments_lexer": "ipython3", 82 | "version": "3.7.3" 83 | } 84 | }, 85 | "nbformat": 4, 86 | "nbformat_minor": 4 87 | } 88 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![png](/examples/highlight_text_logo.png) 2 | 3 | --- 4 | 5 | # HighlightText 6 | 7 | The purpose of this package is to make effective annotations easier in matplotlib. 8 | 9 | In 2020 data journalism has played a vital role in communicating to the public. 10 | There are now many publications that routinely use various forms of colored text highlights of key information in the title, that until then has often been shown in legends. 11 | 12 | The HighlightText package provides a natural way to specify substrings that should be highlighted and individual font properties that should be used for each of the highlights. 13 | That means using different colors, shading backgrounds with bboxes, using path_effects or different fontsize, weights, or styles are all possible and you are free to choose what best supports highlighting the key information you want your viewers to know. 14 | 15 | # Installation 16 | 17 | ```python 18 | pip install highlight-text 19 | ``` 20 | 21 | ## Note 22 | 23 | The newest version breaks with the prior syntax of individually specifying highlight_colors and other params for eg. bboxes and path_effects. 24 | You can now provide any matplotlib.text.Text keyword arguments for any of the highlighted substrings into the `highlight_textprops` parameter. 25 | You can familiarize yourself with the new syntax and the possibilities this provides by having a look at the examples below. 26 | 27 | ## Use 28 | 29 | This package provides a HighlightText class and two wrapper functions that allow you to plot text with `` in matplotlib: 30 | - ax_text for plotting onto an axes in data coordinates. 31 | - fig_text for plotting onto the figure in figure coordinates. 32 | 33 | They take a string with substring delimiters = ['<', '>'] to be highlighted according to the specified highlight_textprops. You can provide other delimiters if necessary. 34 | You must specify a list with the same number of textprop dictionaries as you use ``. 35 | 36 | The example below prints the text sunny as yellow and cloudy as grey. 37 | 38 | A minimal example would be: 39 | 40 | ```python 41 | import matplotlib.pyplot as plt 42 | from highlight_text import HighlightText, ax_text, fig_text 43 | # or 44 | import highlight_text # then use highlight_text.ax_text or highlight_text.fig_text 45 | ``` 46 | 47 | ## Plotting text in axes coordinates 48 | 49 | ```python 50 | fig, ax = plt.subplots() 51 | 52 | # You can either create a HighlightText object 53 | HighlightText(x=0.25, y=0.5, 54 | s='The weather is \nYesterday it was ', 55 | highlight_textprops=[{"color": 'yellow'}, 56 | {"color": 'grey'}], 57 | ax=ax) 58 | 59 | # You can use the wrapper around the class 60 | ax_text(x = 0, y = 0.5, 61 | s='The weather is \nYesterday it was ', 62 | highlight_textprops=[{"color": 'yellow'}, 63 | {"color": 'grey'}], 64 | ax=ax) 65 | ``` 66 | 67 | ## Plotting text in figure coordinates: 68 | 69 | ```python 70 | fig, ax = plt.subplots() 71 | 72 | # either pass 'boxcoords': fig.transFigure into the annotation_bbox_kw: 73 | 74 | HighlightText(x=0.25, y=0.5, 75 | s='The weather is \nYesterday it was ', 76 | highlight_textprops=[{"color": 'yellow'}, 77 | {"color": 'grey'}], 78 | annotationbbox_kw={'boxcoords': fig.transFigure}) 79 | 80 | # or use the wrapper around the class 81 | fig_text(x=0.25, y=0.5, 82 | s='The weather is \nYesterday it was ', 83 | highlight_textprops=[{"color": 'yellow'}, 84 | {"color": 'grey'}]) 85 | 86 | ``` 87 | 88 | ![Example1](/examples/Example1.png) 89 | 90 | 91 | ## Standard syntax using highlight_textprops vs inline syntax 92 | 93 | #### standard syntax using highlight_textprops (List[Dict]) parameter 94 | ```python 95 | fig, ax = plt.subplots(figsize=(6, 4)) 96 | 97 | s = 'Text with ' 98 | fig_text(0.125, 0.9, s, fontsize=18, va='bottom', highlight_textprops=[{"color": "red"}]) 99 | ``` 100 | 101 | #### inline syntax using `::dict` at the end of a `` 102 | 103 | ```python 104 | fig, ax = plt.subplots(figsize=(6, 4)) 105 | 106 | s = 'Text with ' 107 | fig_text(0.125, 0.9, s, fontsize=18, va='bottom') 108 | ``` 109 | 110 | ![Syntax Example](/examples/inline_syntax_example.png) 111 | 112 | 113 | # Further Examples 114 | 115 | [1) Showcase Use: Color Encoded Title - @petermckeever](#ColorEncodingExample) 116 | [2) Using Path Effects](#PathEffects) 117 | [3) Using BBox Highlights](#BBoxHighlights) 118 | [4) Using Different Fontsizes](#Fontsizes) 119 | [5) Showcase Use: DerSpiegel](#DerSpiegel) 120 | [6) Custom Linespacing](#Linespacing) 121 | [7) Showcase Use (Axes Insets): Financial Times](#AxesInsetsShowcase) 122 | [8) Axes Inset](#AxesInset) 123 | [9) AnnotationBBox](#AnnotationBbox) 124 | [10) Arrowprops](#Arrowprops) 125 | 126 | 127 | --- 128 | You can pass all matplotlib.Text keywords to HighlightText for all text, 129 | and into the highlight_textprops for each of the text highlights. 130 | The highlight_textprops overwrite all other passed keywords for the highlighted substrings. 131 | 132 | 133 | --- 134 | 135 | A showcase use is provided in [this notebook](/notebooks/color_encoded_title-petermckeever.ipynb) 136 | Source: https://twitter.com/petermckeever/status/1346075580782047233 137 | ![ColorEncodingExample](/examples/color_encoded_title-petermckeever.png) 138 | 139 | 140 | 141 | ## Using Path Effects 142 | 143 | ```python 144 | import matplotlib.patheffects as path_effects 145 | 146 | def path_effect_stroke(**kwargs): 147 | return [path_effects.Stroke(**kwargs), path_effects.Normal()] 148 | pe = path_effect_stroke(linewidth=3, foreground="orange") 149 | 150 | highlight_textprops =\ 151 | [{"color": "yellow", "path_effects": pe}, 152 | {"color": "#969696", "fontstyle": "italic", "fontweight": "bold"}] 153 | 154 | fig, ax = plt.subplots(figsize=(4, 4)) 155 | 156 | HighlightText(x=0.5, y=0.5, 157 | fontsize=16, 158 | ha='center', va='center', 159 | s='The weather is \nYesterday it was ', 160 | highlight_textprops=highlight_textprops, 161 | ax=ax) 162 | ``` 163 | 164 | ![Example 2](/examples/Example2_path_effects.png) 165 | 166 | 167 | ## BBox highlights 168 | 169 | Just like colored substrings or using a path_effect, using a bbox to shade the background of 170 | relevant text that is color coded in your plot can make a visualization much more accessible. 171 | 172 | ```python 173 | highlight_textprops =\ 174 | [{"bbox": {"edgecolor": "orange", "facecolor": "yellow", "linewidth": 1.5, "pad": 1}}, 175 | {"color": "#969696"}] 176 | 177 | fig, ax = plt.subplots(figsize=(4, 4)) 178 | 179 | HighlightText(x=0.5, y=0.5, 180 | fontsize=16, 181 | ha='center', va='center', 182 | s='The weather is \nYesterday it was ', 183 | highlight_textprops=highlight_textprops, 184 | ax=ax) 185 | ``` 186 | 187 | ![Example 3](/examples/Example3_bbox.png) 188 | 189 | 190 | ## Different Fontsizes (ie. for Title + Subtitle) 191 | 192 | ```python 193 | highlight_textprops =\ 194 | [{"fontsize": 24}, 195 | {"color": "#969696"}] 196 | 197 | fig, ax = plt.subplots(figsize=(4, 4)) 198 | 199 | HighlightText(x=0.5, y=0.5, 200 | fontsize=16, 201 | ha='center', va='center', 202 | s='\n', 203 | highlight_textprops=highlight_textprops, 204 | fontname='Roboto', 205 | ax=ax) 206 | ``` 207 | 208 | ![Example 5](/examples/Example5_fontsizes.png) 209 | 210 | 211 | 212 | This example taken from german news publication "Der Spiegel" uses bbox highlights and a different fontsize for title and subtitle. 213 | 214 | The code is provided in [this notebook](/notebooks/title_bbox_encoding_spiegel-de.ipynb) 215 | Source of the Graphic: https://www.spiegel.de/wissenschaft/medizin/coronavirus-in-europa-die-zweite-welle-rollt-a-1d5b12a1-162d-48a3-8e1e-40235c996080?sara_ecid=soci_upd_wbMbjhOSvViISjc8RPU89NcCvtlFcJ 216 | 217 | ![Title BBox Example](/examples/title_bboxes_example-spiegel.png) 218 | 219 | #### Original Graphic: 220 | 221 | ![Original Spiegel Graphic](/examples/Das_Infektionsgeschehen_in_Europa-Der_Spiegel.png) 222 | 223 | 224 | ## Text Alignment and seperation between lines 225 | 226 | ```python 227 | highlight_textprops =\ 228 | [{"fontsize": 12, 'color': '0.4'}, 229 | {"fontsize": 24, "weight": "bold"}, 230 | {"fontsize": 14, "color": "0.3"}] 231 | 232 | fig, ax = plt.subplots(figsize=(12, 2)) 233 | ax.axis('off') 234 | 235 | HighlightText(x=0.5, y=0.5, 236 | ha='center', va='center', # alignment of the annotationbbox 237 | s='\n' 238 | '\n' 239 | '\n', 240 | highlight_textprops=highlight_textprops, 241 | textalign='center', # horizontal alignment of the text 242 | vsep=12, # vertical seperation between lines; `hsep` controls seperation of subtexts in a line. 243 | ax=ax) 244 | ``` 245 | 246 | ![Example 8](/examples/Example8_textalign.png) 247 | 248 | 249 | 250 | ## Custom Linespacing by using invisible text with a fitting fontsize 251 | 252 | ```python 253 | highlight_textprops =\ 254 | [{"fontsize": 24}, 255 | {"alpha": 0, "fontsize": 6}, 256 | {"color": "#969696"}] 257 | 258 | fig, ax = plt.subplots(figsize=(4, 4)) 259 | 260 | HighlightText(x=0.5, y=0.5, 261 | fontsize=16, 262 | ha='center', va='center', 263 | s='\n\n', 264 | highlight_textprops=highlight_textprops, 265 | fontname='Roboto', 266 | ax=ax) 267 | ``` 268 | 269 | ![Example 6](/examples/Example6_extra_linespacing.png) 270 | 271 | 272 | 273 | ## Axes insets on top of highlighted substrings 274 | 275 | This is great for embedding legends into your title or markers into annotations. 276 | Look at some of John Burn-Murdoch's (@jburnmurdoch) Plots. He has mastered this. 277 | 278 | An Example is provided in [this notebook](/notebooks/inset_legend_in_title-financial_times.ipynb) 279 | Source: https://twitter.com/jburnmurdoch/status/1319277057650556936/photo/1 280 | ![Financial-Times Example](/examples/example_financial-times_jburnmurdoch.png) 281 | 282 | 283 | A more basic example looks like follows: 284 | Instead of plotting on the inset axes you can also inset images with this. 285 | 286 | ```python 287 | highlight_textprops =\ 288 | [{"alpha": 0}, 289 | {"alpha": 0}] 290 | 291 | fig, ax = plt.subplots(figsize=(4, 4)) 292 | 293 | ht = HighlightText(x=0.5, y=0.5, 294 | fontsize=16, 295 | ha='center', va='center', 296 | s='Today it rained this much \n' 297 | 'Yesterday only this much ', 298 | highlight_textprops=highlight_textprops, 299 | ax=ax) 300 | 301 | insets = ht.make_highlight_insets([True, True]) 302 | for haxes, color, height in zip(ht.highlight_axes, ['b', 'b'], [0.75, 0.25]): 303 | if haxes: 304 | haxes.bar(x=[0.25], height=[height], bottom=0.25, color=color, width=0.5) 305 | haxes.set_ylim(0, 1) 306 | haxes.set_xlim(0, 1) 307 | ``` 308 | 309 | Important: 310 | If you make an axes inset using a script, you will have to redraw the canvas! 311 | 312 | So at the end of your plotting call: 313 | ```python 314 | fig.canvas.draw() 315 | plt.show() 316 | ``` 317 | 318 | ![Example 4](/examples/Example4_inset.png) 319 | 320 | 321 | 322 | ## AnnotationBbox BBox 323 | 324 | We can also place a Bounding Box around the whole AnnotationBbox that holds all of our text by setting 'frameon': True within the annotationbbox_kw dictionary. 325 | 326 | ```python 327 | fig, ax = plt.subplots(figsize=(4, 2)) 328 | 329 | ht = HighlightText(x=0.5, y=0.5, 330 | fontsize=12, 331 | ha='center', va='center', 332 | s='\nBananas\nOatmeal', 333 | highlight_textprops=[{'size': 20}], 334 | annotationbbox_kw={'frameon': True, 'pad': 2, 335 | 'bboxprops': {'facecolor': '#ebfc03', 'edgecolor': '#41b6c4', 'linewidth': 5}}, 336 | ax=ax) 337 | ``` 338 | 339 | ![Example 7](/examples/Example7_annotationbbox_bboxprops.png) 340 | 341 | 342 | 343 | ## Arrowprops 344 | 345 | The AnnotationBBox that holds our texts takes a `xybox` keyword argument that you can input to `annotationbbox_kw`. 346 | In combination with `arrowprops` this allows us to draw an arrow from xybox to the annotation point given by (x, y). 347 | 348 | ```python 349 | fig, ax = plt.subplots(figsize=(4, 3)) 350 | 351 | ht = HighlightText(x=0.5, y=0.5, 352 | fontsize=12, 353 | ha='center', va='center', 354 | s='\nPoint 1\nPoint 2', 355 | highlight_textprops=[{'size': 20}], 356 | annotationbbox_kw={'frameon': True, 'pad': 1, 357 | 'arrowprops': dict(arrowstyle="->"), 358 | 'xybox': (3, 0.5), 359 | }, 360 | ax=ax) 361 | 362 | ax.set_xlim(0, 3) 363 | ``` 364 | 365 | ![Example 9](/examples/Example9_arrowprops.png) 366 | 367 | ```python 368 | """ 369 | Args: 370 | x (float): x-position 371 | y (float): y-position 372 | s (str): textstring with 373 | ha (str, optional): horizontal alignment of the AnnotationBbox. Defaults to 'left'. 374 | va (str, optional): vertical alignment of the AnnotationBbox. Defaults to 'top'. 375 | highlight_textprops (List[dict], optional): list of textprops dictionaries. Defaults to None. 376 | textalign (str, optional): Text Alignment for the AnnotationBbox. Defaults to 'left'. 377 | delim (tuple, optional): characters that enclose . Defaults to ('<', '>'). 378 | annotationbbox_kw (dict, optional): AnnotationBbox keywords. Defaults to {}. 379 | ax (Axes, optional): Defaults to None. 380 | fig (Figure, optional): Defaults to None. 381 | add_artist (bool, optional): Whether to add the AnnotationBbox to the axes. Defaults to True. 382 | vpad (int, optional): vertical padding of the HighlightRows. Defaults to 0. 383 | vsep (int, optional): vertical seperation between the HighlightRows. Defaults to 4. 384 | hpad (int, optional): horizontal padding of a rows TextAreas. Defaults to 0. 385 | hsep (int, optional): horizontal seperation between a rows TextAreas. Defaults to 0. 386 | """ 387 | ``` 388 | -------------------------------------------------------------------------------- /highlight_text/htext.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import matplotlib as mpl 3 | import matplotlib.pyplot as plt 4 | import matplotlib.patheffects as path_effects 5 | from matplotlib.offsetbox import AnnotationBbox, TextArea, HPacker, VPacker 6 | from matplotlib.transforms import BboxTransformTo 7 | import ast 8 | import warnings 9 | 10 | 11 | def get_bbox_bounds(bbox_array): 12 | """ 13 | returns the x, y, width and height of a bounding box object 14 | """ 15 | x = bbox_array[0, 0] 16 | y = bbox_array[0, 1] 17 | width, height = np.diff(bbox_array, axis=0)[0] 18 | return (x, y, width, height) 19 | 20 | 21 | class HighlightRow: 22 | """ 23 | Creates TextArea objects for each row substring and aligns them horizontally using HPacker. 24 | Uses substring specific textprops. 25 | """ 26 | def __init__(self, s, pad=0, sep=0, highlight_textprops=None, delim=('<', '>'), **kwargs): 27 | self._pad = pad 28 | self._sep = sep 29 | self._textprops = kwargs 30 | self._n_highlights = s.count(delim[0]) 31 | if highlight_textprops is not None: 32 | assert len(highlight_textprops) == self._n_highlights, f'Number of highlights ({self._n_highlights}) should be equal to number of highlight_textprops ({len(highlight_textprops)})' 33 | self._highlight_textprops = highlight_textprops 34 | self._delim = delim 35 | self._rowtext = s 36 | self._set_row_substrings() 37 | self.text_areas = [] 38 | self._set_text_areas() 39 | self._set_hpacker() 40 | 41 | def _set_row_substrings(self): 42 | """splits a rowtext into substrings""" 43 | split = self._rowtext.split(self._delim[0]) 44 | if '' in split: 45 | split.remove('') 46 | substrings = sum([substring.split(self._delim[1]) 47 | for substring in split], []) 48 | 49 | self._substrings = [_s for _s in substrings if _s != ''] 50 | 51 | self._set_highlights(split) 52 | 53 | def _set_highlights(self, split): 54 | """ 55 | for each substring sets whether it is a highlighted substring (contained in `< >`) 56 | """ 57 | is_highlight = [] 58 | for _s in split: 59 | if not self._delim[1] in _s: 60 | is_highlight.append(False) 61 | else: 62 | _, s2 = _s.split(self._delim[1]) 63 | if s2 == '': 64 | is_highlight.append(True) 65 | else: 66 | is_highlight.extend([True, False]) 67 | 68 | self._is_highlight = is_highlight 69 | 70 | def _set_text_areas(self): 71 | """ 72 | creates TextArea objects for each row substring 73 | uses substring specific textprops following `::` within the delim'ed substring 74 | """ 75 | highlight_count = 0 76 | for i, (s, is_highlight) in enumerate(zip(self._substrings, self._is_highlight)): 77 | textprops = self._textprops.copy() 78 | # use base textprops for all text areas 79 | # and update them with given textprops_kw below 80 | if is_highlight: 81 | if self._highlight_textprops is not None: 82 | textprops.update(self._highlight_textprops[highlight_count]) 83 | else: 84 | if '::' in s: 85 | s, textprops_kw = s.split('::') 86 | textprops.update(**ast.literal_eval(textprops_kw)) 87 | 88 | highlight_count += 1 89 | text = TextArea(s, textprops=textprops) 90 | self.text_areas.append(text) 91 | 92 | def _set_hpacker(self): 93 | """creates an HPacker with all row substrings as children""" 94 | self._hpacker = HPacker(children=self.text_areas, align="left", pad=self._pad, sep=self._sep) 95 | 96 | 97 | class HighlightText: 98 | """ 99 | creates an AnnotationBbox that holds HighlightRows for each row within `s` 100 | that are aligned vertically using VPacker. 101 | 102 | textprop **kwargs for all texts that can be overridden 103 | with substring specific textprops either: 104 | by using `::{"size": 12, "color": 'yellow'}` at the end of the substring. 105 | or by using highlight_textprops = [{"size": 12, "color": 'yellow'}] 106 | 107 | example: HighlightText(x=0.25, y=0.5, 108 | s='The weather is \n' 109 | 'Yesterday it was ') 110 | 111 | HighlightText(x=0.25, y=0.5,, 112 | s='The weather is \nYesterday it was ', 113 | highlight_textprops=[{"color": 'yellow'}, 114 | {"color": 'grey'}]) 115 | 116 | by default sets annotationbbox_kw: 117 | 118 | 'frameon' to False: to not show the bbox surrounding it 119 | 120 | annotation_clip to False: to draw the annotation even if xy is outside the axes (or figure) 121 | ``` 122 | annotation_clipbool or None, default: None 123 | 124 | Whether to draw the annotation when the annotation point xy is outside the axes area. 125 | 126 | If True, the annotation will only be drawn when xy is within the axes. 127 | If False, the annotation will always be drawn. 128 | If None, the annotation will only be drawn when xy is within the axes and xycoords is 'data' 129 | ``` 130 | 131 | building on: https://stackoverflow.com/questions/63659519/plotting-text-using-textarea-and-annotationbbox-in-matplotlib 132 | """ 133 | 134 | def __init__(self, x, y, s, ha='left', va='top', 135 | highlight_textprops=None, 136 | textalign='left', 137 | delim=('<', '>'), 138 | annotationbbox_kw={}, 139 | ax=None, 140 | fig=None, 141 | add_artist=True, 142 | vpad=0, vsep=4, hpad=0, hsep=0, 143 | **kwargs): 144 | """Initialization of the HighlightText Class 145 | 146 | Args: 147 | x (float): x-position 148 | y (float): y-position 149 | s (str): textstring with 150 | ha (str, optional): horizontal alignment of the AnnotationBbox. Defaults to 'left'. 151 | va (str, optional): vertical alignment of the AnnotationBbox. Defaults to 'top'. 152 | highlight_textprops (List[dict], optional): list of textprops dictionaries. Defaults to None. 153 | textalign (str, optional): Text Alignment for the AnnotationBbox. Defaults to 'left'. 154 | delim (tuple, optional): characters that enclose . Defaults to ('<', '>'). 155 | annotationbbox_kw (dict, optional): AnnotationBbox keywords. Defaults to {}. 156 | ax (Axes, optional): Defaults to None. 157 | fig (Figure, optional): Defaults to None. 158 | add_artist (bool, optional): Whether to add the AnnotationBbox to the axes. Defaults to True. 159 | vpad (int, optional): external boundary padding of the VPacker (that contains all HPackers) . Defaults to 0. 160 | vsep (int, optional): vertical seperation between the HighlightRows. Defaults to 4. 161 | hpad (int, optional): internal boundary padding of the HPackers. Defaults to 0. 162 | hsep (int, optional): horizontal seperation between a rows TextAreas. Defaults to 0. 163 | """ 164 | 165 | if ax is None: 166 | self.ax = plt.gca() 167 | else: 168 | self.ax = ax 169 | 170 | if fig is None: 171 | self.fig = plt.gcf() 172 | else: 173 | self.fig = fig 174 | 175 | self._add_artist = add_artist 176 | 177 | self._x = x 178 | self._y = y 179 | if 'xybox' in annotationbbox_kw: 180 | self._xybox = annotationbbox_kw.pop('xybox') 181 | else: 182 | self._xybox = None 183 | 184 | self._vpad = vpad 185 | self._vsep = vsep 186 | self._hpad = hpad 187 | self._hsep = hsep 188 | self._text = s 189 | self._text_align = textalign 190 | self._textprops = kwargs 191 | self._delim = delim 192 | self._textrows = self._text.split('\n') 193 | self._highlights_per_row = [row.count(delim[0]) for row in self._textrows] 194 | if highlight_textprops is not None: 195 | assert len(highlight_textprops) == sum(self._highlights_per_row), f'Number of highlights ({sum(self._highlights_per_row)}) should be equal to number of highlight_textprops ({len(highlight_textprops)})' 196 | self._highlight_textprops = highlight_textprops 197 | self._n_rows = len(self._textrows) 198 | self._set_box_alignment(ha, va) 199 | self._set_highlight_rows() 200 | self._set_text_areas() 201 | self._set_is_highlight() 202 | self._annotationbbox_kw = annotationbbox_kw 203 | if 'frameon' not in self._annotationbbox_kw: 204 | self._annotationbbox_kw['frameon'] = False 205 | if 'annotation_clip' not in self._annotationbbox_kw: 206 | self._annotationbbox_kw['annotation_clip'] = False 207 | self._set_annotation_box() 208 | 209 | def _set_box_alignment(self, ha, va): 210 | # AnnotationBox vertical box_alignment 211 | if va == 'bottom': 212 | self.va_align = 0 213 | elif va == 'top': 214 | self.va_align = 1 215 | elif va == 'center': 216 | self.va_align = 0.5 217 | else: 218 | raise ValueError('vertical alignment needs to be either left, right or center.') 219 | 220 | # AnnotationBox horizontal box_alignment 221 | if ha == 'left': 222 | self.ha_align = 0 223 | elif ha == 'right': 224 | self.ha_align = 1 225 | elif ha == 'center': 226 | self.ha_align = 0.5 227 | else: 228 | raise ValueError('horizontal alignment needs to be either top, bottom or center.') 229 | 230 | self.box_alignment = (self.ha_align, self.va_align) 231 | 232 | def _set_highlight_rows(self): 233 | """ for each textrow create an HighlightRow""" 234 | self._hpackers = [] 235 | self._highlight_rows = [] 236 | for i, row in enumerate(self._textrows): 237 | if self._highlight_textprops is not None: 238 | row_highlight_textprops = self._highlight_textprops[sum(self._highlights_per_row[:i]):sum(self._highlights_per_row[:i+1])] 239 | else: 240 | row_highlight_textprops = None 241 | highlight_row = HighlightRow(row, pad=self._hpad, sep=self._hsep, delim=self._delim, 242 | highlight_textprops=row_highlight_textprops, 243 | **self._textprops) 244 | self._highlight_rows.append(highlight_row) 245 | self._hpackers.append(highlight_row._hpacker) 246 | self._set_text_areas() 247 | 248 | def _set_text_areas(self): 249 | self.text_areas = [] 250 | for hrow in self._highlight_rows: 251 | self.text_areas.append(hrow.text_areas) 252 | self.text_areas = [item for sublist in self.text_areas for item in sublist] 253 | 254 | def _set_is_highlight(self): 255 | self.is_highlight = [] 256 | for hrow in self._highlight_rows: 257 | self.is_highlight.append(hrow._is_highlight) 258 | self.is_highlight = [item for sublist in self.is_highlight for item in sublist] 259 | 260 | def get_highlight_areas(self): 261 | """Get the Highlight TextArea Objects 262 | 263 | Returns: 264 | list: list of TextArea Objects 265 | """ 266 | return [text_area for text_area, is_highlight in zip(self.text_areas, self.is_highlight) if is_highlight] 267 | 268 | def _set_annotation_box(self): 269 | """pack the HPackers of each row vertically into a VPacker and create an AnnotationBBox""" 270 | self._vpacker = VPacker(children=self._hpackers, pad=self._vpad, sep=self._vsep, align=self._text_align) 271 | self.annotation_bbox = AnnotationBbox(self._vpacker, 272 | (self._x, self._y), 273 | xybox=self._xybox, 274 | box_alignment=self.box_alignment, 275 | **self._annotationbbox_kw) 276 | 277 | if self._add_artist: 278 | self.ax.add_artist(self.annotation_bbox) 279 | self.set_renderer() 280 | 281 | def make_highlight_insets(self, make_highlight_insets, **kwargs): 282 | """creates axes insets for each text_highlight that is passed True 283 | Returns a list with length n_highlights of Axes objects or None 284 | 285 | Args: 286 | make_highlight_insets (list(bool)): list of booleans with len(get_highlight_areas()) 287 | 288 | Returns: 289 | highlight_axes (list(matplotlib.axes.Axes or None)) 290 | """ 291 | 292 | self.set_renderer() 293 | 294 | highlight_areas = self.get_highlight_areas() 295 | 296 | assert len(make_highlight_insets) == len(highlight_areas), f'Number of highlights ({len(highlight_areas)}) should be equal to number of make_inset ({len(make_highlight_insets)})' 297 | 298 | self.highlight_axes = [] 299 | 300 | for make_inset, text_area in zip(make_highlight_insets, highlight_areas): 301 | if make_inset: 302 | # create the inset and store it in self.highlight_insets 303 | inset = self.make_bbox_axes_inset(text_area, **kwargs) 304 | self.highlight_axes.append(inset) 305 | else: 306 | # set the _highlight_inset to None 307 | self.highlight_axes.append(None) 308 | return self.highlight_axes 309 | 310 | def set_renderer(self): 311 | self.fig.canvas.draw() 312 | self.renderer = self.fig.canvas.get_renderer() 313 | 314 | def make_bbox_axes_inset(self, obj, axis='off', **kwargs): 315 | """ 316 | add another axes to the figure in the position and extent of obj 317 | for a matplotlib object that has the get_window_extent function 318 | 319 | by default sets the axis zorder to 99 320 | turns the axis 'off' 321 | and sets the facecolor to None 322 | 323 | Parameters: 324 | ---------- 325 | obj : a matplotlib object with the get_window_extent function 326 | fig = None : a plt.figure object 327 | zorder = -1 : float 328 | axis = 'off' : bool or str - see help(plt.axis) for possible values 329 | facecolor = 'None': str 330 | 331 | """ 332 | if 'facecolor' not in kwargs.keys(): 333 | kwargs.update({'facecolor': 'None'}) 334 | 335 | if 'zorder' not in kwargs.keys(): 336 | kwargs.update({'zorder': 99}) 337 | 338 | if isinstance(obj, TextArea) or isinstance(obj, AnnotationBbox): 339 | if 'inline' not in mpl.get_backend(): 340 | plt.show(block=False) 341 | 342 | # bounding box of the object | Axes Coordinates 343 | win_ext = obj.get_window_extent(self.renderer) 344 | 345 | # transform to Figure Coordinates 346 | bbox_bounds = get_bbox_bounds(self.fig.transFigure.inverted().transform(win_ext)) 347 | ax_inset = self.fig.add_axes(bbox_bounds, **kwargs) 348 | 349 | # bbox_bounds = get_bbox_bounds(self.ax.transData.inverted().transform(win_ext)) 350 | # ax_inset = self.ax.inset_axes(bbox_bounds, **kwargs) 351 | ax_inset.axis(axis) 352 | 353 | return ax_inset 354 | 355 | 356 | def ax_text(x, y, s, ha='left', va='top', 357 | highlight_textprops=None, 358 | textalign='left', 359 | delim=('<', '>'), 360 | annotationbbox_kw={}, 361 | ax=None, 362 | fig=None, 363 | add_artist=True, 364 | vpad=0, vsep=4, hpad=0, hsep=0, 365 | **kwargs): 366 | 367 | """wrapper around the HighlightText Class to continue known hightlight_text nomenclature 368 | 369 | Args: 370 | x (float): x-position 371 | y (float): y-position 372 | s (str): textstring with 373 | ha (str, optional): horizontal alignment of the AnnotationBbox. Defaults to 'left'. 374 | va (str, optional): vertical alignment of the AnnotationBbox. Defaults to 'top'. 375 | highlight_textprops (List[dict], optional): list of textprops dictionaries. Defaults to None. 376 | textalign (str, optional): Text Alignment for the AnnotationBbox. Defaults to 'left'. 377 | delim (tuple, optional): characters that enclose . Defaults to ('<', '>'). 378 | annotationbbox_kw (dict, optional): AnnotationBbox keywords. Defaults to {}. 379 | ax (Axes, optional): Defaults to None. 380 | fig (Figure, optional): Defaults to None. 381 | add_artist (bool, optional): Whether to add the AnnotationBbox to the axes. Defaults to True. 382 | vpad (int, optional): external boundary padding of the VPacker (that contains all HPackers) . Defaults to 0. 383 | vsep (int, optional): vertical seperation between the HighlightRows. Defaults to 4. 384 | hpad (int, optional): internal boundary padding of the HPackers. Defaults to 0. 385 | hsep (int, optional): horizontal seperation between a rows TextAreas. Defaults to 0. 386 | 387 | Returns: 388 | HighlightText 389 | """ 390 | 391 | return HighlightText(x, y, s, ha=ha, va=va, 392 | highlight_textprops=highlight_textprops, 393 | textalign=textalign, 394 | delim=delim, 395 | annotationbbox_kw=annotationbbox_kw, 396 | ax=ax, 397 | fig=fig, 398 | add_artist=add_artist, 399 | vpad=vpad, vsep=vsep, hpad=hpad, hsep=hsep, 400 | **kwargs) 401 | 402 | 403 | def fig_text(x, y, s, ha='left', va='top', 404 | highlight_textprops=None, 405 | textalign='left', 406 | delim=('<', '>'), 407 | annotationbbox_kw={}, 408 | ax=None, 409 | fig=None, 410 | add_artist=True, 411 | vpad=0, vsep=4, hpad=0, hsep=0, 412 | **kwargs): 413 | 414 | """wrapper around the HighlightText Class to continue known hightlight_text nomenclature 415 | 416 | sets the Annotation boxcoords to fig.transFigure 417 | 418 | Args: 419 | x (float): x-position 420 | y (float): y-position 421 | s (str): textstring with 422 | ha (str, optional): horizontal alignment of the AnnotationBbox. Defaults to 'left'. 423 | va (str, optional): vertical alignment of the AnnotationBbox. Defaults to 'top'. 424 | highlight_textprops (List[dict], optional): list of textprops dictionaries. Defaults to None. 425 | textalign (str, optional): Text Alignment for the AnnotationBbox. Defaults to 'left'. 426 | delim (tuple, optional): characters that enclose . Defaults to ('<', '>'). 427 | annotationbbox_kw (dict, optional): AnnotationBbox keywords. Defaults to {}. 428 | ax (Axes, optional): Defaults to None. 429 | fig (Figure, optional): Defaults to None. 430 | add_artist (bool, optional): Whether to add the AnnotationBbox to the axes. Defaults to True. 431 | vpad (int, optional): external boundary padding of the VPacker (that contains all HPackers) . Defaults to 0. 432 | vsep (int, optional): vertical seperation between the HighlightRows. Defaults to 4. 433 | hpad (int, optional): internal boundary padding of the HPackers. Defaults to 0. 434 | hsep (int, optional): horizontal seperation between a rows TextAreas. Defaults to 0. 435 | 436 | Returns: 437 | HighlightText 438 | """ 439 | 440 | if fig is None: 441 | fig = plt.gcf() 442 | 443 | # set the transform 444 | annotationbbox_kw.update({'boxcoords': fig.transFigure}) 445 | 446 | return HighlightText(x, y, s, ha=ha, va=va, 447 | highlight_textprops=highlight_textprops, 448 | textalign=textalign, 449 | delim=delim, 450 | annotationbbox_kw=annotationbbox_kw, 451 | ax=ax, 452 | fig=fig, 453 | add_artist=add_artist, 454 | vpad=vpad, vsep=vsep, hpad=hpad, hsep=hsep, 455 | **kwargs) 456 | -------------------------------------------------------------------------------- /notebooks/title_bbox_encoding_spiegel-de.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "Original Graphic: \n", 8 | " \n", 9 | "https://www.spiegel.de/wissenschaft/medizin/coronavirus-in-europa-die-zweite-welle-rollt-a-1d5b12a1-162d-48a3-8e1e-40235c996080?sara_ecid=soci_upd_wbMbjhOSvViISjc8RPU89NcCvtlFcJ \n", 10 | "\n", 11 | "von Julia Merlot (@EinguterMerlot) und Patrick Stotz (@PatrickStotz)" 12 | ] 13 | }, 14 | { 15 | "cell_type": "code", 16 | "execution_count": 1, 17 | "metadata": {}, 18 | "outputs": [], 19 | "source": [ 20 | "import matplotlib.pyplot as plt\n", 21 | "import matplotlib as mpl\n", 22 | "import numpy as np\n", 23 | "from highlight_text import HighlightText, ax_text, fig_text" 24 | ] 25 | }, 26 | { 27 | "cell_type": "code", 28 | "execution_count": 2, 29 | "metadata": {}, 30 | "outputs": [ 31 | { 32 | "data": { 33 | "image/png": "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AiIiIiIi0rHUNEhEREREJIIUCIiIiIiIRJACARERERGRCFIgICIiIiISQQoEREREREQiSIGAiIiIiEgEKRAQEREREYkgBQIiIiIiIhGkQEBEREREJIIUCIiIiIiIRJACARERERGRCFIgICIiIiISQQoEREREREQiSIGAiIiIiEgEKRAQEREREYkgBQIiIiIiIhGkQEBEREREJIIUCIiIiIiIRJACARERERGRCFIgICIiIiISQQoEREREREQiSIGAiIiIiEgEKRAQEREREYkgBQIiIiIiIhGkQEBEREREJIIUCIiIiIiIRJACARERERGRCFIgICIiIiISQQoEREREREQiSIGAiIiIiEgEKRAQEREREYkgBQIiIiIiIhGkQEBEREREJIIUCIiIiIiIRFBKR2Xcs2dPl5eX11HZi4iIiIh8I3z88cdrnXO5LV2vwwKBvLw8pk+f3lHZi4iIiIh8I5jZotasp6ZBIiIiIiIRpEBARERERCSCFAiIiIiIiESQAgERERERkQhSICAiIiIiEkEKBEREREREIkiBgIiIiIhIBCkQEBERERGJIAUCIiIiIiIRpEBARERERCSCFAiIiIiIiESQAgERERERkQhSICAiIiIiEkEKBEREREREIkiBgIiIiIhIBCkQEBERERGJIAUCIiIiIiIRpEBARERERCSCFAiIiIiIiESQAgERERERkQhSICAiIiIiEkEKBEREREREIkiBgIiIiIhIBCkQEBERERGJIAUCIiIiIiIRpEBARERERCSCFAiIiIiIiESQAgERERERkQhSICAiIiIiEkEKBEREREREIkiBgIiIiIhIBCkQEBERERGJIAUCIiIiIiIRpEBARERERCSCFAiIiIiIiESQAgERERERkQhSICAiIiIiEkEKBEREREREIkiBgIiIiIhIBCkQEBERERGJIAUCIiIiIiIRpEBARERERCSCFAiIiIiIiESQAgERERERkQhSICAiIiIiEkEKBEREREREIkiBgIiIiIhIBCkQEBERERGJIAUCIiIiIiIRpEBARERERCSCFAiIiIiIiESQAgERERERkQhSICAiIiIiEkEKBEREREREIkiBgIiIiIhIBCkQEBERERGJIAUCIiIiIiIRpEBARERERCSCFAiIiIiIiESQAgERERERkQhSICAiIiIiEkEKBEREREREIkiBgIiIiIhIBCkQEBERERGJIAUCIiIiIiIRpEBARERERCSCFAiIiIiIiESQAgERERERkQhSICAiIiIiEkEKBEREREREIkiBgIiIiIhIBCkQEBERERGJIAUCIiIiIiIRpEBARERERCSCFAiIiIiIiESQAgERERERkQhSICAiIiIiEkEKBEREREREIkiBgIiIiIhIBCkQEBERERGJIAUCIiIiIiIRpEBARERERCSCFAiIiIiIiESQAgERERERkQhSICAiIiIiEkEKBEREREREIkiBgIiIiIhIBCkQEBERERGJIAUCIiIiIiIRpEBARERERCSCFAiIiIiIiESQAgERERERkQhSICAiIiIiEkEKBEREREREIkiBgIiIiIhIBCkQEBERERGJIAUCIiIiIiIRpEBARERERCSCFAiIiIiIiESQAgERERERkQhSICAiIiIiEkEKBEREREREIkiBgIiIiIhIBCkQEBERERGJIAUCIiIiIiIRpEBARERERCSCFAiIiIiIiESQAgERERERkQhSICAiIiIiEkEKBEREREREIkiBgIiIiIhIBCkQEBERERGJIAUCIiIiIiIRpEBARERERCSCFAiIiIiIiESQAgERERERkQhSICAiIiIiEkEKBEREREREIkiBgIiIiIhIBKV0dAFEROSbbebMmcyePbvmfVZWFscdd1wHlkhEREB3BEREREREIkl3BERE2snq1auZNm1awnlpaWkcf/zxJCcntymPuXPnMmPGjITzcnNzOeSQQ9qUvoiIRIfuCIiIbAPl5eUsX768zekUFBS0vTAiIiIoEBAR2WbaWonfsGEDmzZtap/CiIhI5KlpkIjINrJy5UpKS0vJzMxs1foLFy5s5xJtG6NGjWLUqFEdXQwREYmjOwIiIltRRkZGzf/OORYtWtSqdKqqqli8eHGDaYuIiLSUAgERka1o8ODBdd63tnnQ8uXLKS8vr3nfq1evVt9ZEBERAQUCIiJbVW5uLp07d655v3nzZtatW9fidOKbBQ0ZMqTNZRMRkWhTICAispXl5eXVed/SuwKlpaWsWrWq5n1qair9+/dvh5KJiEiUqbOwiMhWlpeXx6xZs3DOAbBkyRJGjx7d7GcKFBQU1KwLMHDgQFJS2ufr2zlHSUkJhYWFFBcXU1FRQXV1NWlpaaSlpZGdnU1OTg5m1i75tbfy8nLWrl1LUVERlZWVpKam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t5s+fXqH5C0iIt6mTZvYsGEDZWVlVFVVkZKSQqdOnejWrRtZWVkdXTwREWkGM/vYObd3S9fTHQERkQjLyckhJyeno4shIiIdQH0EREREREQiSIGAiIiIiEgEKRAQEREREYkgBQIiIiIiIhGkQEBEREREJIIUCIiIiIiIRJACARERERGRCFIgICIiIiISQQoEREREREQiSIGAiIiIiEgEKRAQEREREYkgBQIiIiIiIhGkQEBEREREJIIUCIiIiIiIRJACARERERGRCFIgICIiIiISQQoEREREREQiSIGAiIiIiEgEKRAQEREREYkgBQIiIiIiIhGkQEBEREREJIIUCIiIiIiIRJACARERERGRCFIgICIiIiISQQoEREREREQiSIGAiIiIiEgEKRAQEREREYkgBQIiIiIiIhGkQEBEREREJIIUCIiIiIiIRJACARERERGRCFIgICIiIiISQQoEREREREQiSIGAiIiIiEgEKRAQEREREYkgBQIiIiIiIhGkQEBEREREJIIUCIiIiIiIRJACARERERGRCFIgICIiIiISQQoEREREREQiSIGAiIiIiEgEKRAQEREREYkgBQIiIiIiIhGkQEBEREREJIIUCIiIiIiIRJACARERERGRCFIgICIiIiISQQoEREREREQiSIGAiIiIiEgEKRAQEREREYkgBQIiIiIiIhGkQEBEREREJIIUCIiIiIiIRJACARERERGRCFIgICIiIiISQQoEREREREQiSIGAiIiIiEgEKRAQEREREYkgBQIiIiIiIhGkQEBEREREJIIUCIiIiIiIRJACARERERGRCFIgICIiIiISQQoEREREREQiSIGAiIiIiEgEKRAQEREREYkgBQIiIiIiIhGkQEBEREREJIIUCIiIiIiIRJACARERERGRCFIgICIiIiISQQoEREREREQiSIGAiIiIiEgEKRAQEREREYkgBQIiIiIiIhGkQEBEREREJIIUCIiIiIiIRJACARERERGRCFIgICIiIiISQQoEREREREQiSIGAiIiIiEgEKRAQEREREYkgBQIiIiIiIhGkQEBEREREJIIUCIiIiIiIRJACARERERGRCFIgICIiIiISQQoEREREREQiSIGAiIiIiEgEKRAQEREREYkgBQIiIiIiIhGkQEBEREREJIIUCIiIiIiIRJACARERERGRCFIgICIiIiISQQoEREREREQiSIGAiIiIiEgEKRAQEREREYkgBQIiIiIiIhGkQEBEREREJIIUCIiIiIiIRJACARERERGRCFIgICIiIiISQQoEREREREQiSIGAiIiIiEgEKRAQEREREYkgBQIiIiIiIhGkQEBEREREJIIUCIiIiIiIRJACARERERGRCFIgICIiIiISQQoEREREREQiSIGAiIiIiEgEKRAQEREREYkgBQIiIiIiIhGkQEBEREREJIIUCIiIiIiIRJACARERERGRCFIgICIiIiISQQoEREREREQiSIGAiIiIiEgEKRAQEREREYkgBQIiIiIiIhGkQEBEREREJIIUCIiIiIiIRJACARERERGRCFIgICIiIiISQeac65iMzdYAizokcxERERGRb47Bzrnclq7UYYGAiIiIiIh0HDUNEhERERGJIAUCIiIiIiIRpEBARERERCSCFAiIiIiIiESQAgERERERkQhSICAiIiIiEkEKBEREREREIkiBgIiIiIhIBCkQEBERERGJIAUCIiIiIiIRpEBARERERCSCFAiIiIiIiESQAgERERERkQhSICAiIiIiEkEKBEREREREIkiBgIiIiIhIBCkQEBERERGJIAUCIiIiIiIRpEBARERERCSCFAiIiIiIiESQAgERERERkQhSICAiIiIiEkEKBEREREREIkiBgIiIiIhIBCkQEBERERGJIAUCIiIiIiIRpEBARERERCSCFAiIiIiIiESQAgERERERkQhSICAiIiIiEkEKBEREREREIkiBgIiIiIhIBCkQEBERERGJIAUCIiIiIiIRpEBARERERCSCFAiIiIiIiESQAgERERERkQhSICAiIiIiEkEKBEREREREIkiBgIiIiIhIBCkQEBERERGJIAUCIiIiIiIRpEBARERERCSCFAiIiIiIiESQAgERERERkQhSICAiIiIiEkEKBEREREREIkiBgIiIiIhIBCkQEBERERGJIAUCIiIiIiIRpEBARERERCSCFAiIiIiIiESQAgERERERkQhSICAiIiIiEkEKBEREREREIkiBgIiIiIhIBCkQEBERERGJIAUCIiIiIiIRpEBARERERCSCFAiIiIiIiESQAgERERERkQhSICAiIiIiEkEKBEREREREIkiBgIiIiIhIBCkQEBERERGJoG90IGBmR5nZfDMrNLOfdXR5wszsFTOb0oLl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\n", 34 | "text/plain": [ 35 | "
" 36 | ] 37 | }, 38 | "metadata": { 39 | "needs_background": "light" 40 | }, 41 | "output_type": "display_data" 42 | } 43 | ], 44 | "source": [ 45 | "# Using matplotlibs new subplot_mosaic feature we can lay out our plot in advance.\n", 46 | "layout = [['title'],\n", 47 | " ['main'],\n", 48 | " ['annot']]\n", 49 | "# We can also do more complex layouts like the one shown here, see the docs here:\n", 50 | "# https://matplotlib.org/3.3.0/tutorials/provisional/mosaic.html\n", 51 | "\n", 52 | "\n", 53 | "# gridspec_kw allows us to set the height_ratios and width_ratios\n", 54 | "fig, axd = plt.subplot_mosaic(layout,\n", 55 | " constrained_layout=False,\n", 56 | " figsize=(13, 10),\n", 57 | " gridspec_kw={'height_ratios': [0.2, 0.6, 0.2]})\n", 58 | "\n", 59 | "bbox_pad = 1.5\n", 60 | "bboxprops = {'linewidth': 0, 'pad': bbox_pad}\n", 61 | "\n", 62 | "# ax_text allows us to highlight text within delimiters <> using different\n", 63 | "# colors, weights, bbox_kws and path_effect_kws for each \n", 64 | "title=\\\n", 65 | "ax_text(s='\\n\\n'\n", 66 | " 'Täglich bestätigte Neuinfektionen in \\n'\n", 67 | " ' und (7-Tage Durchschnitt)*',\n", 68 | " x=0,\n", 69 | " y=0.4,\n", 70 | " va='center',\n", 71 | " highlight_textprops=[{'fontsize': 24, 'color': 'k', 'weight': 'bold'},\n", 72 | " {'color': 'w', 'weight': 'bold', 'bbox': {'facecolor':'#67001f', **bboxprops}},\n", 73 | " {'color': 'w', 'weight': 'bold', 'bbox': {'facecolor':'#b2182b', **bboxprops}},\n", 74 | " {'color': 'w', 'weight': 'bold', 'bbox': {'facecolor':'#fdae61', **bboxprops}},\n", 75 | " {'color': 'w', 'weight': 'bold', 'bbox': {'facecolor':'#053061', **bboxprops}},\n", 76 | " {'color': 'w', 'weight': 'bold', 'bbox': {'facecolor':'#4393c3', **bboxprops}},\n", 77 | " {'color': 'w', 'weight': 'bold', 'bbox': {'facecolor':'#92c5de', **bboxprops}},\n", 78 | " {'color': 'w', 'weight': 'bold', 'bbox': {'facecolor':'#969696', **bboxprops}}],\n", 79 | " ax=axd['title'],\n", 80 | " fontname='Roboto',\n", 81 | " fontsize = 16\n", 82 | " );\n", 83 | "\n", 84 | "\n", 85 | "texts = ax_text(s='<*Aufgrund der deutlich höheren Zahl an Tests sind die Werte aus dem Frühjahr nur eingeschränkt mit>\\n'\n", 86 | " '\\n\\n'\n", 87 | " 'Quelle: , Stand 14.10.2020, eigene Berechnung Plotdesign: ',\n", 88 | " highlight_textprops=[{'color': 'k', 'weight': 'regular'}, \n", 89 | " {'color': 'k', 'weight': 'regular'}, \n", 90 | " {'color': 'k', 'weight': 'bold'},\n", 91 | " {'color': '#fc5203', 'weight': 'bold'}],\n", 92 | " color='#969696',\n", 93 | " ax=axd['annot'],\n", 94 | " x=0, y=0.1, fontsize=13, va='bottom')\n", 95 | "\n", 96 | "axd['title'].axis('off');\n", 97 | "axd['annot'].axis('off');\n", 98 | "axd['main'].tick_params(axis='both', colors='None')\n", 99 | "\n", 100 | "axd['main'].text(x=0.5, y=0.5, s='Main', color='darkgrey', fontsize=48, ha=\"center\", va=\"center\")\n", 101 | "\n", 102 | "#plt.savefig('../examples/title_bboxes_example-spiegel.png', facecolor='w', dpi=200, bbox_inches='tight')" 103 | ] 104 | }, 105 | { 106 | "cell_type": "code", 107 | "execution_count": null, 108 | "metadata": {}, 109 | "outputs": [], 110 | "source": [] 111 | } 112 | ], 113 | "metadata": { 114 | "kernelspec": { 115 | "display_name": "Python 3", 116 | "language": "python", 117 | "name": "python3" 118 | }, 119 | "language_info": { 120 | "codemirror_mode": { 121 | "name": "ipython", 122 | "version": 3 123 | }, 124 | "file_extension": ".py", 125 | "mimetype": "text/x-python", 126 | "name": "python", 127 | "nbconvert_exporter": "python", 128 | "pygments_lexer": "ipython3", 129 | "version": "3.7.3" 130 | } 131 | }, 132 | "nbformat": 4, 133 | "nbformat_minor": 4 134 | } 135 | -------------------------------------------------------------------------------- /notebooks/color_encoded_title-petermckeever.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "Original Graphic:\n", 8 | " \n", 9 | "https://twitter.com/petermckeever/status/1346075580782047233\n", 10 | "\n", 11 | "by Peter McKeever (@peetermckeever)" 12 | ] 13 | }, 14 | { 15 | "cell_type": "code", 16 | "execution_count": 1, 17 | "metadata": {}, 18 | "outputs": [], 19 | "source": [ 20 | "import matplotlib.pyplot as plt\n", 21 | "import matplotlib as mpl\n", 22 | "import numpy as np\n", 23 | "from highlight_text import HighlightText, ax_text, fig_text" 24 | ] 25 | }, 26 | { 27 | "cell_type": "code", 28 | "execution_count": 2, 29 | "metadata": {}, 30 | "outputs": [ 31 | { 32 | "data": { 33 | "image/png": "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/fTTbK1fvy7gdazoMfzwwwnq3LmzPvjgAy1dukQLFy7QmDEvKC4uLuC+Y2Ji9Mgjf9PPP8/RihXL9cUXX6h375M1f/68oK/f7NKli9588w3Nnz9PK1eu0NSp3+nmm28u97Ht3LmzJkwYr+XLl2nevLl66qmnSv19SkhI0EMPPaTp03/QypUrNG/eXL322qtq27ZNwO2K9s2zz/5Lp57aT59//pmWL1+muXN/0+OPP67IyMiA20dFRen222/T1KnfacWK5c7rRrt27UrlbNu2jV58cYzz2Hz33be6+eabFR4eHnC7xMREPfPMaM2YMV3Lli3V999P01NP/UP169c/5mMHwBbzM2h16tTRRx99qMTEROdrkZGROv/883X66afrlltu0a+//qYFCxY432/fvoOmTPlWkv8idknq0aOHoqOjlZmZqQ4dit84zZ8/v9xtDxkyRE8//VTA1xo3bqwbb7xR3bp10xVXDFdhYeA1JbfddpvCwsICvhYTE6MPP5ygtm3bOl+LiorSX/7yF/Xr10+XXXa5fv/992AfkjI98cQTqlGjhvPf3bt309ixb+ucc87V/v37JfmL6bvvvhPwxiUxMVE33HC9+vQ5RcOGXVrqFKWy3HbbrQF/8M488wx16dJZAwcO1N69+yq0rTp16ujLL79QnTp1StyukRITG6l///668cYbtXXrtj/0mDz44AO65pprAr7WtWtXde3aVQ0bNtTbb78d8L2zzz7L2XclZzqeeWa0Bg8eHHDbk08+WT179tT99z/gzBwE83wJxt///kSphVi6dOmiLl26qFu3bnrkkUdL/UxZz7s777xTt99+W8DXOnTooA4dOqh///665pprSz1/g/Xkk/9Q3brF+6xFixZ6/vnntX37di1fvuIP3efx8u9/v1jqsRgwYIBGj3464HnbvHlz3X777TrttNP0179eqYyMjICf+ctf/hJw+zZt2uhf//qXIiIi9Omnn0nyl7O3337LeZ2RJLfbrTPPPEN9+pyiG264UXPnznW+l5Lif15dfPHFGj366YDttW3bRm3bttF5552roUMvCWosHik6OloTJoxXhw4dAr52+umnq2/fvnrooYc0aVLpma5XXnnZ+V2jo6N10UV/UceOHTRw4CBlZmaWu72iohgeHq533hmrLl26KD8/XwsWLNSYMWO0YcOGCv8Okr883nHHHQFfKxq7jRs30RtvvCFJ6tu3r15//bWARSzq16+vyy+/TL169dLgwYPl8/kkSVdddZUefvihgOy33XarcnJy/lDGkoJ9jTheY/LTTz9RzZo1nf8+44wzVKdOHSUkJAS8GT/11FP15ptv6MIL/6LCwkJ5PB598snHat26tXObqKgonXLKKerVq5duuulm/fTTT2VuMy4uTq+//ppiYvwF5qmnntavv/52zKwtW7bUuHEfBBwIueCCC+R2u3XTTTdLklwul95771116tTJuU3Hjh30n//855gLlBQ5++yzNGbMmIDS0rx5c9177z3q1q2rbrzxpoDbx8bG6oMP3ncOnkVFRWno0CHyemN05513SfI/Rz777NOAU3kjIiLUv39/9e7dW5dddpnWrFkbcL+9e/fWhRde6LwGRUVF6fLLL1NBQb7+/vcnJfnHy3vvvRtw0CQyMtJ53bjmmmu0cOEiSVK/fv30yisvBzx+LVq00L333qMePXrohhtuUGFhodq0aaOPPvrI2T+S1LRpUzVt2lTnnnuuLr30sj88HgFUvWqZQevXr5/OOeecgP/169evzNs+9tijTjmbOXOmHnzwIX388ceS/G8knn32WUVHR2vfvn3aunWrJKl9e/8RqEaNGjkr0EVGRqpnz56Hv+9/85Kbm6slS5aUuV2Xy6UHHrhfkpSenq7Ro0fr/vsf0Nq1/hfjHj166LTTTivzZ8eNG6d7771P48aNk+Q//aOonH3zzTcaOXKUXn75ZWVlZalGjRp67LHSb7gl6eDBg7rjjjs1depU52svvfRSmdfu5Ofn67nnntODDz6ktWv9R4JjYmKc2aKQkBA999yzio+PV05Ojt544w2NGDFSX3zxhST/Uegbbri+zBxHysrK1gsvjNGDDz6kRYv8f0QSEhJ06623VXhbl112mVPO5syZoxEjRuo//3lLkv8P4ciRIyv0OBTp0aOHU8527typxx9/Qs88808lJydLku66685SR9jDwsI0a9Ys3X///XrsscclSRdccL7zxmvFihV68MGH9OSTT2rXrl0KDQ3Vo48+Io/HE/TzZcOGDbrjjjsDDig89tjjevzxJyT5Zw2Kytnu3bv15JNPavTo0Tp06JAkadiwYTr77LPL/J1LPu+ioqKcx9jn8+mZZ/6pBx54UOvW+Z8bvXv31umnn17u43csHo9HL7zw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tT+UFUD1MH2KoyTt2bNHgwdfrA8++EA7duxQTk6ODh06pKlTp+qSS4aV+lDNLVu2OKsxzZs3P2C1q6LTHPPz8495MXZ+fr6uuupqTZjwoXbv3q3s7GwtWrRY1157rTOr067dCUe9jyJpaWm69NLL9Pzzz2vt2nXKyspSenq6Fi5cqBEjRuqBBx486s+vWLFCjzzyqLZt26acnBzt2LGjzD+gx7J69WpddNEATZgwQdu3+x/LgwcP6vvvv9ell17mfE7Zsdx++x36+uuvlZ6ervT0DM2ePVtXXDE84BqUYLe1ceMmXXTRRfroo4+1c+dO5eTkaM+ePZo5c6auvPIqjRs3/g8/DqNHP6NRo0Zp6dKl8vl8Sk9P17x583TTTTfr3XffC/pxe+ihh3TPPfdq/vz5Sk9PV1ZWltavX68xY17U0KGXKD09vcLPl2nTpumll17S7t27lZOTo82bNwds7+GHH9by5cuda51WrFihv/3tb86y78F44oknnCXni/bVunXr9NJLL+nii4cEfS1bdVmwYIFuu+02rVq1SpmZmTp48KC++OILvfDCCxW+ry+//FJXXnmVZs+erZSUFOcxf/3113XZZZcFXKNUZMWKFXrmmWec5+Xatet09913Byz7nZeXpxtvvFGPP/6Es78yMjK0YsVKPfnkk7ruuuvLvIbq7bff1vXX36Cff/5ZycnJ8vl82rRpk9555x0NGDDgmNf3vPjivzV58ldKSkpSZmamcxplRkaGLr/8Cr322uvavHmzcnJylJKSop9+mqOrrrraWab7SE8//bR++uknZWZmKjk5WRMnTtRVV119zJVU58yZo4EDB2ry5Mnau3efsrOztW3bNr399lgNGTL0Dz/HXnnlVV177XX66aeflJycrOzsbG3ZskVvvfW2/vKXi5zXmrvvvluvv/66tm/frpycHK1Zs0a33367tm3zf7h9mzbFpx6PHz9B9903QmvXrlNOTo527dql5557TqtX+2dWSv6uFX3uBfMaIVX/mPz+++914403atmyZcrIyNC+ffv0zjvv6M0333Ruc7SPHFizZq3zmhwXF1fuZ3hWVF5enq699jp98MEH2r9/v7Kzs7V48WI9+mjx/R9rsajvv/9BV1wxXD/++KOSk5OVlZWldevW6emnn3ZOH66od999T6NGjdLatWuVlZWlnTt36oUXXtDE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\n", 34 | "text/plain": [ 35 | "
" 36 | ] 37 | }, 38 | "metadata": {}, 39 | "output_type": "display_data" 40 | } 41 | ], 42 | "source": [ 43 | "# https://twitter.com/petermckeever/status/1346075580782047233\n", 44 | "\n", 45 | "def identify_axes(ax_dict, fontsize=48):\n", 46 | " \"\"\"\n", 47 | " Helper to identify the Axes in the examples below.\n", 48 | " Draws the label in a large font in the center of the Axes.\n", 49 | " \n", 50 | " SOURCE: https://matplotlib.org/stable/tutorials/provisional/mosaic.html\n", 51 | "\n", 52 | " Parameters\n", 53 | " ----------\n", 54 | " ax_dict : Dict[str, Axes]\n", 55 | " Mapping between the title / label and the Axes.\n", 56 | "\n", 57 | " fontsize : int, optional\n", 58 | " How big the label should be\n", 59 | " \"\"\"\n", 60 | " kw = dict(ha=\"center\", va=\"center\", fontsize=fontsize, color=\"darkgrey\")\n", 61 | " for k, ax in ax_dict.items():\n", 62 | " ax.text(0.5, 0.5, k, transform=ax.transAxes, **kw)\n", 63 | " \n", 64 | "plt.style.use('dark')\n", 65 | "\n", 66 | "main = np.arange(20).reshape(5, 4)\n", 67 | "\n", 68 | "layout = np.concatenate([np.tile(['title'], (1, 4)),\n", 69 | " main,\n", 70 | " np.tile(['annot'], (1, 4))])\n", 71 | "\n", 72 | "fig, axd = plt.subplot_mosaic(layout,\n", 73 | " constrained_layout=True,\n", 74 | " figsize=(12, 12),\n", 75 | " gridspec_kw={'height_ratios': [0.1, 0.17, 0.17, 0.17, 0.17, 0.17, 0.05]})\n", 76 | "\n", 77 | "# Here we use different heightlight_colors to inset the legend into the title\n", 78 | "title=\\\n", 79 | "ax_text(s=\"How are the best creators in Europe's top 5 leagues making chances\\n\"\n", 80 | " \"through , , and ?\",\n", 81 | " x=0,\n", 82 | " y=0.5,\n", 83 | " va='center',\n", 84 | " color='w',\n", 85 | " fontweight='bold',\n", 86 | " highlight_textprops=[{'color': 'SkyBlue'}, \n", 87 | " {'color': 'orange'}, \n", 88 | " {'color': '#969696'},\n", 89 | " {'color': 'red'}],\n", 90 | " ax=axd['title'],\n", 91 | " fontsize = 20\n", 92 | " )\n", 93 | "\n", 94 | "for ax in axd.values():\n", 95 | " ax.tick_params(axis='both', colors='None')\n", 96 | " \n", 97 | "identify_axes({'annotation axes - Plotdesign by Peter McKeever (@petermckeever)': axd['annot']}, fontsize=16)\n", 98 | " \n", 99 | "axd['title'].axis('off');\n", 100 | "axd['annot'].axis('off');\n", 101 | "\n", 102 | "#plt.savefig('../examples/petermckeever-color_encoded_title.png', dpi=200, facecolor=fig.get_facecolor())" 103 | ] 104 | }, 105 | { 106 | "cell_type": "code", 107 | "execution_count": null, 108 | "metadata": {}, 109 | "outputs": [], 110 | "source": [] 111 | } 112 | ], 113 | "metadata": { 114 | "kernelspec": { 115 | "display_name": "Python 3", 116 | "language": "python", 117 | "name": "python3" 118 | }, 119 | "language_info": { 120 | "codemirror_mode": { 121 | "name": "ipython", 122 | "version": 3 123 | }, 124 | "file_extension": ".py", 125 | "mimetype": "text/x-python", 126 | "name": "python", 127 | "nbconvert_exporter": "python", 128 | "pygments_lexer": "ipython3", 129 | "version": "3.7.3" 130 | } 131 | }, 132 | "nbformat": 4, 133 | "nbformat_minor": 4 134 | } 135 | --------------------------------------------------------------------------------