Рубрики
Без рубрики

Как заговор цветной палитра Matplotlib – и выберите цвет сюжета?

В этой статье мы узнаем, как генерировать цветовую палитру MATPLOTLIB, а затем мы будем использовать его, чтобы выбрать определенный цвет для нашего участка. https://youtu.be/bhwarnt22-e при представлении данных, цвет, который вы назначаете на сюжете, очень важно; Плохой выбор цвета может заставить ваши данные трудно понять или даже меньше … Как построить цветовую палитру MatPlotlib – и выберите цвет сюжета? Читать далее “

Автор оригинала: Andrea Ridolfi.

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

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

Решение этой проблемы состоит в том, чтобы проверить цветовую палитру MATPLOTLIB и выберите оттуда, цвет, который наилучшим образом соответствует вашим потребностям. Мы напишем скрипт для генерации цветовой палитры MATPLOTLIB внутри нашего сценария, просто перед тем, как построить наши графики. Таким образом, мы сможем проверить имя цвета, который наиболее подходит для наших потребностей и назначает его второму сюжету. Напишем код для генерации цветовой палитры в качестве функции; Чтобы позволить вам позвонить каждый раз, когда нам нужно определиться с определенным цветом, чтобы назначить участки.

Обзор кода

Мы обсудим следующий код в этом руководстве, простым, чтобы понять, пошаговая манера:

import matplotlib.pyplot as plt
from matplotlib import colors as mcolors
import numpy as np

def sel_color():
    colors = dict(mcolors.BASE_COLORS, **mcolors.CSS4_COLORS)
    
    # sort colors by hue, saturation and value
    by_hsv = sorted((tuple(mcolors.rgb_to_hsv(mcolors.to_rgba(color)[:3])), name)
          for name, color in colors.items())
    sorted_names = [name for hsv, name in by_hsv]

    n = len(sorted_names)
    ncols = 4
    nrows = n // ncols
    
    # Create the matplotlib window
    fig, ax = plt.subplots()
    
    # Get height and width of the figure
    X, Y = fig.get_dpi() * fig.get_size_inches()
    
    # height of a cell
    h = Y / (nrows + 1)
    
    # width of a cell
    w = X / ncols
    
    # using an index for accessing all the color names
    k = 0
    
    # inserting the colors in the palette by column
    for i in range(ncols):
        for j in range(nrows, 0, -1):
            
            # current row
            row = j * h
            
            # current column
            col = i
            
            # height level for the colors' labels
            y = row
            
            # position of the initial corner of the color box
            xi = w * (col + 0.05)
            
            # position of the final corner of the color box
            xf = w * (col + 0.25)
            
            # initial position of the labels
            xi_text = w * (col + 0.3)

            ax.text(xi_text, y, sorted_names[k], fontsize=(h * 0.8),
                    horizontalalignment='left', verticalalignment='center')

            ax.hlines(y, xi, xf, color=sorted_names[k], linewidth=(h * 0.8))
            k += 1

    ax.set_xlim(0, X)
    ax.set_ylim(0, Y)
    ax.set_axis_off()

    fig.subplots_adjust(left=0, right=1,
                        top=1, bottom=0,
                        hspace=0, wspace=0)
    plt.show()
    selected_c = str(input('Enter the name of the color for your graph: '))
    return selected_c


# x and y array to plot
x = np.linspace(0, 50, 100)
y = x**3 + 3*x - 5

# Plotting
current_c = sel_color()
fig = plt.figure()
ax = fig.subplots()
ax.plot(x, y, color=current_c)
plt.show()

Давайте погрузимся в код!

Импорт библиотек и пакетов

Для этого примера нам просто нужно Матпотлиб и Numpy Отказ В дополнение к .pyplot () , который используется для построения, нам также нужен модуль Цвета, Который содержит функции и классы для спецификации и преобразования цвета (вы можете найти полную документацию здесь ), мы тогда называем это « Mocors ». Numpy Используется только для генерации двух случайных массивов, которые затем отображаются, после выбора цвета, который мы выбираем из генерирующей палитры.

import matplotlib.pyplot as plt
from matplotlib import colors as mcolors
import numpy as np

