Python 将特定字符串值映射到matplotlib.pyplot.imshow()中的特定颜色

Python 将特定字符串值映射到matplotlib.pyplot.imshow()中的特定颜色,python,matplotlib,Python,Matplotlib,我有一个看起来像这样的pandas.dataframe: columns 0 1 2 3 4 5 A A A A B B B B B C C D D D E E F F from matplotlib.colors import ListedColormap _colors = ["#DA291E", "DA291E

我有一个看起来像这样的
pandas.dataframe

columns    0    1   2   3   4   5
           A    A   A   A   B   B
           B    B   B   C   C   D
           D    D   E   E   F   F
    from matplotlib.colors import ListedColormap 

    _colors = ["#DA291E", "DA291E", "DA291E", "DA291E" 
               "#83DF39", "#83DF39", "#83DF39", "#83DF39", "#83DF39", #...and so on]
    cmap = ListedColormap(_colors, name="custom_cmap")
A
A
A
A
B
B
B
B
B
C
#...and so on
我想使用
pyplot.imshow()
,指定以下颜色映射来绘制此图:

color_dict = {
    "A": "#DA291E",
    "B": "#83DF39",
    "C": "#E8132d",
    "D": "#008933",
    "E": "#006CB3",
    "F": "#52BFEC"
}
color_list = list(series.map(color_dict))
custom_cmap = ListedColormap(color_list, name="custom_cmap")
如果我正在绘制一个
条形图
或一个
散点图
,我可以用参数
color=a\u列表\u颜色
调用,但这不适用于
imshow()

相反,我需要调用
cmap
,但据我所知,不可能创建将特定颜色映射到值的cmap

这意味着我需要创建如下颜色贴图:

columns    0    1   2   3   4   5
           A    A   A   A   B   B
           B    B   B   C   C   D
           D    D   E   E   F   F
    from matplotlib.colors import ListedColormap 

    _colors = ["#DA291E", "DA291E", "DA291E", "DA291E" 
               "#83DF39", "#83DF39", "#83DF39", "#83DF39", "#83DF39", #...and so on]
    cmap = ListedColormap(_colors, name="custom_cmap")
A
A
A
A
B
B
B
B
B
C
#...and so on
但是有没有更好的办法呢


我原以为我可以实现上述方法,但由于某种原因,它不起作用,我似乎不明白为什么

我首先根据上面我的
df
的长
系列
版本创建一个颜色列表,然后将该列表转换为颜色映射:

color_dict = {
    "A": "#DA291E",
    "B": "#83DF39",
    "C": "#E8132d",
    "D": "#008933",
    "E": "#006CB3",
    "F": "#52BFEC"
}
color_list = list(series.map(color_dict))
custom_cmap = ListedColormap(color_list, name="custom_cmap")
系列
基本上如下所示:

columns    0    1   2   3   4   5
           A    A   A   A   B   B
           B    B   B   C   C   D
           D    D   E   E   F   F
    from matplotlib.colors import ListedColormap 

    _colors = ["#DA291E", "DA291E", "DA291E", "DA291E" 
               "#83DF39", "#83DF39", "#83DF39", "#83DF39", "#83DF39", #...and so on]
    cmap = ListedColormap(_colors, name="custom_cmap")
A
A
A
A
B
B
B
B
B
C
#...and so on
我的
df
中的第五个元素是
B
,当我打印
custom\u cmap.\uu dict\uuuu.colors[4]
时,我得到了
83DF39
,它与我的
df
中的字符串值
B
相对应。因此,映射是正确的

当我使用
cmap=custom\u cmap
调用
plt.imshow()
时会出现问题,因为它不遵循
cmap
-某些值的颜色错误

我的第一个想法是我弄乱了顺序,这意味着
color\u list
没有遵循
df
的顺序,但它确实遵循了顺序

上面的
df
包含18个值,颜色列表也包含18个值。
df
中的最后一个值是
F
,这意味着
color\u列表中的最后一个颜色应该是
#52BFEC
,它是


添加更多代码

# Begin by converting strings to any number since plt.imshow() needs numbers
float_dict = {
    'A': 0.0,
    'B': 1.0,
    'C': 2.0,
    'D': 3.0,
    'E': 4.0,
    'F': 5.0,
    'G': 6.0,
    'H': 7.0,
    'I': 8.0
}

converted_series = series.map(float_dict).copy()

# Map each float to a specific color
color_dict = {
    0.0: '#DA291E',
    1.0: '#E7112d',
    2.0: '#83CD39',
    3.0: '#009934',
    4.0: '#007AB3',
    5.0: '#54BDEC',
    6.0: '#000066',
    7.0: '#DDDD11',
    8.0: '#572B84',
}

# Create a cmap from a color list
color_list = list(converted_series.map(color_dict))
custom_cmap = ListedColormap(color_list, name="custom_cmap")

# Widen the series into a df
df = series_to_wide_df(converted_series, n_columns=8)

# Plot it
plt.imshow(df, cmap=custom_cmap, interpolation='none')
上面的结果如下图所示

  • 请注意,此图像中的数据与原始帖子中的
    df
    中的数据不同

我测试了一种不同的颜色:

color_dict = {
    0.0: '#FF0000',
    1.0: '#FF0000',
    2.0: '#FF0000',
    3.0: '#FF0000',
    4.0: '#FF0000',
    5.0: '#000000',
    6.0: '#000000',
    7.0: '#000000',
    8.0: '#000000'
}

但是颜色仍然没有正确映射。有了这些颜色,
1.0
2.0
6.0
7.0
和一些
8.0
就变成了红色。

如果建议的代码不能够自己运行,就很难看出哪里出了问题

下面将创建一个将字母映射到数字的字典,并将其应用于数据帧。然后,它将创建一个包含尽可能多的颜色的colormap,因为数据框中有(可能的)值。然后,当colormap在0和colormap中的元素数之间进行规格化时,使用imshow进行打印效果良好。(如果并非所有可能的值都实际出现在要绘制的特定数据帧中,例如在缺少字母A和H的情况下,此规范化可能非常有用。)


可能重复“否”,这似乎正是解决问题的方法。您是否需要进一步的实施帮助,或者这很清楚,您只是想寻求可能的替代方案?@AlexanderMcFarlane-我不认为这是重复的,因为这个问题涉及将一个值设置为特定颜色,这涉及使用自定义颜色映射将多个值映射到特定颜色。@ImportanceOfBeingErnest-实现很清楚,我只是想询问可能的替代方案。习惯是什么?自己回答问题还是删除它?另一种方法是将颜色转换为rgb元组,并从这些元组构建一个3通道图像。我确实认为colormap方法更好。另外,我不相信上面的链接真的是重复的。因此,如果您愿意,您可以回答这个问题,因为此方法的完整代码可能对其他人有用。所以我不能像我想的那样使用
ListedColormap()
来创建
颜色的“序列”。这解决了一切。对于上面的数据,我基本上是这样做的:
color\u list=list(np.array([number2color[I]代表df2.values.flat中的I])
其中
letter2color
是一个
dict
,其中每个
键(本例中的数字)都有一个颜色。然后我使用了
ListedColormap(颜色列表)