Matplotlib методичка

This page contains more in-depth guides for using Matplotlib.
It is broken up into beginner, intermediate, and advanced sections,
as well as sections covering specific topics.

For shorter examples, see our examples page.
You can also find external resources and
a FAQ in our user guide.

Introductory#

These tutorials cover the basics of creating visualizations with
Matplotlib, as well as some best-practices in using the package
effectively.

Intermediate#

These tutorials cover some of the more complicated classes and functions
in Matplotlib. They can be useful for particular custom and complex
visualizations.

Advanced#

These tutorials cover advanced topics for experienced Matplotlib
users and developers.

Colors#

Matplotlib has support for visualizing information with a wide array
of colors and colormaps. These tutorials cover the basics of how
these colormaps look, how you can create your own, and how you can
customize colormaps for your use case.

For even more information see the examples page.

Text#

matplotlib has extensive text support, including support for
mathematical expressions, truetype support for raster and
vector outputs, newline separated text with arbitrary
rotations, and Unicode support. These tutorials cover
the basics of working with text in Matplotlib.

Toolkits#

These tutorials cover toolkits designed to extend the functionality
of Matplotlib in order to accomplish specific goals.

Provisional#

These tutorials cover proposed APIs of any complexity. These are here
to document features that we have released, but want to get user
feedback on before committing to them. Please have a look, try them
out and give us feedback on gitter, discourse, or the the mailing list! But,
be aware that we may change the APIs without warning in subsequent
versions.

Gallery generated by Sphinx-Gallery

Note

Click here
to download the full example code

This tutorial covers some basic usage patterns and best practices to
help you get started with Matplotlib.

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

A simple example#

Matplotlib graphs your data on Figures (e.g., windows, Jupyter
widgets, etc.), each of which can contain one or more Axes, an
area where points can be specified in terms of x-y coordinates (or theta-r
in a polar plot, x-y-z in a 3D plot, etc.). The simplest way of
creating a Figure with an Axes is using pyplot.subplots. We can then use
Axes.plot to draw some data on the Axes:

fig, ax = plt.subplots()  # Create a figure containing a single axes.
ax.plot([1, 2, 3, 4], [1, 4, 2, 3])  # Plot some data on the axes.

quick start

Note that to get this Figure to display, you may have to call plt.show(),
depending on your backend. For more details of Figures and backends, see
Creating, viewing, and saving Matplotlib Figures.

Parts of a Figure#

Here are the components of a Matplotlib Figure.

../../_images/anatomy.png

Figure#

The whole figure. The Figure keeps
track of all the child Axes, a group of
‘special’ Artists (titles, figure legends, colorbars, etc), and
even nested subfigures.

The easiest way to create a new Figure is with pyplot:

It is often convenient to create the Axes together with the Figure, but you
can also manually add Axes later on. Note that many
Matplotlib backends support zooming and
panning on figure windows.

For more on Figures, see Creating, viewing, and saving Matplotlib Figures.

Axes#

An Axes is an Artist attached to a Figure that contains a region for
plotting data, and usually includes two (or three in the case of 3D)
Axis objects (be aware of the difference
between Axes and Axis) that provide ticks and tick labels to
provide scales for the data in the Axes. Each Axes also
has a title
(set via set_title()), an x-label (set via
set_xlabel()), and a y-label set via
set_ylabel()).

The Axes class and its member functions are the primary
entry point to working with the OOP interface, and have most of the
plotting methods defined on them (e.g. ax.plot(), shown above, uses
the plot method)

Axis#

These objects set the scale and limits and generate ticks (the marks
on the Axis) and ticklabels (strings labeling the ticks). The location
of the ticks is determined by a Locator object and the
ticklabel strings are formatted by a Formatter. The
combination of the correct Locator and Formatter gives very fine
control over the tick locations and labels.

Artist#

Basically, everything visible on the Figure is an Artist (even
Figure, Axes, and Axis objects). This includes
Text objects, Line2D objects, collections objects, Patch
objects, etc. When the Figure is rendered, all of the
Artists are drawn to the canvas. Most Artists are tied to an Axes; such
an Artist cannot be shared by multiple Axes, or moved from one to another.

Types of inputs to plotting functions#

Plotting functions expect numpy.array or numpy.ma.masked_array as
input, or objects that can be passed to numpy.asarray.
Classes that are similar to arrays (‘array-like’) such as pandas
data objects and numpy.matrix may not work as intended. Common convention
is to convert these to numpy.array objects prior to plotting.
For example, to convert a numpy.matrix

b = np.matrix([[1, 2], [3, 4]])
b_asarray = np.asarray(b)

Most methods will also parse an addressable object like a dict, a
numpy.recarray, or a pandas.DataFrame. Matplotlib allows you to
provide the data keyword argument and generate plots passing the
strings corresponding to the x and y variables.

np.random.seed(19680801)  # seed the random number generator.
data = {'a': np.arange(50),
        'c': np.random.randint(0, 50, 50),
        'd': np.random.randn(50)}
data['b'] = data['a'] + 10 * np.random.randn(50)
data['d'] = np.abs(data['d']) * 100

fig, ax = plt.subplots(figsize=(5, 2.7), layout='constrained')
ax.scatter('a', 'b', c='c', s='d', data=data)
ax.set_xlabel('entry a')
ax.set_ylabel('entry b')

quick start

Coding styles#

The explicit and the implicit interfaces#

As noted above, there are essentially two ways to use Matplotlib:

  • Explicitly create Figures and Axes, and call methods on them (the
    «object-oriented (OO) style»).

  • Rely on pyplot to implicitly create and manage the Figures and Axes, and
    use pyplot functions for plotting.

See Matplotlib Application Interfaces (APIs) for an explanation of the tradeoffs between the
implicit and explicit interfaces.

So one can use the OO-style

x = np.linspace(0, 2, 100)  # Sample data.

# Note that even in the OO-style, we use `.pyplot.figure` to create the Figure.
fig, ax = plt.subplots(figsize=(5, 2.7), layout='constrained')
ax.plot(x, x, label='linear')  # Plot some data on the axes.
ax.plot(x, x**2, label='quadratic')  # Plot more data on the axes...
ax.plot(x, x**3, label='cubic')  # ... and some more.
ax.set_xlabel('x label')  # Add an x-label to the axes.
ax.set_ylabel('y label')  # Add a y-label to the axes.
ax.set_title("Simple Plot")  # Add a title to the axes.
ax.legend()  # Add a legend.

Simple Plot

or the pyplot-style:

x = np.linspace(0, 2, 100)  # Sample data.

plt.figure(figsize=(5, 2.7), layout='constrained')
plt.plot(x, x, label='linear')  # Plot some data on the (implicit) axes.
plt.plot(x, x**2, label='quadratic')  # etc.
plt.plot(x, x**3, label='cubic')
plt.xlabel('x label')
plt.ylabel('y label')
plt.title("Simple Plot")
plt.legend()

Simple Plot

(In addition, there is a third approach, for the case when embedding
Matplotlib in a GUI application, which completely drops pyplot, even for
figure creation. See the corresponding section in the gallery for more info:
Embedding Matplotlib in graphical user interfaces.)

Matplotlib’s documentation and examples use both the OO and the pyplot
styles. In general, we suggest using the OO style, particularly for
complicated plots, and functions and scripts that are intended to be reused
as part of a larger project. However, the pyplot style can be very convenient
for quick interactive work.

Note

You may find older examples that use the pylab interface,
via from pylab import *. This approach is strongly deprecated.

Making a helper functions#

If you need to make the same plots over and over again with different data
sets, or want to easily wrap Matplotlib methods, use the recommended
signature function below.

which you would then use twice to populate two subplots:

data1, data2, data3, data4 = np.random.randn(4, 100)  # make 4 random data sets
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(5, 2.7))
my_plotter(ax1, data1, data2, {'marker': 'x'})
my_plotter(ax2, data3, data4, {'marker': 'o'})

quick start

Note that if you want to install these as a python package, or any other
customizations you could use one of the many templates on the web;
Matplotlib has one at mpl-cookiecutter

Styling Artists#

Most plotting methods have styling options for the Artists, accessible either
when a plotting method is called, or from a «setter» on the Artist. In the
plot below we manually set the color, linewidth, and linestyle of the
Artists created by plot, and we set the linestyle of the second line
after the fact with set_linestyle.

fig, ax = plt.subplots(figsize=(5, 2.7))
x = np.arange(len(data1))
ax.plot(x, np.cumsum(data1), color='blue', linewidth=3, linestyle='--')
l, = ax.plot(x, np.cumsum(data2), color='orange', linewidth=2)
l.set_linestyle(':')

quick start

Colors#

Matplotlib has a very flexible array of colors that are accepted for most
Artists; see the colors tutorial for a
list of specifications. Some Artists will take multiple colors. i.e. for
a scatter plot, the edge of the markers can be different colors
from the interior:

quick start

Linewidths, linestyles, and markersizes#

Line widths are typically in typographic points (1 pt = 1/72 inch) and
available for Artists that have stroked lines. Similarly, stroked lines
can have a linestyle. See the linestyles example.

