User Tools

Site Tools


other:python:matplotlib_by_jyp

Differences

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

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Next revision Both sides next revision
other:python:matplotlib_by_jyp [2020/02/11 12:55]
jypeter [Starting (and more) with matplotlib]
other:python:matplotlib_by_jyp [2021/02/26 11:38]
jypeter [Useful matplotlib reference pages] Updated gallery links
Line 104: Line 104:
     - you can use **transparency** to partially show what is behind some markers or other objects. Many //artists// accept the ''​alpha''​ parameter where ''​0.0''​ means that the object is completely transparent,​ and ''​1.0''​ means completely opaque\\ e.g. ''​my_plot.scatter(...,​ alpha=0.7)''​     - you can use **transparency** to partially show what is behind some markers or other objects. Many //artists// accept the ''​alpha''​ parameter where ''​0.0''​ means that the object is completely transparent,​ and ''​1.0''​ means completely opaque\\ e.g. ''​my_plot.scatter(...,​ alpha=0.7)''​
     - 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 ​(with an X server running) ​by default.\\ Find out how to deal with this in [[other:python:​matplotlib_by_jyp#creating_a_plot_offline|Creating a plot 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...)
   - Read the [[https://​github.com/​rougier/​matplotlib-tutorial|Matplotlib tutorial by Nicolas Rougier]]   - Read the [[https://​github.com/​rougier/​matplotlib-tutorial|Matplotlib tutorial by Nicolas Rougier]]
Line 117: Line 116:
     * 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.axes.Axes.contourf.html|contour(...) and contourf(...)]]:​ draw contour lines and filled contours
-  * X and Y axes parameters +  ​* **X and Y axes parameters** (see also [[https://​matplotlib.org/​examples/​showcase/​anatomy.html|Anatomy of a figure]]): 
-    * Axis range: ''​my_plot.set_xlim(x_leftmost_value,​ x_rightmost_value)''​+    ​* **Axis range**: ''​my_plot.set_xlim(x_leftmost_value,​ x_rightmost_value)''​
       * Use the leftmost and rightmost values to specify the orientation of the axis (i.e the rightmost value can be smaller than the leftmost)       * Use the leftmost and rightmost values to specify the orientation of the axis (i.e the rightmost value can be smaller than the leftmost)
-    * Axis label: ''​my_plot.set_xlabel(x_label_string,​ fontsize=axis_label_fontsize)''​ +    ​* **Axis label**: ''​my_plot.set_xlabel(x_label_string,​ fontsize=axis_label_fontsize)''​ 
-      * Use the extra labelpad parameter to move the label closer (negative value) to the axis or farther (positive value): e.g. ''​my_plot.set_xlabel('​A closer label',​ labelpad=-20''​ +      * Use the extra labelpad parameter to move the label closer (negative value) to the axis or farther (positive value): e.g. ''​my_plot.set_xlabel('​A closer label',​ labelpad=-20''​
-    * Major (and minor) tick marks location: ''​my_plot.set_xticks(x_ticks_values,​ minor=False)''​+      * <wrap hi>​cartopy dirty trick</​wrap>:​ you have to use ''​my_plot.set_xticks([])'',​ otherwise the X axis label will not be printed 
 +        * [[https://​stackoverflow.com/​questions/​35479508/​cartopy-set-xlabel-set-ylabel-not-ticklabels|Trick source]] 
 +        * Trick needs to be used with ''​cartopy 0.17.0''​\\ Remember to update/​remove this information in the future 
 +    * Major (and minor) ​**tick marks location**: ''​my_plot.set_xticks(x_ticks_values,​ minor=False)''​
       * Use an empty list if you don't want tick marks: ''​my_plot.set_xticks([])''​       * Use an empty list if you don't want tick marks: ''​my_plot.set_xticks([])''​
-    * Tick labels (if you don't want the default values): ''​my_plot.set_xticklabels(x_ticks_labels,​ minor=False,​ fontsize=ticklabels_fontsize)''​+    ​* **Tick labels** (if you don't want the default values): ''​my_plot.set_xticklabels(x_ticks_labels,​ minor=False,​ fontsize=ticklabels_fontsize)''​
       * ''​x_ticks_labels''​ is a list of strings that has the same length as ''​x_ticks_values''​. Use an empty string in the positions where you don't want a label       * ''​x_ticks_labels''​ is a list of strings that has the same length as ''​x_ticks_values''​. Use an empty string in the positions where you don't want a label
       * Many more options for ticks, labels, orientation,​ ...       * Many more options for ticks, labels, orientation,​ ...
 +    * **Grid lines**:
 +      * Their position is determined by the values used for ''​set_xticks''​ and ''​set_yticks''​
 +      * Activate all (horizontal **and** vertical) grid lines with: ''​my_plot.grid(True,​ linestyle="​%%--%%",​ linewidth=0.5,​ color='​.25',​zorder=some_value)''​\\ You can adjust the ''​zorder''​ value to determine if the grid lines should be above or below other parts of the plot!
 +      * Plot only the horizontal **or** vertical lines with:\\ ''​ax.yaxis.grid(True)''​\\ or ''​ax.xaxis.grid(True)''​
 +      * Note: <wrap hi>​special case of //cartopy// plots</​wrap>:​ the location of the gridlines, and the properties of the associated labels are determined by ''​myplot.gridlines''​! See [[https://​scitools.org.uk/​cartopy/​docs/​latest/​matplotlib/​gridliner.html|Cartopy map gridlines and tick labels]]
   * [[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]])
Line 134: Line 141:
       * ''​mpl.rcParams['​lines.linewidth'​]''​ => 1.5       * ''​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     * 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''​ (use ''​markeredgecolor='​none'''​ if you don't want to plot the edge of the markers), ''​fillstyle''​ (''​full'',​ ''​None'',​ [[https://​matplotlib.org/​gallery/​lines_bars_and_markers/​marker_fillstyle_reference.html|other]])+      * [[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''​ (use ''​markeredgecolor='​none'''​ if you don't want to plot the edge of the markers), ''​fillstyle''​ (''​full'',​ ''​None'',​ [[https://​matplotlib.org/stable/​gallery/​lines_bars_and_markers/​marker_reference.htm|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/​_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/​api/​colors_api.html|colors]] and colormaps
-    * [[https://​matplotlib.org/​gallery/​color/​color_demo.html|color demo]]+    * [[https://​matplotlib.org/stable/​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]]
     * Reverting the colors: add ''​_r''​ at the end of the colormap name     * Reverting the colors: add ''​_r''​ at the end of the colormap name
Line 161: Line 168:
       * ''​my_cmap.set_under(color='​k'​)'':​ color to be used for //low out-of-range values// **if** ''​extend''​ is specified and is //'​both'//​ or  //'​min'//​. Default color is ''​my_cmap(0)''​       * ''​my_cmap.set_under(color='​k'​)'':​ color to be used for //low out-of-range values// **if** ''​extend''​ is specified and is //'​both'//​ or  //'​min'//​. Default color is ''​my_cmap(0)''​
   * [[https://​matplotlib.org/​api/​_as_gen/​matplotlib.figure.Figure.html#​matplotlib.figure.Figure.colorbar|colorbar]]   * [[https://​matplotlib.org/​api/​_as_gen/​matplotlib.figure.Figure.html#​matplotlib.figure.Figure.colorbar|colorbar]]
-    * [[https://​matplotlib.org/​gallery/​subplots_axes_and_figures/​colorbar_placement.html|Placing colorbars demo]] +    * [[https://​matplotlib.org/stable/​gallery/​subplots_axes_and_figures/​colorbar_placement.html|Placing colorbars demo]] 
-    * [[https://​matplotlib.org/​gallery/​images_contours_and_fields/​contourf_demo.html|contourf + colorbar demo]]+    * [[https://​matplotlib.org/stable/​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]]   * [[https://​matplotlib.org/​api/​_as_gen/​matplotlib.pyplot.text.html|text(...)]] and [[https://​matplotlib.org/​tutorials/​text/​annotations.html|annotations]]
     * Some titles:     * Some titles:
-      * [[https://​matplotlib.org/​api/​_as_gen/​matplotlib.figure.Figure.html#​matplotlib.figure.Figure.suptitle|Figure title]]: ''​my_figure.suptitle('​Figure title',​ x=xloc_in_normalized_coordinates,​ y=yloc_in_normalized_coordinates,​ ...)''​ +      * **Title at the top of the page**: ​[[https://​matplotlib.org/​api/​_as_gen/​matplotlib.figure.Figure.html#​matplotlib.figure.Figure.suptitle|Figure title]]: ''​my_figure.suptitle('​Figure title',​ x=xloc_in_normalized_coordinates,​ y=yloc_in_normalized_coordinates,​ ...)''​ 
-      * [[https://​matplotlib.org/​api/​axes_api.html#​axis-labels-title-and-legend|Axis Labels, title, and legend]]: ''​my_plot.set_title('​Plot title',​ ...)''​+      * **Title above each plot**:[[https://​matplotlib.org/​api/​axes_api.html#​axis-labels-title-and-legend|Axis Labels, title, and legend]]: ''​my_plot.set_title('​Plot title',​ ...)''​ 
 +        * [[https://​matplotlib.org/​stable/​gallery/​text_labels_and_annotations/​titles_demo.html|Title and labels positions demo]]
     * ''​fontsize'':​ size in points, or (better!) string specifying a relative size (''​xx-small'',​ ''​x-small'',​ ''​small'',​ ''​medium'',​ ''​large'',​ ''​x-large'',​ ''​xx-large''​)     * ''​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/​text_api.html#​matplotlib.text.Text|all the text properties]]
Line 179: Line 187:
         * 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/​_as_gen/​matplotlib.figure.Figure.html|figure(...)]] and the associated methods
-  * The [[https://​matplotlib.org/​api/​axes_api.html|axes]] and the associated methods+  * The [[https://​matplotlib.org/stable/​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   * [[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]''​)     * example: the default figure size (inches) is ''​mpl.rcParams['​figure.figsize'​]''​ (''​[6.4,​ 4.8]''​)
     * current settings'​ file:  ''​mpl.matplotlib_fname()''​     * current settings'​ file:  ''​mpl.matplotlib_fname()''​
-  * [[https://​matplotlib.org/​api/​animation_api.html|Animations]] ([[https://​matplotlib.org/​gallery/​index.html#​animation|demo]])+  * [[https://​matplotlib.org/​api/​animation_api.html|Animations]] ([[https://​matplotlib.org/stable/​gallery/​index.html#​animation|demo]])
  
 ===== Misc Matplotlib tricks ===== ===== Misc Matplotlib tricks =====
  
-  * Specifying the background color of a plot (e.g. when plotting ​a masked variable ​and you don't want the masked areas to be white) +==== Creating a plot offline ==== 
-    * ''​# make the background dark gray (call this before the contourf)''​\\ ''​plt.gca().patch.set_color('​.25'​)''​\\ ''​plt.contourf(d)''​\\ ''​plt.show()''​ + 
-    ​* ​[[https://​stackoverflow.com/​questions/​9797520/​masking-part-of-a-contourf-plot-in-matplotlib|trick source]]+You may need to create a plot offline when your network connection is not good enough, you don't have an X server running to display the plot (possibly because the script is running on a cluster), etc... This is easily done with the following code: 
 + 
 +<​code>#​ offline_plot = False 
 +offline_plot = True 
 + 
 +import matplotlib as mpl 
 +if offline_plot:​ 
 +    # Define the graphic back-end BEFORE importing pyplot 
 +    mpl.use('​Agg'​) 
 +     
 +# Import the rest of the matplotlib based modules 
 +import matplotlib.pyplot as plt 
 + 
 +[ ...your actual code... ]  
 + 
 +# Done at last! Save the result 
 +my_page.savefig(out_name,​ dpi=300, transparent=True,​ bbox_inches='​tight'​) 
 + 
 +if not offline_plot:​ 
 +    # Enter the interactive mode to display the plot 
 +    plt.show()</​code>​ 
 + 
 +Note: see also [[https://​matplotlib.org/​gallery/​user_interfaces/​canvasagg.html|CanvasAgg demo]] for a pure offline plot, and [[https://​matplotlib.org/​faq/​howto_faq.html?​highlight=web#​howto-webapp|How to use Matplotlib in a web application server]]. But the code above is much easier! 
 + 
 +==== Specifying the background color of a plot ==== 
 + 
 +e.g. You need to plot a masked variable, but you don't want the masked areas to be white 
 + 
 +<​code>​# make the background dark gray (call this before the contourf) 
 +plt.gca().patch.set_color('​.25'​) 
 +plt.contourf(d) 
 +plt.show()</​code>​ 
 + 
 +[[https://​stackoverflow.com/​questions/​9797520/​masking-part-of-a-contourf-plot-in-matplotlib|trick source]]
  
  
other/python/matplotlib_by_jyp.txt · Last modified: 2023/10/26 08:39 by jypeter