Я не могу решить эту (что кажется простым) проблему при использовании 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
Но результат: 
Что приводит меня к шагу 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
И это дало мне: 
Но я сомневаюсь, что это лучшее решение.