Marker size depends on the method being used. plot specifies
markersize in points, and is generally the «diameter» or width of the
marker. scatter specifies markersize as approximately
proportional to the visual area of the marker. There is an array of
markerstyles available as string codes (see markers), or
users can define their own MarkerStyle (see
Marker reference):

fig, ax = plt.subplots(figsize=(5, 2.7))
ax.plot(data1, 'o', label='data1')
ax.plot(data2, 'd', label='data2')
ax.plot(data3, 'v', label='data3')
ax.plot(data4, 's', label='data4')
ax.legend()

quick start

Labelling plots#

Axes labels and text#

set_xlabel, set_ylabel, and set_title are used to
add text in the indicated locations (see Text in Matplotlib Plots
for more discussion). Text can also be directly added to plots using
text:

mu, sigma = 115, 15
x = mu + sigma * np.random.randn(10000)
fig, ax = plt.subplots(figsize=(5, 2.7), layout='constrained')
# the histogram of the data
n, bins, patches = ax.hist(x, 50, density=True, facecolor='C0', alpha=0.75)

ax.set_xlabel('Length [cm]')
ax.set_ylabel('Probability')
ax.set_title('Aardvark lengthsn (not really)')
ax.text(75, .025, r'$mu=115, sigma=15$')
ax.axis([55, 175, 0, 0.03])
ax.grid(True)

Aardvark lengths  (not really)

All of the text functions return a matplotlib.text.Text
instance. Just as with lines above, you can customize the properties by
passing keyword arguments into the text functions:

These properties are covered in more detail in
Text properties and layout.

Using mathematical expressions in text#

Matplotlib accepts TeX equation expressions in any text expression.
For example to write the expression (sigma_i=15) in the title,
you can write a TeX expression surrounded by dollar signs:

where the r preceding the title string signifies that the string is a
raw string and not to treat backslashes as python escapes.
Matplotlib has a built-in TeX expression parser and
layout engine, and ships its own math fonts – for details see
Writing mathematical expressions. You can also use LaTeX directly to format
your text and incorporate the output directly into your display figures or
saved postscript – see Text rendering with LaTeX.

Annotations#

We can also annotate points on a plot, often by connecting an arrow pointing
to xy, to a piece of text at xytext:

fig, ax = plt.subplots(figsize=(5, 2.7))

t = np.arange(0.0, 5.0, 0.01)
s = np.cos(2 * np.pi * t)
line, = ax.plot(t, s, lw=2)

ax.annotate('local max', xy=(2, 1), xytext=(3, 1.5),
            arrowprops=dict(facecolor='black', shrink=0.05))

ax.set_ylim(-2, 2)

quick start

In this basic example, both xy and xytext are in data coordinates.
There are a variety of other coordinate systems one can choose — see
Basic annotation and Advanced annotation for
details. More examples also can be found in
Annotating Plots.

Axis scales and ticks#

Each Axes has two (or three) Axis objects representing the x- and
y-axis. These control the scale of the Axis, the tick locators and the
tick formatters. Additional Axes can be attached to display further Axis
objects.

Scales#

In addition to the linear scale, Matplotlib supplies non-linear scales,
such as a log-scale. Since log-scales are used so much there are also
direct methods like loglog, semilogx, and
semilogy. There are a number of scales (see
Scales for other examples). Here we set the scale
manually:

quick start

The scale sets the mapping from data values to spacing along the Axis. This
happens in both directions, and gets combined into a transform, which
is the way that Matplotlib maps from data coordinates to Axes, Figure, or
screen coordinates. See Transformations Tutorial.

Tick locators and formatters#

Each Axis has a tick locator and formatter that choose where along the
Axis objects to put tick marks. A simple interface to this is
set_xticks:

fig, axs = plt.subplots(2, 1, layout='constrained')
axs[0].plot(xdata, data1)
axs[0].set_title('Automatic ticks')

axs[1].plot(xdata, data1)
axs[1].set_xticks(np.arange(0, 100, 30), ['zero', '30', 'sixty', '90'])
axs[1].set_yticks([-1.5, 0, 1.5])  # note that we don't need to specify labels
axs[1].set_title('Manual ticks')

Automatic ticks, Manual ticks

Different scales can have different locators and formatters; for instance
the log-scale above uses LogLocator and LogFormatter. See
Tick locators and
Tick formatters for other formatters and
locators and information for writing your own.

Plotting dates and strings#

Matplotlib can handle plotting arrays of dates and arrays of strings, as
well as floating point numbers. These get special locators and formatters
as appropriate. For dates:

quick start

For more information see the date examples
(e.g. Date tick labels)

For strings, we get categorical plotting (see:
Plotting categorical variables).

quick start

One caveat about categorical plotting is that some methods of parsing
text files return a list of strings, even if the strings all represent
numbers or dates. If you pass 1000 strings, Matplotlib will think you
meant 1000 categories and will add 1000 ticks to your plot!

Additional Axis objects#

Plotting data of different magnitude in one chart may require
an additional y-axis. Such an Axis can be created by using
twinx to add a new Axes with an invisible x-axis and a y-axis
positioned at the right (analogously for twiny). See
Plots with different scales for another example.

Similarly, you can add a secondary_xaxis or
secondary_yaxis having a different scale than the main Axis to
represent the data in different scales or units. See
Secondary Axis for further
examples.

fig, (ax1, ax3) = plt.subplots(1, 2, figsize=(7, 2.7), layout='constrained')
l1, = ax1.plot(t, s)
ax2 = ax1.twinx()
l2, = ax2.plot(t, range(len(t)), 'C1')
ax2.legend([l1, l2], ['Sine (left)', 'Straight (right)'])

ax3.plot(t, s)
ax3.set_xlabel('Angle [rad]')
ax4 = ax3.secondary_xaxis('top', functions=(np.rad2deg, np.deg2rad))
ax4.set_xlabel('Angle [°]')

quick start

Color mapped data#

Often we want to have a third dimension in a plot represented by a colors in
a colormap. Matplotlib has a number of plot types that do this:

X, Y = np.meshgrid(np.linspace(-3, 3, 128), np.linspace(-3, 3, 128))
Z = (1 - X/2 + X**5 + Y**3) * np.exp(-X**2 - Y**2)

fig, axs = plt.subplots(2, 2, layout='constrained')
pc = axs[0, 0].pcolormesh(X, Y, Z, vmin=-1, vmax=1, cmap='RdBu_r')
fig.colorbar(pc, ax=axs[0, 0])
axs[0, 0].set_title('pcolormesh()')

co = axs[0, 1].contourf(X, Y, Z, levels=np.linspace(-1.25, 1.25, 11))
fig.colorbar(co, ax=axs[0, 1])
axs[0, 1].set_title('contourf()')

pc = axs[1, 0].imshow(Z**2 * 100, cmap='plasma',
                          norm=mpl.colors.LogNorm(vmin=0.01, vmax=100))
fig.colorbar(pc, ax=axs[1, 0], extend='both')
axs[1, 0].set_title('imshow() with LogNorm()')

pc = axs[1, 1].scatter(data1, data2, c=data3, cmap='RdBu_r')
fig.colorbar(pc, ax=axs[1, 1], extend='both')
axs[1, 1].set_title('scatter()')

pcolormesh(), contourf(), imshow() with LogNorm(), scatter()

Colormaps#

These are all examples of Artists that derive from ScalarMappable
objects. They all can set a linear mapping between vmin and vmax into
the colormap specified by cmap. Matplotlib has many colormaps to choose
from (Choosing Colormaps in Matplotlib) you can make your
own (Creating Colormaps in Matplotlib) or download as
third-party packages.

Normalizations#

Sometimes we want a non-linear mapping of the data to the colormap, as
in the LogNorm example above. We do this by supplying the
ScalarMappable with the norm argument instead of vmin and vmax.
More normalizations are shown at Colormap Normalization.

Colorbars#

Adding a colorbar gives a key to relate the color back to the
underlying data. Colorbars are figure-level Artists, and are attached to
a ScalarMappable (where they get their information about the norm and
colormap) and usually steal space from a parent Axes. Placement of
colorbars can be complex: see
Placing Colorbars for
details. You can also change the appearance of colorbars with the
extend keyword to add arrows to the ends, and shrink and aspect to
control the size. Finally, the colorbar will have default locators
and formatters appropriate to the norm. These can be changed as for
other Axis objects.

Working with multiple Figures and Axes#

You can open multiple Figures with multiple calls to
fig = plt.figure() or fig2, ax = plt.subplots(). By keeping the
object references you can add Artists to either Figure.

Multiple Axes can be added a number of ways, but the most basic is
plt.subplots() as used above. One can achieve more complex layouts,
with Axes objects spanning columns or rows, using subplot_mosaic.

fig, axd = plt.subplot_mosaic([['upleft', 'right'],
                               ['lowleft', 'right']], layout='constrained')
axd['upleft'].set_title('upleft')
axd['lowleft'].set_title('lowleft')
axd['right'].set_title('right')

upleft, right, lowleft

Matplotlib has quite sophisticated tools for arranging Axes: See
Arranging multiple Axes in a Figure and
Complex and semantic figure composition (subplot_mosaic).

