首页 > 解决方案 > 灰度颜色 (0-255) 到 MAtplotlib 颜色表示

问题描述

使用 matplotlib 构建一些绘图时,我无法解决这个(看起来很容易)问题。

我将灰度颜色表示为范围内的整数(0-255 - 更高的数字意味着更暗),可以在此示例 df 中简化:

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]
        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 识别以下格式来指定颜色:

  • [0, 1] 中浮点值的 RGB 或 RGBA 元组(例如,(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:sky blue');

  • {'tab:blue', 'tab:orange', 'tab:green', 'tab:red', 'tab:purple', 'tab:brown', 'tab:pink', 'tab:gray' , 'tab:olive', 'tab:cyan'} 它们是来自“T10”分类调色板的 Tableau 颜色(这是默认颜色循环);

  • “CN”颜色规范,即“C”后跟一个数字,这是默认属性循环的索引(matplotlib.rcParams['axes.prop_cycle']);索引在艺术家创建时发生,如果循环不包括颜色,则默认为黑色。

使用这些答案:

我将代码改写为:

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 文档并发现

  • [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

这给了我: 在此处输入图像描述

但我怀疑,这是最好的解决方案。

标签: pythonmatplotlibcolors

解决方案


您可以转换表示 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)))

在所有三种情况下,您都会得到相同的结果。


推荐阅读