Цвет шкалы серого (0-255) для представления цветов MAtplotlib - PullRequest
0 голосов
/ 21 мая 2018

Я не могу решить эту (что кажется простым) проблему при использовании matplotlib для построения некоторых графиков.

У меня есть цвета шкалы серого, представленные в виде целых чисел в диапазоне (0-255 - более высокие числа означают более темные), которые можно упростить в этом примере.измените фон графика с помощью следующих цветов:

fig, ax = plt.subplots(3, 3, figsize=(10, 10), sharey='row', sharex='col')
fig.subplots_adjust(hspace=0, wspace=0)

column = 0
for i in range(3):
    for j in range(3):
        color = colors.iloc[0, column]
        print(f'{i}, {j}: {color}')

        # here I used (0.15, 0.16, 0.17) as example. 
        #But I want to have variable "color" converted into readable color by set_facecolor
        ax[i, j].set_facecolor((0.15, 0.16, 0.17))

        column += 1

с помощью matplotlib документация Я могу сделать это только в следующих форматах:

Matplotlib распознает следующие форматы для определения цвета:

  • кортеж RGB или RGBA значений с плавающей точкой в ​​[0, 1] (например, (0,1, 0,2, 0,5) или(0,1, 0,2, 0,5, 0,3));

  • шестнадцатеричная строка RGB или RGBA (например, '# 0F0F0F' или '# 0F0F0F0F');

  • строковое представление значения с плавающей запятой в [0, 1] включительно для уровня серого (например, '0.5');один из {'b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'};

  • имя цвета X11 / CSS4;

  • имя из цветового опроса xkcd;с префиксом «xkcd:» (например, «xkcd: небесно-голубой»);

  • один из {'tab: blue', 'tab: orange', 'tab: green', 'tab: red', 'tab: purple', 'tab: brown', «tab: pink», «tab: grey», «tab: olive», «tab: cyan»}, которые представляют собой цвета таблиц из категориальной палитры «T10» (которая является цветовым циклом по умолчанию);

  • спецификация цвета «CN», то есть «C», за которой следует одна цифра, которая является индексом в цикле свойств по умолчанию (matplotlib.rcParams ['axes.prop_cycle']);индексирование происходит во время создания художника и по умолчанию становится черным, если цикл не включает цвет.

Используя эти ответы SO:

Iпреобразовал переписал мой код в:

def rgb_int2tuple(rgbint):
    return (rgbint // 256 // 256 % 256, rgbint // 256 % 256, rgbint % 256)


colors = pd.DataFrame({'color1': [15], 'color2': [27], 'color3': [89], 'color4': [123],
                       'color5': [220], 'color6': [100], 'color7': [123], 'color8': [247], 'color9': [255]})

fig, ax = plt.subplots(3, 3, figsize=(10, 10), sharey='row', sharex='col')
fig.subplots_adjust(hspace=0, wspace=0)

column = 0
for i in range(3):
    for j in range(3):
        color = colors.iloc[0, column]
        color = 255 - color
        Blue, Green, Red = rgb_int2tuple(color)
        print(f'{i}, {j}: {color}\t{Blue}{Green}{Red}')
        ax[i, j].set_facecolor((Blue/255, Green/255, Red/255))

        column += 1

Но результат: enter image description here

Что приводит меня к шагу 1, как дать Python знать, что мой 0-Шкала 255 серого цвета.

[РЕДАКТИРОВАТЬ]:

Я снова прочитал документацию по matplotlib.colors и обнаружил

  • aстроковое представление значения с плавающей запятой в [0, 1] включительно для уровня серого (например, '0.5');

, используя это:

Я переписал свой код в:

colors = pd.DataFrame({'color1': [15], 'color2': [27], 'color3': [89], 'color4': [123],
                       'color5': [220], 'color6': [100], 'color7': [123], 'color8': [247], 'color9': [255]})

fig, ax = plt.subplots(3, 3, figsize=(10, 10), sharey='row', sharex='col')
fig.subplots_adjust(hspace=0, wspace=0)

column = 0
for i in range(3):
    for j in range(3):
        color = colors.iloc[0, column]
        color = 255 - color
        color = color / 255
        ax[i, j].set_facecolor(str(color))

        column += 1

И это дало мне: enter image description here

Но я сомневаюсь, что это лучшее решение.

1 Ответ

0 голосов
/ 21 мая 2018

Вы можете преобразовать номер строки, который обозначает уровень серого между 0 и 1.

import pandas as pd
import matplotlib.pyplot as plt

colors = pd.DataFrame({'color1': [15], 'color2': [27], 'color3': [89], 'color4': [123],
                       'color5': [220], 'color6': [100], 'color7': [123], 'color8': [247], 'color9': [255]})

fig, axes = plt.subplots(3, 3, figsize=(10, 10), sharey='row', sharex='col')
fig.subplots_adjust(hspace=0, wspace=0)

for ax, c in zip(axes.flat, colors.T[0].values):
    ax.set_facecolor(str(c/255.))

plt.show()

Или вы можете преобразовать его в кортеж RGB, где каждый канал имеет одинаковое значение

for ax, c in zip(axes.flat, colors.T[0].values):
    ax.set_facecolor((c/255.,c/255.,c/255.))

Наконец, вы можете использовать цветовую карту и нормализацию как

norm = plt.Normalize(0,255)
cmap = plt.get_cmap("gray")
for ax, c in zip(axes.flat, colors.T[0].values):
    ax.set_facecolor(cmap(norm(c)))

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...