More reading#

For more plot types see Plot types and the
API reference, in particular the
Axes API.

Total running time of the script: ( 0 minutes 8.602 seconds)

Gallery generated by Sphinx-Gallery

Matplotlib – наиболее широко используемый инструмент на Python. Он имеет отличную поддержку множеством сред, таких, как веб-серверы приложений, графические библиотеки пользовательского интерфейса, Jupiter Notebook, iPython Notebook и оболочка iPython.

Примечание редакции

Текст публикуется в переводе, автор оригинальной статьи – Rashida Nasrin Sucky. Примеры кода в оригинале содержали большое количество ошибок, которые нашему автору пришлось исправить в русскоязычной версии публикации.

Matplotlib имеет три основных слоя: слой нижнего уровня (backend), слой рисунков и слой скриптов. Слой нижнего уровня содержит три интерфейсных класса: канва рисунка (figure canvas), определяющая область рисунка, прорисовщик (renderer), умеющий рисовать на этой канве, и событие (event), обрабатывающее ввод пользователя вроде щелчков мыши. Слой рисунков знает, как рисовать с помощью Renderer’а и рисовать на канве. Все, что находится на рисунке Matplotlib, является экземпляром слоя рисунка (artist). Засечки, заголовок, метки – все это индивидуальные объекты слоя рисунков. Слой скриптов – это облегченный интерфейс, который очень полезен для ежедневного применения. Все примеры, приведенные в этой статье, используют слой скриптов и среду Jupiter Notebook.

Если вы используете эту статью для обучения, я рекомендую вам запускать каждый пример кода.

Подготовка данных

Подготовка данных – часто выполняемая задача перед любым проектом по визуализации данных или анализа данных, поскольку данные никогда не приходят в том виде, в котором они нам нужны. Я использую набор данных об иммиграции в Канаду. Сначала импортируем необходимые пакеты и набор данных.

От переводчика

Для импорта файла xlsx нужно установить пакет xlrd, однако новые версии этого пакета перестали читать файлы xlsx по соображениям безопасности. Чтобы прочитать файл, установите старую версию xlrd командой pip install xlrd==1.2.0.

        import numpy as np  
import pandas as pd
df = pd.read_excel('https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/DV0101EN/labs/Data_Files/Canada.xlsx',
                       sheet_name='Canada by Citizenship',
                       skiprows=range(20),
                       skipfooter=2)
df.head()
    

Я пропускаю первые 20 строк и последние две строки, потому что это текст, а не данные с табуляцией. Набор данных слишком велик, так что я не могу показать его целиком. Чтобы получить представление о наборе, давайте посмотрим на имена столбцов:

        df.columns
# Вывод:
# Index([    'Type', 'Coverage',   'OdName',     'AREA', 'AreaName',      'REG',
#        'RegName',      'DEV',  'DevName',       1980,       1981,       1982,
#             1983,       1984,       1985,       1986,       1987,       1988,
#             1989,       1990,       1991,       1992,       1993,       1994,
#             1995,       1996,       1997,       1998,       1999,       2000,
#             2001,       2002,       2003,       2004,       2005,       2006,
#             2007,       2008,       2009,       2010,       2011,       2012,
#             2013],
#      dtype='object')
    

Мы не собираемся использовать все эти столбцы в нашей статье. Поэтому давайте избавимся от столбцов, которые мы не будем использовать, чтобы сделать набор данных меньшим и лучше управляемым.

        df.drop(['AREA','REG','DEV','Type','Coverage'], axis=1, inplace=True)
df.head()
    

📊 Ваша повседневная шпаргалка по Matplotlib

Посмотрите на эти столбцы. Столбец ‘OdName’ – на самом деле название страны, ‘AreaName’ – континент, а ‘RegName’ – регион на этом континенте. Переименуем эти столбцы, чтобы их имена стали более понятными.

        df.rename(columns={'OdName':'Country', 'AreaName':'Continent', 'RegName':'Region'}, inplace=True)
df.columns
# Вывод:
# Index([  'Country', 'Continent',    'Region',   'DevName',        1980,
#              1981,        1982,        1983,        1984,        1985,
#              1986,        1987,        1988,        1989,        1990,
#              1991,        1992,        1993,        1994,        1995,
#              1996,        1997,        1998,        1999,        2000,
#              2001,        2002,        2003,        2004,        2005,
#              2006,        2007,        2008,        2009,        2010,
#              2011,        2012,        2013],
#      dtype='object')
    

Теперь наш набор данных стал более простым для понимания. У нас есть Country, Continent, Region, а DevName указывает, является ли страна развитой или развивающейся. Все столбцы с годами содержат количество иммигрантов в Канаду из соответствующей страны за указанный год. Теперь добавим столбец ‘Total’ (‘Всего’), в котором будет содержаться общее количество иммигрантов из этой страны с 1980-го до 2013-го.

Посмотрите, в конце добавился новый столбец 'Total'.

Посмотрите, в конце добавился новый столбец ‘Total’.

Проверим, есть ли в наборе какие-либо значения null.

        df.isnull().sum()
    

Результат показывает 0 во всех столбцах, то есть в наборе нет пропусков. Я люблю задавать в качестве индекса значащий столбец, а не какие-то цифры, поэтому установим столбец ‘Country’ в качестве индекса.

        df = df.set_index('Country')
    

📊 Ваша повседневная шпаргалка по Matplotlib

Теперь набор данных достаточно чист и красив, чтобы начать работать с ним, поэтому больше чистить мы не станем. Если нам потребуется что-то еще, мы сделаем это по мере необходимости.

Упражнения по рисованию диаграмм

В этой статье мы попробуем несколько различных типов диаграмм – таких, как линейная диаграмма (line plot), диаграмма с областями (area plot), секторная диаграмма (pie plot), диаграмма рассеяния (scatter plot), гистограмма, столбчатая диаграмма (bar graph). Сначала импортируем необходимые пакеты.

        %matplotlib inline
import matplotlib.pyplot as plt
import matplotlib as mpl
    

Выберем стиль, чтобы нам не пришлось слишком утруждаться установкой стиля диаграммы. Вот список доступных стилей:

        plt.style.available
# Вывод:
# ['bmh',
#  'classic',
#  'dark_background',
#  'fast',
#  'fivethirtyeight',
#  'ggplot',
#  'grayscale',
#  'seaborn-bright',
#  'seaborn-colorblind',
#  'seaborn-dark-palette',
#  'seaborn-dark',
#  'seaborn-darkgrid',
#  'seaborn-deep',
#  'seaborn-muted',
#  'seaborn-notebook',
#  'seaborn-paper',
#  'seaborn-pastel',
#  'seaborn-poster',
#  'seaborn-talk',
#  'seaborn-ticks',
#  'seaborn-white',
#  'seaborn-whitegrid',
#  'seaborn',
#  'Solarize_Light2',
#  'tableau-colorblind10',
#  '_classic_test']
    

Я буду использовать стиль ‘ggplot’. Вы можете взять любой другой стиль по своему вкусу.

        mpl.style.use(['ggplot'])
    

Линейная диаграмма

Будет полезным увидеть график изменений иммиграции в Канаду для одной страны. Создадим список лет с 1980-го до 2013-го:

        years = list(range(1980, 2014))
    

Я выбрала для этой демонстрации Швейцарию. Приготовим иммиграционные данные по нашим годам для этой страны.

        df.loc['Switzerland', years]
    

Данные по иммиграции из Швейцарии (часть)

Данные по иммиграции из Швейцарии (часть)

Настало время нарисовать диаграмму. Это очень просто: достаточно вызвать функцию plot для приготовленных нами данных. Затем добавим заголовок и метки для осей x и y.

        df.loc['Switzerland', years].plot()
plt.title('Immigration from Switzerland')
plt.ylabel('Number of immigrants')
plt.xlabel('Years')
plt.show()
    

📊 Ваша повседневная шпаргалка по Matplotlib

Что, если мы хотим вывести графики иммиграции для нескольких стран сразу, чтобы сравнить тенденции иммиграции из этих стран в Канаду? Это делается почти так же, как и в прошлом примере. Нарисуем диаграмму иммиграции из трех южно-азиатских стран: Индии, Пакистана и Бангладеш по годам.

        ind_pak_ban = df.loc[['India', 'Pakistan', 'Bangladesh'], years]
ind_pak_ban.head()
    

📊 Ваша повседневная шпаргалка по Matplotlib

Посмотрите на формат этих данных – он отличается от данных по Швейцарии, использованных прежде. Если мы вызовем функцию plot для этого DataFrame (ind_pak_ban), она выведет количество иммигрантов в каждой стране по оси x и годы по оси y. Нам нужно изменить формат данных:

        ind_pak_ban.T
    

📊 Ваша повседневная шпаргалка по Matplotlib

Это не весь набор данных, а только его часть. Видите, теперь формат данных изменился. Теперь годы будут выводиться по оси x, а количество иммигрантов из каждой страны по оси y.

        ind_pak_ban.T.plot()
    

📊 Ваша повседневная шпаргалка по Matplotlib

