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

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

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

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

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

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

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

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

# -*- coding: utf-8 -*-

import matplotlib.lines
import matplotlib.patches
import matplotlib.path
import matplotlib.pyplot as plt


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

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

    # Создадим "нижний" прямоугольник
    rect_back = matplotlib.patches.Rectangle((-1.0, -1.0), 2, 2, color='k')

    # Создадим чуть больший прямоугольник поверх предыдущего
    # С цветом этого прямоугольника мы будем экспериментировать
    rect_front = matplotlib.patches.Rectangle((-1.5, -1.5), 3, 3, color=color)

    # Добавим прямоугольники на график
    axes.add_patch(rect_back)
    axes.add_patch(rect_front)

    # Добавим заголовок с обозначением цвета
    plt.title('color = {}'.format(color))
    plt.show()


if __name__ == "__main__":
    # Цвет большого прямоугольника на графике
    color = 'g'
    drawRect(color)

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

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

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

# -*- coding: utf-8 -*-

import matplotlib.lines
import matplotlib.patches
import matplotlib.path
import matplotlib.pyplot as plt


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

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

    rect_back = matplotlib.patches.Rectangle((-1.0, -1.0), 2, 2, color='k')
    rect_front = matplotlib.patches.Rectangle((-1.5, -1.5), 3, 3, color=color)

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

    plt.title('color = {}'.format(color))
    plt.show()


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

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

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

# -*- coding: utf-8 -*-

import matplotlib.lines
import matplotlib.patches
import matplotlib.path
import matplotlib.pyplot as plt


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

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

    rect_back = matplotlib.patches.Rectangle((-1.0, -1.0), 2, 2, color='k')
    rect_front = matplotlib.patches.Rectangle((-1.5, -1.5), 3, 3, color=color)

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

    plt.title('color = {}'.format(color))
    plt.show()


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

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

Используя подобный этот формат ("#RRGGBBAA") можно задать также альфа-канал (непрозрачность цвета). То есть, если в конце строки (16-ричные числа AA) стоит FF - это абсолютно не прозрачный цвет (как будто бы альфа-канал не указан), а если 00 - это полностью прозрачный цвет, и объект станет невидимым. Пример с альфа-каналом показан ниже. Наконец-то мы увидим нижний квадрат, который в предыдущих примерах был скрыт.

# -*- coding: utf-8 -*-

import matplotlib.lines
import matplotlib.patches
import matplotlib.path
import matplotlib.pyplot as plt


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

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

    rect_back = matplotlib.patches.Rectangle((-1.0, -1.0), 2, 2, color='k')
    rect_front = matplotlib.patches.Rectangle((-1.5, -1.5), 3, 3, color=color)

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

    plt.title('color = {}'.format(color))
    plt.show()


if __name__ == "__main__":
    # !!!
    color = '#33DD11AA'
    drawRect(color)

Так же, как и в HTML/CSS, цвет можно задавать в сокращенном виде (в формате "#RGB"), то есть вместо "#AAFF55" можно написать "#AF5". Это показано в следующем примере. В сокращенном виде значение альфа-канала задавать нельзя.

# -*- coding: utf-8 -*-

import matplotlib.lines
import matplotlib.patches
import matplotlib.path
import matplotlib.pyplot as plt


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

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

    rect_back = matplotlib.patches.Rectangle((-1.0, -1.0), 2, 2, color='k')
    rect_front = matplotlib.patches.Rectangle((-1.5, -1.5), 3, 3, color=color)

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

    plt.title('color = {}'.format(color))
    plt.show()


if __name__ == "__main__":
    # !!!
    color = '#AF5'
    drawRect(color)

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

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

# -*- coding: utf-8 -*-

import matplotlib.lines
import matplotlib.patches
import matplotlib.path
import matplotlib.pyplot as plt


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

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

    rect_back = matplotlib.patches.Rectangle((-1.0, -1.0), 2, 2, color='k')
    rect_front = matplotlib.patches.Rectangle((-1.5, -1.5), 3, 3, color=color)

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

    plt.title('color = {}'.format(color))
    plt.show()


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

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

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

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

# -*- coding: utf-8 -*-

import matplotlib.lines
import matplotlib.patches
import matplotlib.path
import matplotlib.pyplot as plt


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

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

    rect_back = matplotlib.patches.Rectangle((-1.0, -1.0), 2, 2, color='k')
    rect_front = matplotlib.patches.Rectangle((-1.5, -1.5), 3, 3, color=color)

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

    plt.title('color = {}'.format(color))
    plt.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 можно выбирать цвет из таблицы цветов сайта xkcd. Для этого строка, описывающая цвет должна иметь формат 'xkcd:имя_цвета'. Например, как показано далее:

# -*- coding: utf-8 -*-

import matplotlib.lines
import matplotlib.patches
import matplotlib.path
import matplotlib.pyplot as plt


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

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

    rect_back = matplotlib.patches.Rectangle((-1.0, -1.0), 2, 2, color='k')
    rect_front = matplotlib.patches.Rectangle((-1.5, -1.5), 3, 3, color=color)

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

    plt.title('color = {}'.format(color))
    plt.show()


if __name__ == "__main__":
    # !!!
    color = 'xkcd:moss green'
    drawRect(color)

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

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

  • С помощью однобуквенной строки (например, 'g').
  • С помощью словесного описания цвета (например, 'goldenrod').
  • С помощью словесного описания цвета из таблицы xkcd (например, 'xkcd:moss green')
  • С помощью указания компонент цвета в формате #RRGGBB (например, '#31D115').
  • С помощью указания компонент цвета в формате #RGB (например, '#AF5').
  • С помощью указания компонент цвета в виде кортежа или списка трех чисел в диапазоне 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.
4.5 stars

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



 11.02.2024 - 16:22


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