User Tools

Site Tools


other:python:jyp_steps

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
Next revision Both sides next revision
other:python:jyp_steps [2019/05/23 14:41]
jypeter [Useful reference pages] Added help for the 'legend'
other:python:jyp_steps [2019/06/27 08:49]
jypeter [Matplotlib] Added example of get/set_position
Line 180: Line 180:
 Help on //stack overflow//: [[https://​stackoverflow.com/​questions/​tagged/​matplotlib|matplotlib help]] Help on //stack overflow//: [[https://​stackoverflow.com/​questions/​tagged/​matplotlib|matplotlib help]]
  
-The documentation is good, but not always easy to use. <wrap hi>A good way to start with matplotlib</​wrap>​ is to: +The matplotlib ​documentation is good, but not always easy to use. <wrap hi>A good way to start with matplotlib</​wrap>​ is to quickly read the following, practice, and read this section again 
-  - Look at the [[http://​matplotlib.org/​gallery.html|matplotlib gallery]] to get an idea of all you can do with matplotlib. Later, when you need to plot something, ​come back to the gallery to find some examples that are close to what you need and click on them to get the sources+  - Have a quick look at the [[https://​matplotlib.org/​gallery/index.html|matplotlib gallery]] to get an idea of all you can do with matplotlib. Later, when you need to plot something, ​go back to the gallery to find some examples that are close to what you need and click on them to view their source code 
 +    * some examples are more //​pythonic//​ (ie object oriented) than others, and some examples mix different styles of coding, which can be quite confusing. Try to [[http://​matplotlib.org/​faq/​usage_faq.html#​coding-styles|use an object oriented way of doing things]]!
   - Use the free hints provided by JY!   - Use the free hints provided by JY!
-    - a Matplotlib //Figure// is a graphical window in which you make your plots...  +    - You will usually **initialize matplotlib** with: ''​import matplotlib.pyplot as plt''​ 
-    - a Matplotlib //Axis// is a plot inside a Figure... [[http://​matplotlib.org/​faq/​usage_faq.html#​parts-of-a-figure|More details]]+      * in some cases you may also need: ''​import matplotlib as mpl''​ 
 +      * later, you may need other matplotlib related modules, for advanced usage 
 +    - You need to know some **matplotlib specific vocabulary**:​ 
 +      * a Matplotlib ​**//Figure//** (or //​canvas//​) ​is a **graphical window** in which you create ​your plots... 
 +        * example: ''​my_page = plt.figure()''​ 
 +        * if you need several display windows at the same time, create several figures!\\ <​code>​win_1 = plt.figure() 
 +win_2 = plt.figure()</​code>​ 
 +        * the [[http://​matplotlib.org/​faq/​usage_faq.html#​parts-of-a-figure|parts of a figure]] are often positioned in //​normalized coordinates//:​ ''​(0,​ 0)''​ is the bottom left of the figure, and ''​(1,​ 1)''​ the top right 
 +        * You don't really specify the **page orientation** (//​portrait//​ or //​landscape//​) of a plot. If you want a portrait plot, it's up to you to create a plot that will look higher than it is large. The idea is not to worry about this and just check the final resulting plot: create a plot, save it, display the resulting png/pdf and then adjust the creation script 
 +          * If you do have an idea of the layout of what you want to plot, it may be easier to explicitly specify the figure size/ratio at creation time, and then try to //fill// the normalized coordinates space of the figure 
 +          * ''​my_page = plt.figure()'':​ the ratio of the default figure is ''​landscape'',​ because it is 33% larger than it is high. Creating a default figure will be OK most of the time! 
 +          * ''​my_page = plt.figure(figsize=(width,​ height))'':​ create a figure with a custom ratio (sizes are considered to be in inches) 
 +            * ''​my_page = plt.figure(figsize=(8.3,​ 11.7))'':​ create a figure that will theoretically fill an A4 size page in portrait mode (check [[https://​www.papersizes.org/​a-paper-sizes.htm|Dimensions Of A Series Paper Sizes]] if you need more size details) 
 +      * a Matplotlib ​**//Axis//** is a **plot** inside a Figure... [[http://​matplotlib.org/​faq/​usage_faq.html#​parts-of-a-figure|More details]] 
 +        * reserve space for **one plot** that will use most of the available area of the figure/​page:​ 
 +          * ''​my_plot = my_page.add_subplot(1,​ 1, 1)'':​ syntax is ''​add_subplot(nrows,​ ncols, index)''​ 
 +          * ''​my_plot = my_page.subplot**s**()''​ 
 +        * create **3 plots on 1 column** (each plot uses the full width of the figure): 
 +          * <​code>​top_plot = my_page.add_subplot(3,​ 1, 1) 
 +middle_plot = my_page.add_subplot(3,​ 1, 2) 
 +bottom_plot = my_page.add_subplot(3,​ 1, 3)</​code>​ 
 +          * the following method is more efficient than add_subplot when there are lots of plots on a page<​code>​plot_array = my_page.subplots(3,​ 1) 
 +top_plot = plot_array[0] 
 +middle_plot = plot_array[1] 
 +bottom_plot = plot_array[2]</​code>​ 
 +          * creating a figure and axes with a single line: ''​my_page,​ plot_array = **plt**.subplots(3,​ 1)''​ 
 +        * use [[https://​matplotlib.org/​api/​_as_gen/​matplotlib.figure.Figure.html#​matplotlib.figure.Figure.add_axes|my_page.add_axes(...)]] to add an axis in an arbirary location of the page\\ ''​my_page.add_axes([left,​ bottom, width, height])''​ 
 +      * a Matplotlib **//​Artist//​** or //Patch// is //​something//​ (e.g a line, a group of markers, text, the legend...) plotted ​ on the Figure/​Axis 
 +      * **clearing** the //page// (or part of it): you probably won't need that... 
 +        * ''​my_page.clear()''​ or ''​my_page.clf()''​ or ''​plt.clf()'':​ clear the (current) figure 
 +        * ''​my_plot.clear()''​ or ''​my_plot.cla()'':​ clear the (current) axis
     - some resources for having multiple plots on the same figure     - some resources for having multiple plots on the same figure
       * [[https://​matplotlib.org/​gallery/​recipes/​create_subplots.html#​sphx-glr-gallery-recipes-create-subplots-py|Easily creating subplots]]       * [[https://​matplotlib.org/​gallery/​recipes/​create_subplots.html#​sphx-glr-gallery-recipes-create-subplots-py|Easily creating subplots]]
 +        * [[https://​matplotlib.org/​api/​_as_gen/​matplotlib.figure.Figure.html#​matplotlib.figure.Figure.add_subplot|fig.add_subplot(...)]]
 +        * [[https://​matplotlib.org/​api/​_as_gen/​matplotlib.figure.Figure.html#​matplotlib.figure.Figure.add_axes|fig.add_axes(...)]]
 +        * [[https://​matplotlib.org/​api/​_as_gen/​matplotlib.pyplot.subplot.html|plt.subplot(...)]]
 +        * [[https://​matplotlib.org/​api/​_as_gen/​matplotlib.pyplot.subplots.html|plt.subplots(...)]] with an **s** at the end ([[https://​matplotlib.org/​gallery/​subplots_axes_and_figures/​subplots_demo.html|demo]])
 +        * [[https://​matplotlib.org/​api/​_as_gen/​matplotlib.pyplot.subplots_adjust.html|subplots_adjust]] can be used to change the overall boundaries of the subplots on the figure, and the spacing between the subplots\\ ''​plt.subplots_adjust(left=None,​ bottom=None,​ right=None, top=None, wspace=None,​ hspace=None)''​\\ or ''​my_page.subplots_adjust(left=None,​ bottom=None,​ right=None, top=None, wspace=None,​ hspace=None)''​
 +          * ''​hspace''/''​wspace''​ is the amount of height/​width between the subplots
 +            * ''​hspace=0.1''​ is enough for just displaying the ticks and the labels, without the axis name
 +            * use ''​hspace=0''​ to stick the plots together vertically
 +              * do not forget to disable the ticks where there is no space to plot them: ''​my_plot.set_xticks([])''​
 +          * ''​my_page.subplots_adjust(right=0.75)''​ will leave 25% on the right of the page for adding a legend outside of a plot
 +        * You can also **resize an existing (sub)plot** the following way:
 +          - Get the current size information:​ ''​pl_x_bottomleft,​ pl_y_bottomleft,​ pl_width, pl_height = my_plot.get_position().bounds''​
 +          - Set the new size: e.g reduce the height with ''​my_plot.set_position( (pl_x_bottomleft,​ pl_y_bottomleft,​ pl_width, pl_height ​ * 0.5) )''​
       * [[https://​matplotlib.org/​gallery/​index.html#​subplots-axes-and-figures|Subplots,​ axes and figures]] gallery       * [[https://​matplotlib.org/​gallery/​index.html#​subplots-axes-and-figures|Subplots,​ axes and figures]] gallery
       * [[https://​matplotlib.org/​tutorials/​intermediate/​gridspec.html#​sphx-glr-tutorials-intermediate-gridspec-py|Customizing Figure Layouts Using GridSpec and Other Functions]],​ [[https://​matplotlib.org/​tutorials/​intermediate/​constrainedlayout_guide.html|constrained layout]] and [[https://​matplotlib.org/​tutorials/​intermediate/​tight_layout_guide.html|tight layout]]       * [[https://​matplotlib.org/​tutorials/​intermediate/​gridspec.html#​sphx-glr-tutorials-intermediate-gridspec-py|Customizing Figure Layouts Using GridSpec and Other Functions]],​ [[https://​matplotlib.org/​tutorials/​intermediate/​constrainedlayout_guide.html|constrained layout]] and [[https://​matplotlib.org/​tutorials/​intermediate/​tight_layout_guide.html|tight layout]]
-      * [[http://​matplotlib.org/​faq/usage_faq.html#​parts-of-a-figure|parts of a figure]] +    - use [[https://​matplotlib.org/​api/_as_gen/​matplotlib.pyplot.savefig.html|my_page.savefig(...)]] to save a figure 
-    - some examples are more //pythonic// (ie object oriented) than otherssome example mix different styles of codingall this can be confusingTry to [[http://​matplotlib.org/​faq/​usage_faq.html#​coding-styles|use an object oriented way of doing things]]! +      ​* ​ <wrap hi>​savefig(...) must be called **before** plt.show()!<​/wrap> 
-    - it may be hard to (remember how to) work with colors. Some examples from the [[http://​matplotlib.org/​gallery.html|Gallery]] can help you!+      * ''​my_page.savefig('​my_plot.pdf'​)'':​ save the figure to a pdf file 
 +      * ''​my_page.savefig('​my_plot.png',​ dpi=200, transparent=True,​ bbox_inches='​tight'​)'':​ save the figure to a png file at a higher resolution ​than the default (default is 100 dots per inch)with a transparent background and no extra space around the figure 
 +    - **display** the figure and its plotsand **start interacting** (zooming, panning...) with them:\\ ''​plt.show()''​ 
 +    - it may be hard to (remember how to) **work with colors**. Some examples from the [[https://​matplotlib.org/​gallery/index.html]] can help you!
       * [[https://​matplotlib.org/​examples/​pylab_examples/​leftventricle_bulleye.html|leftventricle_bulleye.py]]:​ associating different types of colormaps to a plot and colorbar       * [[https://​matplotlib.org/​examples/​pylab_examples/​leftventricle_bulleye.html|leftventricle_bulleye.py]]:​ associating different types of colormaps to a plot and colorbar
       * [[https://​matplotlib.org/​examples/​api/​colorbar_only.html|colorbar_only.py]]:​ the different types of colorbars (or plotting only a colorbar)       * [[https://​matplotlib.org/​examples/​api/​colorbar_only.html|colorbar_only.py]]:​ the different types of colorbars (or plotting only a colorbar)
Line 197: Line 244:
       * [[https://​matplotlib.org/​examples/​color/​named_colors.html|named_colors.py]]:​ named colors       * [[https://​matplotlib.org/​examples/​color/​named_colors.html|named_colors.py]]:​ named colors
       * More details about the colors below, in the [[#​graphics_related_resources|Resources section]]       * More details about the colors below, in the [[#​graphics_related_resources|Resources section]]
 +    - if you don't see a part of what you have plotted, maybe it's hidden behind other elements! Use the [[https://​matplotlib.org/​examples/​pylab_examples/​zorder_demo.html|zorder parameter]] to explicitly specify the plotting order/​layers
 +      * things should automatically work //as expected// if //zorder// is not explicitly specified
 +      * Use the ''​zorder=NN''​ parameter when creating objects. ''​NN''​ is an integer where 0 is the lowest value (the farthest from the eye), and objects are plotted above objects with a lower //zorder// value
 +      * Use ''​matplotlib_object.set_order(NN)''​ to change the order after an object has been created
     - sometimes the results of the python/​matplolib commands are displayed immediately,​ sometimes not. It depends if you are in [[http://​matplotlib.org/​faq/​usage_faq.html#​what-is-interactive-mode|interactive or non-interactive]] mode     - sometimes the results of the python/​matplolib commands are displayed immediately,​ sometimes not. It depends if you are in [[http://​matplotlib.org/​faq/​usage_faq.html#​what-is-interactive-mode|interactive or non-interactive]] mode
     - if your matplotlib is executed in a batch script, it will generate an error when trying to create (''​show()''​) a plot, because matplotlib expects to be able to display the figure on a screen by default.     - if your matplotlib is executed in a batch script, it will generate an error when trying to create (''​show()''​) a plot, because matplotlib expects to be able to display the figure on a screen by default.
       * Check how you can [[https://​matplotlib.org/​faq/​howto_faq.html?​highlight=web#​generate-images-without-having-a-window-appear|generate images offline]]       * Check how you can [[https://​matplotlib.org/​faq/​howto_faq.html?​highlight=web#​generate-images-without-having-a-window-appear|generate images offline]]
     - the documentation may mention [[http://​matplotlib.org/​faq/​usage_faq.html#​what-is-a-backend|backends]]. What?? Basically, you use python commands to create a plot, and the backend is the //thing// that will render your plot on the screen or in a file (png, pdf, etc...)     - the documentation may mention [[http://​matplotlib.org/​faq/​usage_faq.html#​what-is-a-backend|backends]]. What?? Basically, you use python commands to create a plot, and the backend is the //thing// that will render your plot on the screen or in a file (png, pdf, etc...)
-    ​if you don't see a part of what you have plotted, maybe it's hidden behind other elements! Use the [[https://matplotlib.org/examples/pylab_examples/​zorder_demo.html|zorder parameter]] to explicitly specify the plotting order/​layers +  ​Read the [[https://github.com/rougier/matplotlib-tutorial|Matplotlib tutorial by Nicolas Rougier]] 
-  ​Read the [[http://​www.labri.fr/​perso/​nrougier/​teaching/​matplotlib/​|Matplotlib tutorial by Nicolas Rougier]] +  - Download the [[http://​matplotlib.org/​contents.html|pdf version of the manual]]. **Do not print** the 2300+ pages of the manual! Read the beginner'​s guide (Chapter //FIVE// of //Part II//) and have a super quick look at the table of contents of the whole document.
-  - Download the [[http://​matplotlib.org/​contents.html|pdf version of the manual]]. **Do not print** the 2800+ pages of the manual! Read the beginner'​s guide (Chapter //FIVE// of //Part II//) and have a super quick look at the table of contents of the whole document.+
  
-==== Useful reference pages ====+==== Useful ​matplotlib ​reference pages ====
  
   * [[https://​matplotlib.org/​api/​_as_gen/​matplotlib.pyplot.plot.html|plot(...)]]:​ Plot y versus x as lines and/or markers   * [[https://​matplotlib.org/​api/​_as_gen/​matplotlib.pyplot.plot.html|plot(...)]]:​ Plot y versus x as lines and/or markers
   * [[https://​matplotlib.org/​api/​_as_gen/​matplotlib.pyplot.scatter.html|scatter(...)]]:​ A scatter plot of y vs x with varying marker size and/or color   * [[https://​matplotlib.org/​api/​_as_gen/​matplotlib.pyplot.scatter.html|scatter(...)]]:​ A scatter plot of y vs x with varying marker size and/or color
     * The ''​plot''​ function will be faster for scatterplots where markers don't vary in size or color     * The ''​plot''​ function will be faster for scatterplots where markers don't vary in size or color
 +  * [[https://​matplotlib.org/​api/​_as_gen/​matplotlib.axes.Axes.contourf.html|contour(...) and contourf(...)]]:​ draw contour lines and filled contours
   * [[https://​matplotlib.org/​api/​_as_gen/​matplotlib.lines.Line2D.html|line]] parameters   * [[https://​matplotlib.org/​api/​_as_gen/​matplotlib.lines.Line2D.html|line]] parameters
     * ''​linestyle'':​ ''​solid'',​ ''​None'',​ [[https://​matplotlib.org/​api/​_as_gen/​matplotlib.lines.Line2D.html#​matplotlib.lines.Line2D.set_linestyle|other]] ([[https://​matplotlib.org/​examples/​lines_bars_and_markers/​line_styles_reference.html|default styles example]], [[https://​matplotlib.org/​examples/​lines_bars_and_markers/​linestyles.html|custom styles example]])     * ''​linestyle'':​ ''​solid'',​ ''​None'',​ [[https://​matplotlib.org/​api/​_as_gen/​matplotlib.lines.Line2D.html#​matplotlib.lines.Line2D.set_linestyle|other]] ([[https://​matplotlib.org/​examples/​lines_bars_and_markers/​line_styles_reference.html|default styles example]], [[https://​matplotlib.org/​examples/​lines_bars_and_markers/​linestyles.html|custom styles example]])
   * [[https://​matplotlib.org/​api/​markers_api.html|marker types]]   * [[https://​matplotlib.org/​api/​markers_api.html|marker types]]
-    * ''​fillstyle'':​ ''​full'',​ ''​None'',​ [[https://​matplotlib.org/​gallery/​lines_bars_and_markers/​marker_fillstyle_reference.html|other]] +    ​* Default marker size and edge width: 
-    Other attributes: ''​markersize'',​ ''​markerfacecolor''​ (and ''​markerfacecoloralt'' ​for dual color markers), ''​markeredgecolor'',​ ''​markeredgewidth''​ +      ​* ''​mpl.rcParams['lines.markersize'] %%**%% 2''​ => 36 
-  * [[https://​matplotlib.org/​api/​colors_api.html|colors]]+      * ''​mpl.rcParams['​lines.linewidth'​]''​ => 1.5 
 +    * Other marker attributes. For ''​plot'',​ all the markers have the same attributes, and for ''​scatter''​ the attributes can be the same, or specified for each marker 
 +      * [[https://​matplotlib.org/​api/​_as_gen/​matplotlib.pyplot.plot.html|plot(...)]]:​ //fmt// (see documentation) or ''​marker''​ and ''​markerfacecolor''/''​mfc''​ (and ''​markerfacecoloralt''/''​mfcalt''​ for dual color markers), ''​markersize'',​ ''​markeredgewidth''/''​mew'',​ ''​markeredgecolor'',​ ''​fillstyle''​ (''​full'',​ ''​None'',​ [[https://​matplotlib.org/​gallery/​lines_bars_and_markers/​marker_fillstyle_reference.html|other]]) 
 +      [[https://​matplotlib.org/​api/​_as_gen/​matplotlib.pyplot.scatter.html|scatter(...)]]: ''​marker'' ​(marker type), ''​c''​ (color), ​''​s'' ​(size), ''​linewidths'' ​(linewidth of the marker edges), ''​edgecolors''​ 
 +  * [[https://​matplotlib.org/​api/​colors_api.html|colors]] ​and colormaps
     * [[https://​matplotlib.org/​gallery/​color/​color_demo.html|color demo]]     * [[https://​matplotlib.org/​gallery/​color/​color_demo.html|color demo]]
     * [[https://​matplotlib.org/​examples/​color/​named_colors.html|named colors]]     * [[https://​matplotlib.org/​examples/​color/​named_colors.html|named colors]]
-  ​* [[https://​matplotlib.org/​api/​pyplot_api.html#​matplotlib.pyplot.legend|legend(...)]] ([[https://​matplotlib.org/​examples/​pylab_examples/​legend_demo3.html|legend demo]])+    * Reverting the colors: add ''​_r''​ at the end of the colormap name 
 +    * Special colormap colors 
 +      * ''​cmap.set_bad(color='​k'​)'':​ color to be used for masked values 
 +      * ''​cmap.set_over(color='​k'​)'':​ color to be used for high out-of-range values 
 +      * ''​cmap.set_under(color='​k'​)'':​ color to be used for low out-of-range values 
 +  * [[https://​matplotlib.org/​api/​_as_gen/​matplotlib.figure.Figure.html#​matplotlib.figure.Figure.colorbar|colorbar]] and ([[https://​matplotlib.org/​gallery/​images_contours_and_fields/​contourf_demo.html|contourf + colorbar demo]]) 
 +  * [[https://​matplotlib.org/​api/​_as_gen/​matplotlib.pyplot.text.html|text(...)]] and [[https://​matplotlib.org/​tutorials/​text/​annotations.html|annotations]] 
 +    * Some titles: 
 +      * [[https://​matplotlib.org/​api/​_as_gen/​matplotlib.figure.Figure.html#​matplotlib.figure.Figure.suptitle|Figure title]]: ''​my_figure.suptitle('​Figure title',​ ...)''​ 
 +      * [[https://​matplotlib.org/​api/​axes_api.html#​axis-labels-title-and-legend|Axis Labels, title, and legend]]: ''​my_plot.set_title('​Plot title',​ ...)''​ 
 +    * ''​fontsize'':​ size in points, or (better!) string specifying a relative size (''​xx-small'',​ ''​x-small'',​ ''​small'',​ ''​medium'',​ ''​large'',​ ''​x-large'',​ ''​xx-large''​) 
 +    * [[https://​matplotlib.org/​api/​text_api.html#​matplotlib.text.Text|all the text properties]] 
 +  ​* [[https://​matplotlib.org/​api/​pyplot_api.html#​matplotlib.pyplot.legend|legend(...)]] ([[https://​matplotlib.org/​examples/​pylab_examples/​legend_demo3.html|legend demo]], [[https://​matplotlib.org/​users/​legend_guide.html|advanced legend guide]])
     * The legend will //show// the lines (or other objects) that were associated with a //label// with the ''​label=''​ keyword when creating/​updating a plot     * The legend will //show// the lines (or other objects) that were associated with a //label// with the ''​label=''​ keyword when creating/​updating a plot
       * If there are some elements of a plot that you do not want to associate with a legend (e.g. there are several lines with the same color and markers, but you want to plot the legend only once), do not specify a ''​label=''​ keyword for these elements, or add a ''​_''​ at the front of the label strings       * If there are some elements of a plot that you do not want to associate with a legend (e.g. there are several lines with the same color and markers, but you want to plot the legend only once), do not specify a ''​label=''​ keyword for these elements, or add a ''​_''​ at the front of the label strings
Line 227: Line 294:
       * if the legend is outside of the plot, you have to **explicitly provide enough space for the legend on the page**       * if the legend is outside of the plot, you have to **explicitly provide enough space for the legend on the page**
         * e.g. with [[https://​matplotlib.org/​api/​_as_gen/​matplotlib.pyplot.subplots_adjust.html|subplots_adjust]],​ ''​plt.subplots_adjust(right=0.75)''​ will make all the plots use 75% on the left of the page, and leave 25% on the right for the legend         * e.g. with [[https://​matplotlib.org/​api/​_as_gen/​matplotlib.pyplot.subplots_adjust.html|subplots_adjust]],​ ''​plt.subplots_adjust(right=0.75)''​ will make all the plots use 75% on the left of the page, and leave 25% on the right for the legend
 +  * The [[https://​matplotlib.org/​api/​_as_gen/​matplotlib.figure.Figure.html|figure(...)]] and the associated methods
 +  * The [[https://​matplotlib.org/​api/​axes_api.html|axes]] and the associated methods
 +  * [[https://​matplotlib.org/​tutorials/​introductory/​customizing.html#​matplotlib-rcparams|matplotlib default config/​settings]] can be queried and updated
 +    * example: the default figure size (inches) is ''​mpl.rcParams['​figure.figsize'​]''​ (''​[6.4,​ 4.8]''​)
 +    * current settings'​ file:  ''​mpl.matplotlib_fname()''​
 +  * [[https://​matplotlib.org/​api/​animation_api.html|Animations]] ([[https://​matplotlib.org/​gallery/​index.html#​animation|demo]])
  
 ==== Misc Matplotlib tricks ==== ==== Misc Matplotlib tricks ====
other/python/jyp_steps.txt · Last modified: 2024/03/07 10:15 by jypeter