Нам не пришлось задавать тип диаграммы, потому что линейная диаграмма рисуется по умолчанию.

Секторная диаграмма

Чтобы продемонстрировать секторную диаграмму, построим диаграмму общего количества иммигрантов для каждого континента. У нас есть данные по каждой стране. Давайте сгруппируем данные по континентам, чтобы просуммировать количество иммигрантов для каждого континента.

        cont = df.groupby('Continent', axis=0).sum()
    

Теперь у нас есть данные, показывающие общее количество иммигрантов для каждого континента. Если хотите, можете вывести этот DataFrame, чтобы увидеть результат. Я не привожу его потому, что он занимает слишком много места по горизонтали. Давайте нарисуем эту диаграмму.

        cont['Total'].plot(kind='pie', figsize=(7,7),
                  autopct='%1.1f%%',
                  shadow=True)
# plt.title('Immigration By Continenets')
plt.axis('equal')
plt.show()
    

📊 Ваша повседневная шпаргалка по Matplotlib

Заметьте, что мне пришлось использовать параметр ‘kind’. Все виды диаграмм, кроме линейной, в функции plot нужно указывать явно. Я ввожу новый параметр ‘figsize’, определяющий размеры диаграммы.

Эта секторная диаграмма достаточно понятна, но мы можем сделать ее еще лучшей. На этот раз я установлю собственные цвета и начальный угол.

        colors = ['lightgreen', 'lightblue', 'pink', 'purple', 'grey', 'gold']
explode=[0.1, 0, 0, 0, 0.1, 0.1]
cont['Total'].plot(kind='pie', figsize=(17, 10),
                  autopct = '%1.1f%%', startangle=90,
                  shadow=True, labels=None, pctdistance=1.12, colors=colors, explode = explode)
plt.axis('equal')
plt.legend(labels=cont.index, loc='upper right', fontsize=14)
plt.show()
    

Разве эта диаграмма не лучше? Мне она нравится больше

Разве эта диаграмма не лучше? Мне она нравится больше

Ящик с усами (boxplot)

Сначала мы построим «ящик с усами» для количества иммигрантов из Китая.

        china = df.loc[['China'], years].T
    

Вот наши данные. А вот диаграмма, построенная по этим данным.

        china.plot(kind='box', figsize=(8, 6))
plt.title('Box plot of Chinese Immigrants')
plt.ylabel('Number of Immigrants')
plt.show()
    

Если вам нужно освежить свои знания про «ящики с усами», пожалуйста, обратитесь к статье «Пример понимания данных с помощью гистограммы и ящика с усами».

Мы можем нарисовать несколько ящиков с усами в одной диаграмме. Используем DataFrame ind_pak_ban и нарисуем ящики для количества иммигрантов из Индии, Пакистана и Бангладеш.

        ind_pak_ban.T.plot(kind='box', figsize=(8, 7))
plt.title('Box plots of Inian, Pakistan and Bangladesh Immigrants')
plt.ylabel('Number of Immigrants')
    

📊 Ваша повседневная шпаргалка по Matplotlib

Диаграмма рассеяния

Диаграммы рассеяния лучше всего подходят для исследования зависимости между переменными. Построим диаграмму рассеяния, чтобы увидеть тренд количества иммигрантов в Канаду за годы.

Для этого упражнения мы создадим новый DataFrame, содержащий годы в качестве индекса и общее количество иммигрантов за каждый год.

        totalPerYear = pd.DataFrame(df[years].sum(axis=0))
totalPerYear.head()
    

📊 Ваша повседневная шпаргалка по Matplotlib

Нам нужно преобразовать годы в целые числа. Я также хочу немного причесать DataFrame, чтобы сделать его более презентабельным.

        totalPerYear.index = map(int, totalPerYear.index)
totalPerYear.reset_index(inplace=True)
totalPerYear.columns = ['year', 'total']
totalPerYear.head()
    

📊 Ваша повседневная шпаргалка по Matplotlib

Осталось задать параметры осей x и y для диаграммы рассеяния.

        totalPerYear.plot(kind='scatter', x = 'year', y='total', figsize=(10, 6), color='darkred')
plt.title('Total Immigration from 1980 - 2013')
plt.xlabel('Year')
plt.ylabel('Number of Immigrants')
plt.show()
    

📊 Ваша повседневная шпаргалка по Matplotlib

Похоже, здесь есть линейная зависимость между годом и количеством иммигрантов. С течением лет количество иммигрантов показывает явно растущий тренд.

Диаграмма с областями

Диаграмма с областями показывает область под линейным графиком. Для этой диаграммы я хочу создать DataFrame, содержащий информацию по Индии, Китаю, Пакистану и Франции.

        top = df.loc[['India', 'China', 'Pakistan', 'France'], years]
top = top.T
    

📊 Ваша повседневная шпаргалка по Matplotlib

Набор данных готов. Пора сделать из него диаграмму.

        colors = ['black', 'green', 'blue', 'red']
top.plot(kind='area', stacked=False, figsize=(20, 10), color=colors)
plt.title('Immigration trend from Europe')
plt.ylabel('Number of Immigrants')
plt.xlabel('Years')
plt.show()
    

📊 Ваша повседневная шпаргалка по Matplotlib

Не забудьте использовать параметр ‘stacked’, если хотите увидеть области для каждой отдельной страны. Если не установить stacked = False, диаграмма будет выглядеть примерно так:

Если диаграмма stacked (по умолчанию), область, соответствующая каждой переменной, соответствует не расстоянию до оси <b>x</b>, а расстоянию до графика предыдущей переменной.

Если диаграмма stacked (по умолчанию), область, соответствующая каждой переменной, соответствует не расстоянию до оси x, а расстоянию до графика предыдущей переменной.

Гистограмма

Гистограмма показывает распределение переменной. Вот ее пример:

        df[2005].plot(kind='hist', figsize=(8,5))
plt.title('Histogram of Immigration from 195 Countries in 2005') # заголовок гистограммы
plt.ylabel('Number of Countries') # y-метка
plt.xlabel('Number of Immigrants') # x-метка
plt.show()
    

📊 Ваша повседневная шпаргалка по Matplotlib

Мы построили гистограмму, показывающую распределение иммиграции за 2005 год. Гистограмма показывает, что из большинства стран приехало от 0 до 5000 иммигрантов. Только несколько стран прислали 20 тысяч, и еще пара стран прислала по 40 тысяч иммигрантов.

Давайте используем DataFrame top из предыдущего примера и нарисуем распределение количества иммигрантов из каждой страны в одной и той же гистограмме.

        top.plot.hist()
plt.title('Histogram of Immigration from Some Populous Countries')
plt.ylabel('Number of Years')
plt.xlabel('Number of Immigrants')
plt.show()
    

📊 Ваша повседневная шпаргалка по Matplotlib

На предыдущей гистограмме мы видели, что из нескольких стран приехало 20 и 40 тысяч иммигрантов. Похоже, что Китай и Индия среди этих «нескольких». На этой гистограмме мы не можем четко увидеть границы между столбцами. Давайте улучшим ее.

Задаем количество столбцов и показываем их границы.

Я использую 15 столбцов. Здесь я ввожу новый параметр под названием ‘alpha’ – он определяет прозрачность цветов. Для таких перекрывающихся диаграмм, как наша, прозрачность важна, чтобы увидеть картину каждого распределения.

        count, bin_edges = np.histogram(top, 15)
top.plot(kind = 'hist', figsize=(14, 6), bins=15, alpha=0.6, 
        xticks=bin_edges, color=colors)
    

Гистограмма с прозрачностью. Теперь мы можем увидеть каждое распределение.

Гистограмма с прозрачностью. Теперь мы можем увидеть каждое распределение.

Как и для диаграммы с областями, мы можем использовать параметр ‘stacked’, но для гистограмм он по умолчанию выключен.

        top.plot(kind='hist',
          figsize=(12, 6), 
          bins=15,
          xticks=bin_edges,
          color=colors,
          stacked=True,
         )
plt.title('Histogram of Immigration from Some Populous Countries')
plt.ylabel('Number of Years')
plt.xlabel('Number of Immigrants')
plt.show()
    

📊 Ваша повседневная шпаргалка по Matplotlib

Столбчатая диаграмма

Для столбчатой диаграммы я использую количество иммигрантов из Франции за каждый год.

        france = df.loc['France', years]
france.plot(kind='bar', figsize = (10, 6))
plt.xlabel('Year') 
plt.ylabel('Number of immigrants') 
plt.title('Immigrants From France')
plt.show()
    

📊 Ваша повседневная шпаргалка по Matplotlib

Вы можете добавить к столбчатой диаграмме дополнительную информацию. Эта диаграмма показывает растущий тренд с 1997 года примерно на декаду, который стоит отметить. Это можно сделать с помощью функции annotate.

        france.plot(kind='bar', figsize = (10, 6))
plt.xlabel('Year') 
plt.ylabel('Number of immigrants') 
plt.title('Immigrants From France')
plt.annotate('Increasing Trend',
            xy = (19, 4500),
            rotation= 23,
            va = 'bottom',
            ha = 'left')
