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 11:00]
jypeter [Starting (and more) with matplotlib]
other:python:matplotlib_by_jyp [2020/03/31 14:26]
jypeter [Starting (and more) with matplotlib] Improved offline plot creation
Line 47: Line 47:
 mid_plot = my_page.add_subplot(3,​ 1, 2) mid_plot = my_page.add_subplot(3,​ 1, 2)
 bot_plot = my_page.add_subplot(3,​ 1, 3)</​code>​ bot_plot = my_page.add_subplot(3,​ 1, 3)</​code>​
-          * creating an //array of plots// with ''​subplots''​ is **more efficient** than ''​add_subplot''​ when there are lots of plots on a page<​code>​plot_array = my_page.subplots(3,​ 1)+          * creating an //array of plots// with ''​subplots''​ 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] top_plot = plot_array[0]
 mid_plot = plot_array[1] mid_plot = plot_array[1]
 bot_plot = plot_array[2]</​code>​ bot_plot = plot_array[2]</​code>​
-          * it is **even more efficient** to create a //figure// and //axes// with a single line:+          * it is **even more efficient** to create a //​figure// ​**and** //axes// with a single line:
             * one plot on one page: ''​my_page,​ my_plot = **plt**.subplots()''​             * one plot on one page: ''​my_page,​ my_plot = **plt**.subplots()''​
             * three plots on one A4 portrait page:\\ <​code>​             * three plots on one A4 portrait page:\\ <​code>​
Line 59: Line 59:
 mid_plot = plot_array[1] mid_plot = plot_array[1]
 bot_plot = plot_array[2] bot_plot = plot_array[2]
 +</​code>​
 +            * if you need to specify the same additional //keyword// parameters (that will be passed //behind the scene// to the ''​add_subplot''​ function), you can use the ''​subplot_kw''​ parameter. For example, if all the plots will be created with cartopy, using the //​Robinson//​ projection, the example above becomes:\\ <​code>​
 +my_page, plot_array = plt.subplots(nrows=3,​ ncols=1,
 +                                   ​figsize=(8.3,​ 11.), # A4 portrait
 +                                   ​subplot_kw=dict(projection=ccrs.Robinson()))
 </​code>​ </​code>​
         * 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])''​         * 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])''​
Line 99: 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 182: Line 186:
 ===== 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