Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision |
other:python:matplotlib_by_jyp [2020/02/11 13:55] – [Starting (and more) with matplotlib] jypeter | other:python:matplotlib_by_jyp [2021/02/26 12:38] – [Useful matplotlib reference pages] Updated gallery links jypeter |
---|
- 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]] |
* 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]]) |
* ''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 |
* ''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]] |
* 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]] |
| |
| |