plt.annotate('',
            xy=(29, 5500),
            xytext=(17, 3800),
            xycoords='data',
            arrowprops=dict(arrowstyle='->', connectionstyle='arc3', color='black', lw=1.5))
plt.show()
    

📊 Ваша повседневная шпаргалка по Matplotlib

Иногда горизонтальное расположение столбцов делает диаграмму более понятной. Еще лучше, если метки рисуются прямо на столбцах. Давайте сделаем это.

        france.plot(kind='barh', figsize=(12, 16), color='steelblue')
plt.xlabel('Year') # add to x-label to the plot
plt.ylabel('Number of immigrants') # add y-label to the plot
plt.title('Immigrants From France') # add title to the plot
for index, value in enumerate(france):
    label = format(int(value), ',')
    plt.annotate(label, xy=(value-300, index-0.1), color='white')
    
plt.show()
    

📊 Ваша повседневная шпаргалка по Matplotlib

Разве эта диаграмма выглядит не лучше, чем предыдущая?

В этой статье мы изучили основы Matplotlib. Теперь у вас достаточно знаний, чтобы начать самостоятельное использование Matplotlib прямо сегодня.

Расширенные методы визуализации описаны в следующих статьях:

  • «Интерактивная фоновая картограмма на Python»
  • «Создаем «облака слов» любой формы на Python»
  • «Интерактивная визуализация географических данных на Python»
  • «Вафельные графики» с помощью Matplotlib на Python»
  • «Пузырьковые диаграммы с помощью Matplotlib»
  • «Исследовательский анализ данных для моделирования данных»
  • «Сортируем и сегментируем данные с помощью методов Cut или Qcut из Pandas»

#статьи

  • 13 фев 2023

  • 0

Разбираемся в том, как работает библиотека Matplotlib, и строим первые графики.

Иллюстрация: Оля Ежак для Skillbox Media

Антон Яценко

Изучает Python, его библиотеки и занимается анализом данных. Любит путешествовать в горах.

Matplotlib — популярная Python-библиотека для визуализации данных. Она используется для создания любых видов графиков: линейных, круговых диаграмм, построчных гистограмм и других — в зависимости от задач.

В этой статье научимся импортировать библиотеку и на примерах разберём основные способы визуализации данных.

Библиотека Matplotlib — пакет для визуализации данных в Python, который позволяет работать с данными на нескольких уровнях:

  • с помощью модуля Pyplot, который рассматривает график как единое целое;
  • через объектно-ориентированный интерфейс, когда каждая фигура или её часть является отдельным объектом, — это позволяет выборочно менять их свойства и отображение.

В этой статье мы будем работать с модулем Pyplot, которого достаточно для построения графиков.

Matplotlib используют для визуализации данных любой сложности. Библиотека позволяет строить разные варианты графиков: линейные, трёхмерные, диаграммы рассеяния и другие, а также комбинировать их.

Дополнительные библиотеки позволяют расширить возможности анализа данных. Например, модуль Cartopy добавляет возможность работать с картографической информацией. Подробно про Matplotlib можно узнать из официальной документации.

Сочетание двух типов графиков в Matplotlib
Инфографика: Matplotlib

Визуализация распределения температур на карте Земли с помощью модуля Cartopy
Изображение: Cartopy / SciTools

Сама Matplotlib является основой для других библиотек — например, Seaborn позволяет проще создавать графики и имеет больше возможностей для косметического улучшения их внешнего вида. Но Matplotlib — это базовая библиотека для визуализации данных, незаменимая в анализе данных.

При погружении в Matplotlib можно встретить упоминание двух модулей — Pyplot и Pylab. Важно понимать, какой из них использовать в работе и почему они появились. Разберёмся в терминологии.

Библиотека Matplotlib — это пакет для визуализации данных в Python. Pyplot — это модуль в пакете Matplotlib. Его вы часто будете видеть в коде как matplotlib.pyplot. Модуль помогает автоматически создавать оси, фигуры и другие компоненты, не задумываясь о том, как это происходит. Именно Pyplot используется в большинстве случаев.

Pylab — это ещё один модуль, который устанавливается вместе с пакетом Matplotlib. Он одновременно импортирует Pyplot и библиотеку NumPy для работы с массивами в интерактивном режиме или для доступа к функциям черчения при работе с данными.

Сейчас Pylab имеет только историческое значение — он облегчал переход с MATLAB на Matplotlib, так как позволял обходиться без операторов импорта (а именно так привыкли работать пользователи MATLAB). Вы можете встретиться с Pylab в примерах кода на разных сайтах, но на практике использовать модуль не придётся.

Matplotlib — универсальная библиотека, которая работает в Python на Windows, macOS и Linux. При работе с Google Colab или Jupyter Notebook устанавливать Python и Matplotlib не понадобится — язык программирования и библиотека уже доступны «из коробки». Но если вы решили писать код в другой IDE, например в Visual Studio Code, то сначала установите Python, а затем библиотеку Learn через терминал:

pip3 install matplotlib

Теперь можно переходить к импорту библиотеки:

import matplotlib.pyplot as plt

Сокращение plt для библиотеки — общепринятое. Вы встретите его в официальной документации, книгах и в ноутбуках других людей. Так что используйте его.

Для начала создадим две переменные — x и y, которые будут содержать координаты точек по осям х и у:

x = [1, 2, 3, 4, 5]
y = [25, 32, 34, 20, 25]

Теперь построим график, который соединит эти точки:

plt.plot(x, y)
plt.show()

Скриншот: Skillbox Media

Мы получили обычный линейный график. Разберём каждую команду:

  • plt.plot() — стандартная функция, которая строит график в соответствии со значениями, которые ей были переданы. Мы передали в неё координаты точек;
  • plt.show() — функция, которая отвечает за вывод визуализированных данных на экран. Её можно и не указывать, но тогда, помимо красивой картинки, мы увидим разную техническую информацию.

Дополним наш первый график заголовком и подписями осей:

plt.plot(x, y)
plt.xlabel('Ось х') #Подпись для оси х
plt.ylabel('Ось y') #Подпись для оси y
plt.title('Первый график') #Название
plt.show()

Смотрим на результат:

Скриншот: Skillbox Media

С помощью Matplotlib можно настроить отображение любого графика. Например, мы можем изменить цвет линии, а также выделить точки, координаты которых задаём в переменных:

plt.plot(x, y, color='green', marker='o', markersize=7)

Теперь точки хорошо видны, а цвет точек и линии изменился на зелёный:

Скриншот: Skillbox Media

Подробно про настройку параметров функции plt.plot() можно прочесть в официальной документации.

Диаграмма рассеяния используется для оценки взаимосвязи двух переменных, значения которых откладываются по разным осям. Для её построения используется функция plt.scatter(), аргументами которой выступают переменные с дискретными значениями:

x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [25, 32, 34, 20, 25, 23, 21, 33, 19, 28]

plt.scatter(x, y)
plt.show()

Диаграмма рассеяния выглядит как множество отдельных точек:

Скриншот: Skillbox Media

Такой тип визуализации позволяет удобно сравнивать значения отдельных переменных. В столбчатой диаграмме длина столбцов пропорциональна показателям, которые они отображают. Как правило, одна из осей соответствует одной категории, а вторая — её дискретному значению.

Например, столбчатая диаграмма позволяет наглядно показать величину прибыли по месяцам. Построим следующий график:

x = ['Январь', 'Февраль', 'Март', 'Апрель', 'Май']
y = [2, 4, 3, 1, 7]

plt.bar(x, y, label='Величина прибыли') #Параметр label позволяет задать название величины для легенды
plt.xlabel('Месяц года')
plt.ylabel('Прибыль, в млн руб.')
plt.title('Пример столбчатой диаграммы')
plt.legend()
plt.show()

Столбчатая диаграмма позволяет увидеть динамику изменения прибыли по месяцам:

Скриншот: Skillbox Media

Для некоторых задач полезно объединить несколько типов графиков, например столбчатую диаграмму и линейный график. Доработаем его, добавив к столбцам точки со значениями прибыли, и соединим их:

x = ['Январь', 'Февраль', 'Март', 'Апрель', 'Май']
y = [2, 4, 3, 1, 7]

plt.bar(x, y, label='Величина прибыли') #Параметр label позволяет задать название величины для легенды
plt.plot(x, y, color='green', marker='o', markersize=7)

plt.xlabel('Месяц года')
plt.ylabel('Прибыль, в млн руб.')
plt.title('Комбинирование графиков')
plt.legend()
plt.show()

Теперь на одном экране мы видим сразу оба типа:

Скриншот: Skillbox Media

Всё получилось. Но сейчас линейный график видно плохо — он просто теряется на синем фоне столбцов. Увеличим прозрачность столбчатой диаграммы с помощью параметра alpha:

plt.bar(x, y, label='Величина прибыли', alpha=0.5)

Параметр alpha может принимать значения от 0 до 1, где 0 — полная прозрачность, а 1 — отсутствие прозрачности. Посмотрим на результат:

Скриншот: Skillbox Media

Теперь линейный график хорошо виден и мы можем оценивать динамику изменения прибыли.