Генерация цветовой палитры MATPLOTLIB

Как предвиделось, во введении, цель этого раздела состоит в том, чтобы генерировать цветовую палитру MATPLOTLIB и отображать его в окне MATPLOTLIB. Для тех, кто не знаком с цветовыми палитрами, которые можно использовать в Python, на фиг.1 показан цветовой палитра MATPLOTLIB, которую мы хотим воссоздать в нашем сценарии.

Рисунок 1: Цветовая палитра, содержащая все имена цветов, которые можно использовать в окне MATPLOTLIB.

Определение функции и сортировка цветов по их значениям

Как предполагается, во введении, мы пишем этот скрипт как функцию, это позволит нам использовать функцию для генерации цветовой палитры, каждый раз, когда нам это нужно, также в других сценариях. Начнем, позвонив функцию «SEL_COL ()»; После этого первое, что мы собираемся сделать в организме функции, состоит в том, чтобы создать словарь, который содержит, все название цветов (базовые и цвета CSS) и кортеж или шестнадцатеричные коды, которые однозначно Опишите определенный цвет, как ключ: пары значений; Мы назначаем словарь переменным «цвета».

def sel_color():
  colors = dict(mcolors.BASE_COLORS, **mcolors.CSS4_COLORS)

Как вы можете увидеть, печатая переменные «цвета», основные цвета определяются кортежом из 3 значений, в то время как другие цвета представлены шестнадцатеричным кодом. Чтобы принять равномерную номенклатуру для описания каждого цвета, мы сначала преобразуем это представление на RGBA (RGBA – это возможный способ описания цвета с 4 числами, первые три соответствует количеству красного, зеленого и синего цвета , четвертый означает интенсивность) представление, а затем к шестнадцатеричному. Первый шаг можно сделать, используя функцию mcolors.to_rgba () , который принимает в качестве ввода массива, содержащий весь кортеж, представляющий разные цвета; Вместо этого шага можно сделать с помощью функции mcolors.rgb_to_hsv (), которые принимают в качестве ввода кортежей, соответствующие rgb описания цветов (мы выбираем только первые три значения, поскольку мы не хотим применять какие-либо изменения на интенсивность, что, кроме того, не предусмотрено в цветовом коде RGB) и преобразует его В формате HSV, который означает насыщенность оттенка и ценности (или яркость). Мы храним каждую комбинацию HSV чисел в кортеж вместе с соответствующим именем цвета и, используя понимание списка, мы расширяем эту процедуру всем цветам, перечисленным в Цвета И, следовательно, генерируют список этих кортежей. Поскольку цвета – это словарь, для доступа к своим ключам и значениям мы пишем: Для имени, цвет в цветах. Итоги ; Таким образом, переменные «имя» и «цвет» относятся к ключевым словарам и значениям словаря соответственно. Чтобы заключить, мы сортируем список, используя функцию Сортировано (), Прохождение в качестве ввода всего списка и храним все кортежи HSV цвета в переменной «by_hsv». Следующие строки кода отображают все вышеупомянутые процедуры.

  by_hsv = sorted((tuple(mcolors.rgb_to_hsv(mcolors.to_rgba(color)[:3])), name)
                  for name, color in colors.items())

Если мы сейчас распечатаем переменную «by_hsv», мы видим, что все цвета были отсортированы по их значениям HSV, от самого низкого до самого высокого. Завершаем этот раздел, создав список, содержащий все имена цветов; Для этого мы используем снова список пометков, и мы храним в списке «Сортировка_Names» только имя цветов, присутствующих в корза списка «BY_HSV».

  sorted_names = [name for hsv, name in by_hsv]

Создание цветовой палитры

На данный момент мы должны создать палитру, которая будет отображаться в окне matplotlib. Начнем с определения количества строк и столбцов. Как вы можете увидеть с рисунка 1, мы хотим иметь четыре колонны; Количество строк определяется соотношением между общем количеством цветов (равных длине списка «Сортировка_Names») и количества столбцов.

  n = len(sorted_names)
  ncols = 4
  nrows = n // ncols

