This is an old revision of the document!
Summary: there are lots of python libraries that you can use for plotting, but Matplotlib has become a de facto standard
You can get more python information on the JYP's recommended steps for learning python page.
You can get more information on plotting maps in the Cartopy + Iris section and the basemap section (no python3 support in basemap, basemap is being slowly replaced by cartopy), with examples on the JYP's map room page.
Where: Matplotlib web site
Help on stack overflow: matplotlib help
The matplotlib documentation is good, but not always easy to use : the package is powerful, there are lots of ways to do the same thing and it's easy to get lost.
There are lots of online tutorials that often don't show much more than a simple scatter plot with basic page setup.
This page will hopefully give you some keeys to become (progressively) a matplotlib power user.
A good way to start with matplotlib is to quickly read this section, practice, and read this section again (and again)
import matplotlib.pyplot as plt
import matplotlib as mpl
my_page = plt.figure()
win_1 = plt.figure() win_2 = plt.figure()
(0, 0)
is the bottom left of the figure, and (1, 1)
the top rightmy_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 Dimensions Of A Series Paper Sizes if you need more size details)my_plot = my_page.add_subplot(1, 1, 1)
: syntax is add_subplot(nrows, ncols, index)
my_plot = my_page.subplots()
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)
plot_array = my_page.subplots(3, 1) top_plot = plot_array[0] middle_plot = plot_array[1] bottom_plot = plot_array[2]
my_page, plot_array = plt.subplots(3, 1)
my_page.add_axes([left, bottom, width, height])
my_page.clear()
or my_page.clf()
or plt.clf()
: clear the (current) figuremy_plot.clear()
or my_plot.cla()
: clear the (current) axisplt.subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)
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 subplotshspace=0.1
is enough for just displaying the ticks and the labels, without the axis namehspace=0
to stick the plots together verticallymy_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 plotpl_x_bottomleft, pl_y_bottomleft, pl_width, pl_height = my_plot.get_position().bounds
my_plot.set_position( (pl_x_bottomleft, pl_y_bottomleft, pl_width, pl_height * 0.5) )
my_page.savefig('my_plot.pdf')
: save the figure to a pdf filemy_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 figureplt.show()
_r
to the name, e.g., viridis_r
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 valuematplotlib_object.set_order(NN)
to change the order after an object has been createdalpha
parameter where 0.0
means that the object is completely transparent, and 1.0
means completely opaquemy_plot.scatter(…, alpha=0.7)
show()
) a plot, because matplotlib expects to be able to display the figure on a screen by default.plot
function will be faster for scatterplots where markers don't vary in size or colormy_plot.set_xlim(x_leftmost_value, x_rightmost_value)
my_plot.set_xlabel(x_label_string, fontsize=axis_label_fontsize)
my_plot.set_xlabel('A closer label', labelpad=-20
my_plot.set_xticks(x_ticks_values, minor=False)
my_plot.set_xticks([])
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 labelmpl.rcParams['lines.markersize'] ** 2
⇒ 36mpl.rcParams['lines.linewidth']
⇒ 1.5plot
, all the markers have the same attributes, and for scatter
the attributes can be the same, or specified for each markermarker
(marker type), c
(color), s
(size), linewidths
(linewidth of the marker edges), edgecolors
_r
at the end of the colormap namemy_cmap.N
0
to my_cmap.N - 1
. Note that the index will saturate below 0
and above my_cmap.N - 1
>>> my_cmap.N 256 >>> my_cmap(-1) # Same as ano_cmap(0) (0.3686274509803922, 0.30980392156862746, 0.6352941176470588, 1.0) >>> my_cmap(0) (0.3686274509803922, 0.30980392156862746, 0.6352941176470588, 1.0) >>> my_cmap(1) (0.36186082276047676, 0.3185697808535179, 0.6394463667820068, 1.0) >>> my_cmap(255) (0.6196078431372549, 0.00392156862745098, 0.25882352941176473, 1.0) >>> my_cmap(256) # Same as ano_cmap(255) (0.6196078431372549, 0.00392156862745098, 0.25882352941176473, 1.0) >>> my_cmap(257) # Same as ano_cmap(255) (0.6196078431372549, 0.00392156862745098, 0.25882352941176473, 1.0)
my_cmap.set_bad(color='k')
: color to be used for masked valuesmy_cmap.set_over(color='k')
: color to be used for high out-of-range values if extend
is specified and is 'both' or 'max'. Default color is my_cmap(my_cmap.N - 1)
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_figure.suptitle('Figure title', x=xloc_in_normalized_coordinates, y=yloc_in_normalized_coordinates, …)
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
)label=
keyword when creating/updating a plotlabel=
keyword for these elements, or add a _
at the front of the label stringsbbox_to_anchor
parameterbbox_to_anchor
are in normalized coordinates of the current (sub)plot:(0, 0)
is the lower left corner of the plot, and (1, 1)
the upper right cornerlegend(… bbox_to_anchor=(1.05, 1.), loc='upper left', …)
will put the upper left corner of the legend slightly right ((1.05, 1.)
) of the upper right corner ((1, 1)
) of the plotplt.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 legendmpl.rcParams['figure.figsize']
([6.4, 4.8]
)mpl.matplotlib_fname()
# make the background dark gray (call this before the contourf)
plt.gca().patch.set_color('.25')
plt.contourf(d)
plt.show()
[ PMIP3 Wiki Home ] - [ Help! ] - [ Wiki syntax ]