Круговую диаграмму используют для отображения состава групп. Например, мы можем наглядно показать, какие марки автомобилей преобладают на дорогах города:

vals = [24, 17, 53, 21, 35]
labels = ["Ford", "Toyota", "BMW", "Audi", "Jaguar"]

plt.pie(vals, labels=labels)
plt.title("Распределение марок автомобилей на дороге")
plt.show()

Результат:

Скриншот: Skillbox Media

Так информация нагляднее, но непонятно, какая именно доля приходится на каждую марку автомобиля. Поэтому круговые диаграммы всегда лучше дополнять значениями в процентах. Отредактируем наш код, добавив к функции pie параметр autopct:

vals = [24, 17, 53, 21, 35]
labels = ["Ford", "Toyota", "BMW", "Audi", "Jaguar"]

plt.pie(vals, labels=labels, autopct='%1.1f%%')
plt.title("Распределение марок автомобилей на дороге")
plt.show()

В параметр мы передаём формат отображения числа. В нашем случае это будет целое число с одним знаком после запятой. Запустим код и посмотрим на результат:

Скриншот: Skillbox Media

Теперь сравнить категории проще, так как мы видим числовые значения.

Построим столбчатый график с накоплением. Он позволяет оценить динамику соотношения значений одной переменной. Попробуем показать, как соотносится количество устройств на Android и iOS в разные годы:

labels = ['2017', '2018', '2019', '2020', '2021']
android_users = [85, 85.1, 86, 86.2, 86]
ios_users = [14.5, 14.8, 13, 13.8, 14.0]

width = 0.35       #Задаём ширину столбцов
fig, ax = plt.subplots()

ax.bar(labels, android_users, width, label='Android')
ax.bar(labels, ios_users, width, bottom=android_users,
      label='iOS') #Указываем с помощью параметра bottom, что значения в столбце должны быть выше значений переменной android_users

ax.set_ylabel('Соотношение, в %')
ax.set_title('Распределение устройств на Android и iOS')
ax.legend(loc='lower left', title='Устройства') #Сдвигаем легенду в нижний левый угол, чтобы она не перекрывала часть графика 

plt.show()

Смотрим на результат:

Скриншот: Skillbox Media

График позволяет увидеть, что соотношение устройств, работающих на Android и iOS, постепенно меняется — устройств на Android становится больше.

Matplotlib — мощная библиотека для визуализации данных в Python. В этой статье мы познакомились только с самыми основами. Ещё много полезной информации можно найти в официальной документации.

Но если вы решили действительно углубиться в возможности библиотеки и визуализацию данных, то здесь помогут книги:

  • Mastering matplotlib Дункана Макгреггора;
  • Hands-on Matplotlib: Learn Plotting and Visualizations with Python 3 Ашвина Паянкара;
  • Matplotlib 3.0 Cookbook: Over 150 recipes to create highly detailed interactive visualizations using Python Рао Полади.

Научитесь: Профессия Python-разработчик
Узнать больше

Matplotlib is easy to use and an amazing visualizing library in Python. It is built on NumPy arrays and designed to work with the broader SciPy stack and consists of several plots like line, bar, scatter, histogram, etc. 

In this article, we will learn about Python plotting with Matplotlib from basics to advance with the help of a huge dataset containing information about different types of plots and their customizations.

Table Of Content

  • Getting Started
  • Pyplot
  • Figure class
  • Axes Class
  • Setting Limits and Tick labels
  • Multiple Plots
  • What is a Legend?
  • Creating Different Types of Plots 
    • Line Graph
    • Bar chart
    • Histograms
    • Scatter Plot
    • Pie Chart
    • 3D Plots
  • Working with Images
  • Customizing Plots in Matplotlib
  • More articles on Matplotlib
  • Exercises, Applications, and Projects

Recent Articles on Matplotlib !!!

Getting Started

Before we start learning about Matplotlib we first have to set up the environment and will also see how to use Matplotlib with Jupyter Notebook:

  • Environment Setup for Matplotlib
  • Using Matplotlib with Jupyter Notebook

After learning about the environment setup and how to use Matplotlib with Jupyter let’s create a simple plot. We will be plotting two lists containing the X, Y coordinates for the plot.

Example:

Python3

import matplotlib.pyplot as plt

x = [10, 20, 30, 40]

y = [20, 30, 40, 50]

plt.plot(x, y)

plt.title("Simple Plot")

plt.ylabel("y-axis")

plt.xlabel("x-axis")

plt.show()

Output:

In the above example, the elements of X and Y provides the coordinates for the x axis and y axis and a straight line is plotted against those coordinates. For a detailed introduction to Matplotlib and to see how basic charts are plotted refer to the below article.

  • Introduction to Matplotlib
  • Simple Plot in Python using Matplotlib

In the above article, you might have seen Pyplot was imported in code and must have wondered what is Pyplot. Don’t worry we will discuss the Pyplot in the next section.

Pyplot

Pyplot is a Matplotlib module that provides a MATLAB-like interface. Pyplot provides functions that interact with the figure i.e. creates a figure, decorates the plot with labels, and creates a plotting area in a figure.

Syntax:

matplotlib.pyplot.plot(*args, scalex=True, scaley=True, data=None, **kwargs)

Example:

Python3

import matplotlib.pyplot as plt

plt.plot([1, 2, 3, 4], [1, 4, 9, 16])

plt.axis([0, 6, 0, 20])

plt.show()

Output:

Refer to the below articles to get detailed information about Pyplot and functions associated with this class.

  • Pyplot in Matplotlib
  • Matplotlib.pyplot.plot() function in Python
  • Matplotlib.pyplot.title() in Python
  • matplotlib.pyplot.imshow() in Python
  • Matplotlib.pyplot.legend() in Python
  • Matplotlib.pyplot.subplots() in Python
  • Matplotlib.pyplot.colors() in Python
  • Matplotlib.pyplot.grid() in Python

>>> More Functions on Pyplot class

Matplotlib take care of the creation of inbuilt defaults like Figure and Axes. Don’t worry about these terms we will study them in detail in the below section but let’s take a brief about these terms.

  • Figure: This class is the top-level container for all the plots means it is the overall window or page on which everything is drawn. A figure object can be considered as a box-like container that can hold one or more axes.
  • Axes: This class is the most basic and flexible component for creating sub-plots. You might confuse axes as the plural of axis but it is an individual plot or graph. A given figure may contain many axes but given axes can only be in one figure.

Figure class

Figure class is the top-level container that contains one or more axes. It is the overall window or page on which everything is drawn.

Syntax:

class matplotlib.figure.Figure(figsize=None, dpi=None, facecolor=None, edgecolor=None, linewidth=0.0, frameon=None, subplotpars=None, tight_layout=None, constrained_layout=None)

Example 1:

Python3

import matplotlib.pyplot as plt

from matplotlib.figure import Figure

fig = plt.figure(figsize =(5, 4))

ax = fig.add_axes([1, 1, 1, 1])

ax.plot([2, 3, 4, 5, 5, 6, 6],

        [5, 7, 1, 3, 4, 6 ,8])

plt.show()

Output:

Example 2: Creating multiple plots

Python3

import matplotlib.pyplot as plt

from matplotlib.figure import Figure

fig = plt.figure(figsize =(5, 4))

ax1 = fig.add_axes([1, 1, 1, 1])

ax2 = fig.add_axes([1, 0.5, 0.5, 0.5])

ax1.plot([2, 3, 4, 5, 5, 6, 6],

         [5, 7, 1, 3, 4, 6 ,8])

ax2.plot([1, 2, 3, 4, 5],

         [2, 3, 4, 5, 6])

plt.show()

Output:

Refer to the below articles to get detailed information about the Figure class and functions associated with it.

  • Matplotlib.figure.Figure() in Python
  • Matplotlib.figure.Figure.add_axes() in Python
  • Matplotlib.figure.Figure.clear() in Python
  • Matplotlib.figure.Figure.colorbar() in Python
  • Matplotlib.figure.Figure.get_figwidth() in Python
  • Matplotlib.figure.Figure.get_figheight() in Python
  • Matplotlib.figure.Figure.subplots() in Python

>>> More Functions in Figure Class

Axes Class

Axes class is the most basic and flexible unit for creating sub-plots. A given figure may contain many axes, but a given axes can only be present in one figure. The axes() function creates the axes object. Let’s see the below example.

Syntax:

matplotlib.pyplot.axis(*args, emit=True, **kwargs)

Example 1: 

Python3

import matplotlib.pyplot as plt

from matplotlib.figure import Figure

ax = plt.axes([1, 1, 1, 1])

Output:

Example 2:

Python3

import matplotlib.pyplot as plt

from matplotlib.figure import Figure

fig = plt.figure(figsize = (5, 4))

ax = fig.add_axes([1, 1, 1, 1])

ax1 = ax.plot([1, 2, 3, 4], [1, 2, 3, 4])

ax2 = ax.plot([1, 2, 3, 4], [2, 3, 4, 5])

plt.show()

Output:

