From: Maximilian Friedersdorff Date: Mon, 18 Feb 2019 09:43:57 +0000 (+0000) Subject: Initial commit X-Git-Url: https://git.friedersdorff.com/?a=commitdiff_plain;h=ce54c823b13f59665a381e086e7970ba22502fae;p=max%2Fct_plotting.git Initial commit --- ce54c823b13f59665a381e086e7970ba22502fae diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..bb024bc --- /dev/null +++ b/Makefile @@ -0,0 +1,2 @@ +slides.pdf: slides.rst dark.style dark.png + rst2pdf -b1 -s dark.style,fruity --fit-background-mode=scale slides.rst diff --git a/dark.png b/dark.png new file mode 100644 index 0000000..f76e81a Binary files /dev/null and b/dark.png differ diff --git a/dark.style b/dark.style new file mode 100644 index 0000000..deaaad9 --- /dev/null +++ b/dark.style @@ -0,0 +1,86 @@ +pageSetup: + size: null + width: 16cm + height: 9cm + margin-top: 0cm + margin-bottom: 0cm + margin-left: 0cm + margin-right: 0cm + margin-gutter: 0cm + spacing-header: 2mm + spacing-footer: 2mm + firstTemplate: standardPage + +pageTemplates: + standardPage: + frames: [] + [3%, 3%, 94%, 94%] + showHeader: false + showFooter: false + background: dark.png + +linkColor: #add8e6 + +styles: + normal: + fontSize: 10 + textColor: white + + bodytext: + alignment: TA_LEFT + hyphenation: false + spaceBefore: 3 + + titleslideinfo: + parent: normal + alignment: TA_CENTER + + literal: + textColor: silver + + table: + commands: [] + [ROWBACKGROUNDS, [0, 0], [-1, -1], [#333333, black]] + + table-heading: + parent: heading + backColor: black + alignment : TA_LEFT + + code: + parent: literal + fontSize: 11 + leftIndent: 0 + spaceBefore: 8 + spaceAfter: 8 + backColor: #333333 + + bullet-list: + spaceBefore: 0 + spaceAfter: 0 + commands: [] + [VALIGN, [0, 0], [-1, -1], TOP] + [TOPPADDING, [0, 0], [-1, -1], 0] + [BOTTOMPADDING, [0, 0], [-1, -1], 0] + + endnote: + spaceBefore: 0 + spaceAfter: 0 + colWidths: [3cm, null] + + field-list: + spaceBefore: 0 + spaceAfter: 0 + + item-list: + spaceBefore: 0 + spaceAfter: 6 + commands: [] + [VALIGN, [0, 0], [-1, -1], TOP] + [TOPPADDING, [0, 0], [-1, -1], 5] + [BOTTOMPADDING, [0, 0], [-1, -1], 20] + [RIGHTPADDING, [0, 0], [1, -1], 0] + + option-list: + spaceBefore: 0 + spaceAfter: 0 diff --git a/debug.style b/debug.style new file mode 100644 index 0000000..a60f0e5 --- /dev/null +++ b/debug.style @@ -0,0 +1,46 @@ +styles: + bullet-list: + spaceBefore: 0 + spaceAfter: 0 + commands: [] + [VALIGN, [0, 0], [-1, -1], TOP] + [TOPPADDING, [0, 0], [-1, -1], 0] + [BOTTOMPADDING, [0, 0], [-1, -1], 0] + [INNERGRID, [0, 0], [-1, -1], 0.25, red] + [BOX, [0, 0], [-1, -1], 0.25, red] + + endnote: + spaceBefore: 0 + spaceAfter: 0 + colWidths: [3cm, null] + commands: [] + [INNERGRID, [0, 0], [-1, -1], 0.25, orange] + [BOX, [0, 0], [-1, -1], 0.25, orange] + + field-list: + spaceBefore: 0 + spaceAfter: 0 + commands: [] + [INNERGRID, [0, 0], [-1, -1], 0.25, green] + [BOX, [0, 0], [-1, -1], 0.25, green] + + item-list: + spaceBefore: 0 + spaceAfter: 0 + commands: [] + [VALIGN, [0, 0], [-1, -1], TOP] + [TOPPADDING, [0, 0], [-1, -1], 0] + [BOTTOMPADDING, [0, 0], [-1, -1], 20] + [RIGHTPADDING, [0, 0], [1, -1], 0] + [INNERGRID, [0, 0], [-1, -1], 0.25, gray] + [BOX, [0, 0], [-1, -1], 0.25, gray] + + + + option-list: + spaceBefore: 0 + spaceAfter: 0 + commands: [] + [INNERGRID, [0, 0], [-1, -1], 0.25, blue] + [BOX, [0, 0], [-1, -1], 0.25, blue] + diff --git a/slides.rst b/slides.rst new file mode 100644 index 0000000..057a5d3 --- /dev/null +++ b/slides.rst @@ -0,0 +1,158 @@ +Plotting with Matplotlib +------------------------ + +Also creating a presentation with rst2pdf +========================================= + +Data Structures +--------------- +Favour simpler data structures if they do what you need. In order: + +#. Built-in Lists + - 2xN data or simpler + - Can't install system dependencies +#. Numpy arrays + - 2 (or higher) dimensional data + - Lots of numerical calculations +#. Pandas series/dataframes + - 'Data Wrangling', reshaping, merging, sorting, querying + - Importing from complex formats + +Shamelessly stolen from https://stackoverflow.com/a/45288000 + +Loading Data from Disk +---------------------- +Natively +======== + +.. code-block:: python + + >>> import csv + >>> with open('eggs.csv', newline='') as csvfile: + ... spam = csv.reader(csvfile, + ... delimiter=' ', + ... quotechar='|') + ... for row in spam: + ... # Do things + ... pass + +Loading Data from Disk +---------------------- +Numpy +===== + +.. code-block:: python + + >>> import numpy + >>> spam = numpy.genfromtxt('eggs.csv', + ... delimiter=' ', + ... dtype=None) # No error handling! + >>> for row in spam: + ... # Do things + ... pass + +``numpy.genfromtxt`` will try to infer the datatype of each column if +``dtype=None`` is set. + +``numpy.loadtxt`` is generally faster at runtime if your data is well formated +(no missing values, only numerical data or constant length strings) + +Loading Data from Disk +---------------------- +Numpy NB. +========= +**Remind me to look at some actual numpy usage at the end** + +- I think numpy does some type coercion when creating arrays. +- Arrays created by ``numpy.genfromtxt`` can not in general be indexed like + ``data[xstart:xend, ystart:yend]``. +- Data of unequal types are problematic! Pandas *may* be a better choice in + that case. +- Specifying some value for ``dtype`` is probably necessary in most cases in + practice: https://docs.scipy.org/doc/numpy/reference/arrays.dtypes.html + +Loading Data from Disk +---------------------- +Pandas +====== + +.. code-block:: python + + >>> import pandas + >>> # dtype=None is def + >>> spam = pandas.read_csv('eggs.csv', + ... delimiter=' ', + ... header=None) + >>> for row in spam: + ... # Do things + ... pass + +``header=None`` is required if the flie does not have a header. + + + +Generating Data for Testing +--------------------------- + +Generating the data on the fly with numpy is convenient. + +.. code-block:: python + + >>> import numpy.random as ran + >>> # For repeatability + >>> ran.seed(7890234) + >>> # Uniform [0, 1) floats + >>> data = ran.rand(100, 2) + >>> # Uniform [0, 1) floats + >>> data = ran.rand(100, 100, 100) + >>> # Std. normal floats + >>> data = ran.randn(100) + >>> # 3x14x15 array of binomial ints with n = 100, p = 0.1 + >>> data = ran.binomial(100, 0.1, (3, 14, 15)) + +Plotting Time Series +-------------------- + +Plot data of the form: + +.. math:: y=f(t) + + +Subplots +-------- + + +Saving Plots +------------ + +So far I've just displayed plots with ``plt.show()``. You can actually save +the plots from that interface manually, but when scripting, it's convenient +to do so automatically: + +.. code-block:: python + + >>> # Some plotting has previously occured + >>> plt.savefig('eggs.pdf', dpi=300, transparent=False) + +The output format is interpreted from the file extension. +The keyword arguments are optional here. Other options exist. + +Error Bars +---------- + + +Stacked Bar Graph +----------------- + + +Resources +--------- +NumPy User Guide: https://docs.scipy.org/doc/numpy/user/index.html + +NumPy Reference: https://docs.scipy.org/doc/numpy/reference/index.html#reference + +Matplotlib example gallery: https://matplotlib.org/gallery/index.html + +Pandas: It probably exists. Good luck. + +This presentation: https://git.friedersdorff.com/max/plotting_with_matplotlib.git