На данный момент мы создаем окно MATPLOTLIB, используя функцию matplotlib подломы ().

  # Create the matplotlib window
  fig, ax = plt.subplots()

Как видно из рисунка 1, цвета появляются в сетке, подобной сетке, которая равномерно занимает все окно. Для этого мы должны извлечь размер нашего окна и, таким образом, определить размер, который должен занимать каждую цветную коробку и ее соответствующую метку. Чтобы получить высоту и ширину рисунка, мы объединяем вместе методы .get_dpi (), который возвращает разрешение в точках на дюйм как номер поплавка, с .get_size_inches () , который возвращает размер рисунка в дюймах (вы можете найти документацию на этих двух методах по следующим ссылкам: https://www.geeksforgeeks.org/matplotlib-figure-figure-get_dpi-in-python/ https://www.geeksforgeeks.org/matplotlib-figure-figure-get_size_inches-in-python/ ); Умножая их вместе, мы, следовательно, получаем размер фигуры в точках. Мы назначаем ширину и значения высоты в переменные «X» и «Y». После этого мы рассчитываем высоту и ширину каждой строки и столбца («H» и «W», соответственно) путем разделения «y» и «X» для общего количества строк и столбцов (обратите внимание, что для «H», Мы разделим Y для «NROW +1», это делается только для получения небольшого количества места на верхних и нижних углах окна).

  X, Y = fig.get_dpi() * fig.get_size_inches()
  # height of a cell
  h = Y / (nrows + 1)
  # width of a cell
  w = X / ncols

Вставка цветных коробок в палитре

Положение и размер цветных коробок и ярлыков

Теперь, когда мы рассчитали высоту и ширину «клетки» нашей палитры, мы можем продолжить дальше, вставив в каждую позицию цветных коробок и их соответствующие имена. Перед доступом к клеткам, в которых рисунок «разделен» (фактически, фигура не разделена на клетки, это просто способ думать об этом, каждая ячейка соответствует цветной коробке плюс его метку), мы определяем параметр, «K», который будет использоваться позже, для индексации имен цветов в списке «Сортировать_ имени».

  # using an index for accessing all the color names
  k = 0

На данный момент мы можем получить доступ к каждой позиции рисунка и создать все цветные коробки. Для этого мы используем два вложенных для петлей Это позволит нам вставить каждый цвет в его позицию. Мы начинаем с первого заполнения первой колонны, затем мы продолжим во второй и так до четвертого. Первый для петли Относится к колоннам и произойдет во всей их все (указываем это, давая в качестве конечного значения «NCols», что равно четыре). С другой стороны, вложенные для петли несет ответственность за строки; Поскольку мы хотим начать создавать наши коробки из верхнего угла, это для петли Имеет итерацию в обращенном порядке, таким образом, первый индекс будет соответствовать последнему строке (указанному по значению «nrows»), и окончательный индекс будет 0, который идентифицирует строку в нижней части рисунка. В течение этого второго Для петли Мы сначала определяем два параметра: «ряд» и «COL», которые определяют строку и колонну, на которой мы работаем, соответственно. Как видите, «Col» равен индексу внешнего для петли Хотя «ряд» определяется путем умножения высоты одной ячейки, «H», по индексу внутреннего для петли (который итерация через все строки). Параметр «ряд» также будет отвечать за уровень высоты меток цветов.

  # inserting the colors in the palette by column
  for i in range(ncols):
      for j in range(nrows, 0, -1):
          # current row
          row = j * h
          # current column
          col = i
          # height level for the colors' labels
          y = row

Теперь, когда мы можем получить доступ к каждой позиции фигуры в правильном порядке, мы начинаем создавать цветные коробки. Первое, что нужно сделать, это указать размер коробок, мы делаем это, определяя начальную и окончательную горизонтальную координату коробок, мы называем их «xi» и «XF», соответственно. Как вы можете видеть в коде ниже, «XI» определяется шириной ячейки, умножена на текущую позицию столбца («COL»), к которой мы также добавляем небольшое смещение (0,05); Для «XF» процедура аналогична, его позиция имеет просто другое смещение, 0,25 вместо 0,05; Из этого вы можете четко понимать, что ширина наших ящиков будет 0,20. Исходное положение меток, «XI_TEXT» определяется таким же образом, просто с другим смещением, на этот раз 0,3.

         # position of the initial line of the colored square
         xi = w * (col + 0.05)
         # position of the final line of the colored square
         xf = w * (col + 0.25) 
         # initial position of the text
         xi_text = w * (col + 0.3)

Как только мы определили начальную и конечную позицию краев коробок и текстовых меток, мы можем наконец-то создать их. Чтобы генерировать этикетки, мы используем функцию AX.Text () , что генерирует некоторые оси, в которых мы можем вставить текст. Мы должны указать, как входной параметр, горизонтальное и вертикальное положение («XI_TEXT» и «Y», соответственно), метка (SORTED_NAMES [K]). Мы также можем указать некоторые другие менее важные и необязательные параметры, такие как размер шрифта и положение меток по отношению к начальным координатам.

Свойства цветных коробок и их ярлыки

       ax.text(xi_text, y, sorted_names[k], fontsize=(h * 0.8),
               horizontalalignment='left', verticalalignment='center')

Чтобы создать ящики, мы используем функцию AX.HLINES (), который генерирует горизонтальную линию; На этот раз мы впервые указываем вертикальную координату «Y», затем начальную и конечную точку линии «XI» и «XF» соответственно; Мы также указываем цвет линии, доступа к имени цветов (с использованием «сортировщиков_Намок [k]»), а ширина линии, которая соответствует высоте коробки (̴ 80% высоты клеток). Закончим это для петли увеличивая значение индекса «К»; Таким образом, в следующем итерации мы изменим строку и, следовательно, мы будем решать следующее имя цвета в списке «Сортировка_Names».

       ax.hlines(y, xi, xf,
                 color=sorted_names[k], linewidth=(h * 0.8))
       k += 1

Мы почти закончили с нашей функцией sel_color (), Мы просто заключаем, указав некоторые детали относительно размера осей в окне MATPLOTLIB и путем отключения их видимости. Мы также регулируем положение фигуры в пределах Матплотлиб окно. В конце мы показываем созданную палитру и спросите (с помощью оператора Print ) выбрать имя цвета в палитре. Функция вернет напечатанное имя цвета, сохраненное в переменной «Выбрать_c».

  ax.set_xlim(0, X)
  ax.set_ylim(0, Y)
  ax.set_axis_off()

  fig.subplots_adjust(left=0, right=1,
                      top=1, bottom=0,
                      hspace=0, wspace=0)
  plt.show()
  selected_c = str(input('Enter the name of the color for your graph: '))
  return selected_c

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

Рисунок 2: Цветовая палитра, созданная в рамках функции sel_color () И отображение всех цветов, доступных в MatPlotlib. Как видите, некоторые цвета повторяются, но это только потому, что они могут быть адресованы, набрав разные имена.

Построение графика с только что выбранным цветом

После завершения sel_color () Функция, мы создаем два массива «x» и «Y», и мы построим их в другом окне MatPlotlib; Однако, прежде чем делать это, мы называем функцию sel_color () И назначить его возвращаемое значение (имя цвета, которое мы выбрали и набрали в терминале, я набрал «OliveRab» в качестве примера) к переменной «Current_C», которая будет вставлена как значение параметра Цвет, в пределах AX.PLOT () функция. Окончательный результат показан на рисунке 3, то есть сюжет, который имеет цвет, который мы выбрали после проверки только что созданной цветовой палитры.

Рисунок 3: Массивы «X» и «Y» нанесены с цветом, который мы выбрали из палитра на фиг.2.

Выводы

В этой статье мы определили функцию создания и отображения цветовой палитры MATPLOTLIB; Сначала мы определили размер палитры, его ряды и колонн; Затем мы рассчитали размер каждой ячейки и доступа к их позиции (используя два вложенных для петлей ) Мы создали цветные коробки и их этикетки. Наконец, мы ввели в терминал имя цвета, который мы выбрали и назвали функцию, чтобы назначить этот удельный цвет на сюжету, который мы хотели построить.