Refer to the below articles to get detailed information about the axes class and functions associated with it.

  • Matplotlib – Axes Class
  • Matplotlib.axes.Axes.update() in Python
  • Matplotlib.axes.Axes.draw() in Python
  • Matplotlib.axes.Axes.get_figure() in Python
  • Matplotlib.axes.Axes.set_figure() in Python
  • Matplotlib.axes.Axes.properties() in Python

>>> More Functions on Axes Class

Setting Limits and Tick labels

You might have seen that Matplotlib automatically sets the values and the markers(points) of the x and y axis, however, it is possible to set the limit and markers manually. set_xlim() and set_ylim() functions are used to set the limits of the x-axis and y-axis respectively. Similarly, set_xticklabels() and set_yticklabels() functions are used to set tick labels.

Example:

Python3

import matplotlib.pyplot as plt

from matplotlib.figure import Figure

x = [3, 1, 3]

y = [3, 2, 1]

fig = plt.figure(figsize =(5, 4))

ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])

ax.plot(x, y)

ax.set_xlim(1, 2)

ax.set_xticklabels((

  "one", "two", "three", "four", "five", "six"))

plt.show()

Output:

Multiple Plots

Till now you must have got a basic idea about Matplotlib and plotting some simple plots, now what if you want to plot multiple plots in the same figure. This can be done using multiple ways. One way was discussed above using the add_axes() method of the figure class. Let’s see various ways multiple plots can be added with the help of examples.

Method 1: Using the add_axes() method 

The add_axes() method figure module of matplotlib library is used to add an axes to the figure.

Syntax:

add_axes(self, *args, **kwargs)

Example:

Python3

import matplotlib.pyplot as plt

from matplotlib.figure import Figure

fig = plt.figure(figsize =(5, 4))

ax1 = fig.add_axes([0.1, 0.1, 0.8, 0.8])

ax2 = fig.add_axes([0.5, 0.5, 0.3, 0.3])

ax1.plot([5, 4, 3, 2, 1], [2, 3, 4, 5, 6])

ax2.plot([1, 2, 3, 4, 5], [2, 3, 4, 5, 6])

plt.show()

Output:

The add_axes() method adds the plot in the same figure by creating another axes object.

Method 2: Using subplot() method. 

This method adds another plot to the current figure at the specified grid position.

Syntax:

subplot(nrows, ncols, index, **kwargs)

subplot(pos, **kwargs) 

subplot(ax)

Example:

Python3

import matplotlib.pyplot as plt

x = [3, 1, 3]

y = [3, 2, 1]

z = [1, 3, 1]

plt.figure()

plt.subplot(121)

plt.plot(x, y)

plt.subplot(122)

plt.plot(z, y)

Output:

Note: Subplot() function have the following disadvantages – 

  • It does not allow adding multiple subplots at the same time.
  • It deletes the preexisting plot of the figure.

Method 3: Using subplots() method

This function is used to create figure and multiple subplots at the same time.

Syntax:

matplotlib.pyplot.subplots(nrows=1, ncols=1, sharex=False, sharey=False, squeeze=True, subplot_kw=None, gridspec_kw=None, **fig_kw)

Example:

Python3

import matplotlib.pyplot as plt

fig, axes = plt.subplots(1, 2)

axes[0].plot([1, 2, 3, 4], [1, 2, 3, 4])

axes[0].plot([1, 2, 3, 4], [4, 3, 2, 1])

axes[1].plot([1, 2, 3, 4], [1, 1, 1, 1])

Output:

Method 4: Using subplot2grid() method

This function give additional flexibility in creating axes object at a specified location inside a grid. It also helps in spanning the axes object across multiple rows or columns. In simpler words, this function is used to create multiple charts within the same figure.

Syntax:

Plt.subplot2grid(shape, location, rowspan, colspan)

Example:

Python3

import matplotlib.pyplot as plt

x = [3, 1, 3]

y = [3, 2, 1]

z = [1, 3, 1]

axes1 = plt.subplot2grid (

  (7, 1), (0, 0), rowspan = 2,  colspan = 1)

axes2 = plt.subplot2grid (

  (7, 1), (2, 0), rowspan = 2, colspan = 1)

axes3 = plt.subplot2grid (

  (7, 1), (4, 0), rowspan = 2, colspan = 1)

axes1.plot(x, y)

axes2.plot(x, z)

axes3.plot(z, y)

Output:

Refer to the below articles to get detailed information about subplots

  • How to create multiple subplots in Matplotlib in Python?
  • How to Add Title to Subplots in Matplotlib?
  • How to Set a Single Main Title for All the Subplots in Matplotlib?
  • How to Turn Off the Axes for Subplots in Matplotlib?
  • How to Create Different Subplot Sizes in Matplotlib?
  • How to set the spacing between subplots in Matplotlib in Python?
  • Matplotlib Sub plotting using object oriented API
  • Make subplots span multiple grid rows and columns in Matplotlib

What is a Legend?

A legend is an area describing the elements of the graph. In simple terms, it reflects the data displayed in the graph’s Y-axis. It generally appears as the box containing a small sample of each color on the graph and a small description of what this data means.

Creating the Legend

A Legend can be created using the legend() method. The attribute Loc in the legend() is used to specify the location of the legend. The default value of loc is loc=”best” (upper left). The strings ‘upper left’, ‘upper right’, ‘lower left’, ‘lower right’ place the legend at the corresponding corner of the axes/figure.

The attribute bbox_to_anchor=(x, y) of legend() function is used to specify the coordinates of the legend, and the attribute ncol represents the number of columns that the legend has. Its default value is 1.

Syntax:

matplotlib.pyplot.legend([“blue”, “green”], bbox_to_anchor=(0.75, 1.15), ncol=2)

Example:

Python3

import matplotlib.pyplot as plt

x = [3, 1, 3]

y = [3, 2, 1]

plt.plot(x, y)

plt.plot(y, x)

plt.legend(["blue", "orange"])

plt.show()

Output:

Refer to the below articles to get detailed information about the legend – 

  • Matplotlib.pyplot.legend() in Python
  • Matplotlib.axes.Axes.legend() in Python
  • Change the legend position in Matplotlib
  • How to Change Legend Font Size in Matplotlib?
  • How Change the vertical spacing between legend entries in Matplotlib?
  • Use multiple columns in a Matplotlib legend
  • How to Create a Single Legend for All Subplots in Matplotlib?
  • How to manually add a legend with a color box on a Matplotlib figure ?
  • How to Place Legend Outside of the Plot in Matplotlib?
  • How to Remove the Legend in Matplotlib?
  • Remove the legend border in Matplotlib

Creating Different Types of Plots

Line Graph

Till now you all must have seen that we are working with only the line charts as they are easy to plot and understand. Line Chart is used to represent a relationship between two data X and Y on a different axis. It is plotted using the pot() function. Let’s see the below example

Example:
 

Python3

import matplotlib.pyplot as plt

x = [3, 1, 3]

y = [3, 2, 1]

plt.plot(x, y)

plt.title("Line Chart")

plt.legend(["Line"])

plt.show()

Output:

Refer to the below article to get detailed information about line chart.

  • Line chart in Matplotlib
  • Line plot styles in Matplotlib
  • Plot a Horizontal line in Matplotlib
  • Plot a Vertical line in Matplotlib
  • Plot Multiple lines in Matplotlib
  • Change the line opacity in Matplotlib
  • Increase the thickness of a line with Matplotlib
  • Plot line graph from NumPy array
  • How to Fill Between Multiple Lines in Matplotlib?

Bar chart

A bar plot or bar chart is a graph that represents the category of data with rectangular bars with lengths and heights that is proportional to the values which they represent. The bar plots can be plotted horizontally or vertically. A bar chart describes the comparisons between the discrete categories. It can be created using the bar() method.

Syntax:

plt.bar(x, height, width, bottom, align)

Example:

Python3

import matplotlib.pyplot as plt

x = [3, 1, 3, 12, 2, 4, 4]

y = [3, 2, 1, 4, 5, 6, 7]

plt.bar(x, y)

plt.title("Bar Chart")

plt.legend(["bar"])

plt.show()

Output:

Refer to the below articles to get detailed information about Bar charts –

  • Bar Plot in Matplotlib
  • Draw a horizontal bar chart with Matplotlib
  • Create a stacked bar plot in Matplotlib
  • Stacked Percentage Bar Plot In MatPlotLib
  • Plotting back-to-back bar charts Matplotlib
  • How to display the value of each bar in a bar chart using Matplotlib?
  • How To Annotate Bars in Barplot with Matplotlib in Python?
  • How to Annotate Bars in Grouped Barplot in Python?

Histograms

A histogram is basically used to represent data in the form of some groups. It is a type of bar plot where the X-axis represents the bin ranges while the Y-axis gives information about frequency. To create a histogram the first step is to create a bin of the ranges, then distribute the whole range of the values into a series of intervals, and count the values which fall into each of the intervals. Bins are clearly identified as consecutive, non-overlapping intervals of variables. The hist() function is used to compute and create histogram of x.

Syntax:

matplotlib.pyplot.hist(x, bins=None, range=None, density=False, weights=None, cumulative=False, bottom=None, histtype=’bar’, align=’mid’, orientation=’vertical’, rwidth=None, log=False, color=None, label=None, stacked=False, *, data=None, **kwargs)

