Способы задания цвета в Matplotlib
При рисовании графиков с помощью Matplotlib часто приходится задавать цвета: для кривых, геометрических фигур и стрелок, текста и т.д. В Matplotlib существует несколько способов для указания цветов. В зависимости от задачи, вы можете выбрать наиболее удобный в данном случае.
В этой статье мы будем использовать пример, в котором будут рисоваться два квадрата - один будет накрыт другим, поэтому нижний квадрат будет виден только в том случае, если цвет верхнего содержит альфа-канал, задающий степень прозрачности. Нижний квадрат для простоты всегда будет отображаться черным цветом.
Заодно будет отображаться строка, с помощью которой задается цвет в конкретном примере.
Начнем с самого часто используемого способа задания цвета - с помощью однобуквенной строки. Таких цветов сравнительно немного.
- 'b' - синий цвет
- 'g' - зеленый цвет
- 'r' - красный цвет
- 'c' - голубой цвет
- 'm' - пурпурный цвет
- 'y' - желтый цвет
- 'k' - черный цвет
- 'w' - белый цвет
Вот, как выглядит наш пример:
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 есть возможность задания цвета с помощью строки, описывающей цвет полным английским словом. Таких именованных цветов намного больше, чем однобуквенных именованных цветов. В документации есть хороший пример, генерирующий таблицу со всеми существующими именованными цветами. Ниже приведена картинка, полученная с помощью этого примера из документации.
А мы воспользуемся одним из этих цветов и изменим наш предыдущий пример:
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-ричной системе счисления. Например:
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 - это полностью прозрачный цвет, и объект станет невидимым. Пример с альфа-каналом показан ниже. Наконец-то мы увидим нижний квадрат, который в предыдущих примерах был скрыт.
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". Это показано в следующем примере. В сокращенном виде значение альфа-канала задавать нельзя.
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. Например:
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.
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 (белый цвет).
Следующий пример рисует серый квадрат:
# -*- 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:имя_цвета'. Например, как показано далее:
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').
Вы можете подписаться на новости сайта через RSS, Группу Вконтакте или Канал в Telegram.