This shows you the differences between two versions of the page.
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:20] jypeter Added offline plot |
||
---|---|---|---|
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 182: | Line 187: | ||
===== 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]] | ||