Способы задания цвета в Matplotlib

Немного рекламы

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

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

Заодно будет отображаться строка, с помощью которой задается цвет в конкретном примере.

Начнем с самого часто используемого способа задания цвета - с помощью однобуквенной строки. Таких цветов сравнительно немного.

  • 'b' - синий цвет
  • 'g' - зеленый цвет
  • 'r' - красный цвет
  • 'c' - голубой цвет
  • 'm' - пурпурный цвет
  • 'y' - желтый цвет
  • 'k' - черный цвет
  • 'w' - белый цвет

Вот, как выглядит наш пример:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pylab
import matplotlib.patches
import matplotlib.lines
import matplotlib.path


def drawRect(color):
    pylab.xlim(-2, 2)
    pylab.ylim(-2, 2)
    pylab.grid()

    axes = pylab.gca()
    axes.set_aspect("equal")

    rect_back = matplotlib.patches.Rectangle((-0.5, -0.5), 1, 1, color='k')
    rect_front = matplotlib.patches.Rectangle((-1, -1), 2, 2, color=color)

    axes.add_patch(rect_back)
    axes.add_patch(rect_front)

    pylab.text(-1.5, 1.7, u'color = {}'.format(color))
    pylab.show()


if __name__ == "__main__":
    color = 'g'
    drawRect(color)

Внешний вид графика выглядит следующим образом:

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

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

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pylab
import matplotlib.patches
import matplotlib.lines
import matplotlib.path


def drawRect(color):
    pylab.xlim(-2, 2)
    pylab.ylim(-2, 2)
    pylab.grid()

    axes = pylab.gca()
    axes.set_aspect("equal")

    rect_back = matplotlib.patches.Rectangle((-0.5, -0.5), 1, 1, color='k')
    rect_front = matplotlib.patches.Rectangle((-1, -1), 2, 2, color=color)

    axes.add_patch(rect_back)
    axes.add_patch(rect_front)

    pylab.text(-1.5, 1.7, u'color = {}'.format(color))
    pylab.show()


if __name__ == "__main__":

    # Полный список именованных цветов
    # http://matplotlib.org/examples/color/named_colors.html
    color = 'goldenrod'
    drawRect(color)

Результат будет выглядеть следующим образом:

Также цвет можно задавать в формате RGB, как это принято в HTML и CSS, задавая компоненты цвета в 16-ричной системе счисления. Например:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pylab
import matplotlib.patches
import matplotlib.lines
import matplotlib.path


def drawRect(color):
    pylab.xlim(-2, 2)
    pylab.ylim(-2, 2)
    pylab.grid()

    axes = pylab.gca()
    axes.set_aspect("equal")

    rect_back = matplotlib.patches.Rectangle((-0.5, -0.5), 1, 1, color='k')
    rect_front = matplotlib.patches.Rectangle((-1, -1), 2, 2, color=color)

    axes.add_patch(rect_back)
    axes.add_patch(rect_front)

    pylab.text(-1.5, 1.7, u'color = {}'.format(color))
    pylab.show()


if __name__ == "__main__":
    color = '#31D115'
    drawRect(color)

В результате получим:

В сокращенном виде, то есть, например, '#ABC' цвета задавать нельзя.

Еще один способ задания цвета - с помощью кортежа или списка из трех элементов, задающих компоненты R, G и B соответственно. Главная особенность такого способа задания цвета состоит в том, что компоненты цвета должны быть представлены числом с плавающей точкой в диапазоне от 0.0 до 1.0. Например:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pylab
import matplotlib.patches
import matplotlib.lines
import matplotlib.path


def drawRect(color):
    pylab.xlim(-2, 2)
    pylab.ylim(-2, 2)
    pylab.grid()

    axes = pylab.gca()
    axes.set_aspect("equal")

    rect_back = matplotlib.patches.Rectangle((-0.5, -0.5), 1, 1, color='k')
    rect_front = matplotlib.patches.Rectangle((-1, -1), 2, 2, color=color)

    axes.add_patch(rect_back)
    axes.add_patch(rect_front)

    pylab.text(-1.5, 1.7, u'color = {}'.format(color))
    pylab.show()


if __name__ == "__main__":
    color = (0.5, 0.2, 0.3)
    drawRect(color)

Результат будет выглядеть следующим образом:

Если мы к кортежу (или списку), описывающему цвет, добавим четвертый элемент, то он будет обозначать альфа-канал или непрозрачность. Если четвертый элемент равен 1.0, то цвет будет полностью непрозрачным (как будто альфа-канал не задан), а если он равен 0.0, то объект будет полностью прозрачным (невидимым).

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

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pylab
import matplotlib.patches
import matplotlib.lines
import matplotlib.path


def drawRect(color):
    pylab.xlim(-2, 2)
    pylab.ylim(-2, 2)
    pylab.grid()

    axes = pylab.gca()
    axes.set_aspect("equal")

    rect_back = matplotlib.patches.Rectangle((-0.5, -0.5), 1, 1, color='k')
    rect_front = matplotlib.patches.Rectangle((-1, -1), 2, 2, color=color)

    axes.add_patch(rect_back)
    axes.add_patch(rect_front)

    pylab.text(-1.5, 1.7, u'color = {}'.format(color))
    pylab.show()


if __name__ == "__main__":
    color = (0.5, 0.2, 0.3, 0.8)
    drawRect(color)

Результат будет выглядеть следующим образом:

Особый случай задания цвета - это выбор серого цвета различной степени яркости. Как известно, серый цвет - это такой цвет, у которого компоненты R, G и B равны между собой, поэтому для задания серого цвета достаточно задать лишь одно число. В Matplotlib для этого в качестве цвета можно указать число с плавающей точкой в интервале от 0.0 (черный цвет) до 1.0 (белый цвет).

Следующий пример рисует серый квадрат:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pylab
import matplotlib.patches
import matplotlib.lines
import matplotlib.path


def drawRect(color):
    pylab.xlim(-2, 2)
    pylab.ylim(-2, 2)
    pylab.grid()

    axes = pylab.gca()
    axes.set_aspect("equal")

    rect_back = matplotlib.patches.Rectangle((-0.5, -0.5), 1, 1, color='k')
    rect_front = matplotlib.patches.Rectangle((-1, -1), 2, 2, color=color)

    axes.add_patch(rect_back)
    axes.add_patch(rect_front)

    pylab.text(-1.5, 1.7, u'color = {}'.format(color))
    pylab.show()


if __name__ == "__main__":
    color = '0.3'
    drawRect(color)

Подводя итог всему вышесказанному, составим список способов задания цвета в Matplotlib:

  • С помощью однобуквенной строки (например, 'g').
  • С помощью словесного описания цвета (например, 'goldenrod').
  • С помощью указания компонент цвета в формате #RRGGBB (например, '#31D115').
  • С помощью указания компонент цвета в виде кортежа или списка трех чисел в диапазоне 0.0 - 1.0 (например, (0.5, 0.2, 0.3)).
  • С помощью указания компонент цвета и альфа-канала в виде кортежа или списка четырех чисел в диапазоне 0.0 - 1.0 (например, (0.5, 0.2, 0.3, 0.8)).
  • Для задания серого цвета можно использовать число с плавающей точкой в диапазоне 0.0 - 1.0 (например, 0.3).

Другие статьи про Matplotlib

Немного рекламы

Вы можете подписаться на новости сайта через RSS, Группу Вконтакте или Канал в Telegram.
5 stars

Рейтинг 5.0/5. Всего 1 голос(а, ов)




Подписаться на комментарии
Автор:
Тема:
 Ваш комментарий
 
 
Введите код 373