Example:

Python3

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5, 6, 7, 4]

plt.hist(x, bins = [1, 2, 3, 4, 5, 6, 7])

plt.title("Histogram")

plt.legend(["bar"])

plt.show()

Output:

Refer to the below articles to get detailed information about histograms.

  • Plotting Histogram in Python using Matplotlib
  • Create a cumulative histogram in Matplotlib
  • How to plot two histograms together in Matplotlib?
  • Overlapping Histograms with Matplotlib in Python
  • Bin Size in Matplotlib Histogram
  • Compute the histogram of a set of data using NumPy in Python
  • Plot 2-D Histogram in Python using Matplotlib

Scatter Plot

Scatter plots are used to observe the relationship between variables and use dots to represent the relationship between them. The scatter() method in the matplotlib library is used to draw a scatter plot.

Syntax:

matplotlib.pyplot.scatter(x_axis_data, y_axis_data, s=None, c=None, marker=None, cmap=None, vmin=None, vmax=None, alpha=None, linewidths=None, edgecolors=None)

Example:

Python3

import matplotlib.pyplot as plt

x = [3, 1, 3, 12, 2, 4, 4]

y = [3, 2, 1, 4, 5, 6, 7]

plt.scatter(x, y)

plt.legend("A")

plt.title("Scatter chart")

plt.show()

Output:

Refer to the below articles to get detailed information about the scatter plot.

  • matplotlib.pyplot.scatter() in Python
  • How to add a legend to a scatter plot in Matplotlib ?
  • How to Connect Scatterplot Points With Line in Matplotlib?
  • How to create a Scatter Plot with several colors in Matplotlib?
  • How to increase the size of scatter points in Matplotlib ?

Pie Chart

A Pie Chart is a circular statistical plot that can display only one series of data. The area of the chart is the total percentage of the given data. The area of slices of the pie represents the percentage of the parts of the data. The slices of pie are called wedges. The area of the wedge is determined by the length of the arc of the wedge. It can be created using the pie() method.

Syntax:

matplotlib.pyplot.pie(data, explode=None, labels=None, colors=None, autopct=None, shadow=False)

Example:

Python3

import matplotlib.pyplot as plt

x = [1, 2, 3, 4]

=(0.1, 0, 0, 0)

plt.pie(x, explode = e)

plt.title("Pie chart")

plt.show()

Output:

Refer to the below articles to get detailed information about pie charts.

  • matplotlib.axes.Axes.pie() in Python
  • Plot a pie chart in Python using Matplotlib
  • How to set border for wedges in Matplotlib pie chart?
  • Radially displace pie chart wedge in Matplotlib

3D Plots 

Matplotlib was introduced keeping in mind, only two-dimensional plotting. But at the time when the release of 1.0 occurred, the 3D utilities were developed upon the 2D and thus, we have a 3D implementation of data available today.

Example:

Python3

import matplotlib.pyplot as plt

fig = plt.figure()

ax = plt.axes(projection = '3d')

Output:

The above code lets the creation of a 3D plot in Matplotlib. We can create different types of 3D plots like scatter plots, contour plots, surface plots, etc. Let’s create a simple 3D line plot.

Example:

Python3

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]

y = [1, 4, 9, 16, 25]

z = [1, 8, 27, 64, 125]

fig = plt.figure()

ax = plt.axes(projection = '3d')

ax.plot3D(z, y, x)

Output:

Refer to the below articles to get detailed information about 3D plots.

  • Three-dimensional Plotting in Python using Matplotlib
  • 3D Scatter Plotting in Python using Matplotlib
  • 3D Surface plotting in Python using Matplotlib
  • 3D Wireframe plotting in Python using Matplotlib
  • 3D Contour Plotting in Python using Matplotlib
  • Tri-Surface Plot in Python using Matplotlib
  • Surface plots and Contour plots in Python
  • How to change angle of 3D plot in Python?
  • How to animate 3D Graph using Matplotlib?
  • Draw contours on an unstructured triangular grid in Python using Matplotlib

Working with Images

The image module in matplotlib library is used for working with images in Python. The image module also includes two useful methods which are imread which is used to read images and imshow which is used to display the image.

Example:

Python3

import matplotlib.pyplot as plt

import matplotlib.image as img

testImage = img.imread('g4g.png')

plt.imshow(testImage)

Output:

Refer to the below articles to get detailed information about working with images using Matplotlib.

  • Working with Images in Python using Matplotlib
  • Working with PNG Images using Matplotlib
  • How to Display an Image in Grayscale in Matplotlib?
  • Plot a Point or a Line on an Image with Matplotlib
  • How to Draw Rectangle on Image in Matplotlib?
  • How to Display an OpenCV image in Python with Matplotlib?
  • Calculate the area of an image using Matplotlib

Customizing Plots in Matplotlib

  • Style Plots using Matplotlib
  • Change plot size in Matplotlib – Python
  • How to Change the Transparency of a Graph Plot in Matplotlib with Python?
  • How to Change the Color of a Graph Plot in Matplotlib with Python?
  • How to Change Fonts in matplotlib?
  • How to change the font size of the Title in a Matplotlib figure ?
  • How to Set Tick Labels Font Size in Matplotlib?
  • How to Set Plot Background Color in Matplotlib?
  • How to generate a random color for a Matplotlib plot in Python?
  • Add Text Inside the Plot in Matplotlib
  • How to add text to Matplotlib?
  • How to change Matplotlib color bar size in Python?
  • How to manually add a legend with a color box on a Matplotlib figure ?
  • How to change the size of axis labels in Matplotlib?
  • How to Hide Axis Text Ticks or Tick Labels in Matplotlib?
  • How To Adjust Position of Axis Labels in Matplotlib?
  • Hide Axis, Borders and White Spaces in Matplotlib

More articles on Matplotlib

  • How to Create an Empty Figure with Matplotlib in Python?
  • Change the x or y interval of a Matplotlib figure
  • How to add a grid on a figure in Matplotlib?
  • How to change the size of figures drawn with matplotlib?
  • Place plots side by side in Matplotlib
  • How to Reverse Axes in Matplotlib?
  • How to remove the frame from a Matplotlib figure in Python?
  • Use different y-axes on the left and right of a Matplotlib plot
  • How to Add a Y-Axis Label to the Secondary Y-Axis in Matplotlib?
  • How to plot a simple vector field in Matplotlib ?
  • Difference Between cla(), clf() and close() Methods in Matplotlib
  • Make filled polygons between two horizontal curves in Python using Matplotlib
  • How to Save a Plot to a File Using Matplotlib?
  • How to Plot Logarithmic Axes in Matplotlib?
  • How to put the y-axis in logarithmic scale with Matplotlib ?
  • How to draw 2D Heatmap using Matplotlib in python?
  • Plotting Correlation Matrix using Python
  • Plot Candlestick Chart using mplfinance module in Python
  • Autocorrelation plot using Matplotlib
  • Stem and Leaf Plots in Python
  • Python | Basic Gantt chart using Matplotlib

Exercises, Applications, and Projects

  • How to Plot List of X, Y Coordinates in Matplotlib?
  • How to put the origin in the center of the figure with Matplotlib ?
  • How to Draw a Circle Using Matplotlib in Python?
  • How to Plot Mean and Standard Deviation in Pandas?
  • How to plot a complex number in Python using Matplotlib ?
  • 3D Sine Wave Using Matplotlib – Python
  • Plotting A Square Wave Using Matplotlib, Numpy And Scipy
  • How to Make a Square Plot With Equal Axes in Matplotlib?
  • Plotting a Sawtooth Wave using Matplotlib
  • Visualizing Bubble sort using Python
  • Visualization of Merge sort using Matplotlib
  • Visualization of Quick sort using Matplotlib
  • Insertion Sort Visualization using Matplotlib in Python
  • 3D Visualisation of Quick Sort using Matplotlib in Python
  • 3D Visualisation of Merge Sort using Matplotlib
  • 3D Visualisation of Insertion Sort using Matplotlib in Python
  • How to plot a normal distribution with Matplotlib in Python ?
  • Normal Distribution Plot using Numpy and Matplotlib
  • How to Create a Poisson Probability Mass Function Plot in Python?
  • Find all peaks amplitude lies above 0 Using Scipy
  • How to plot ricker curve using SciPy – Python?
  • How to Plot a Confidence Interval in Python?
  • How To Highlight a Time Range in Time Series Plot in Python with Matplotlib?
  • How to Make a Time Series Plot with Rolling Average in Python?
  • Digital Band Pass Butterworth Filter in Python
  • Digital Band Reject Butterworth Filter in Python
  • Digital High Pass Butterworth Filter in Python
  • Digital Low Pass Butterworth Filter in Python
  • Design an IIR Notch Filter to Denoise Signal using Python
  • Design an IIR Bandpass Chebyshev Type-2 Filter using Scipy – Python
  • Visualizing Tiff File Using Matplotlib and GDAL using Python
  • Plotting Various Sounds on Graphs using Python and Matplotlib
  • COVID-19 Data Visualization using matplotlib in Python
  • Analyzing selling price of used cars using Python

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *