gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:03:20 25 4
gpt4 key购买 nike

我有一个 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

我想使用 pyplot.imshow() 来绘制它,并指定以下颜色图:

color_dict = {
"A": "#DA291E",
"B": "#83DF39",
"C": "#E8132d",
"D": "#008933",
"E": "#006CB3",
"F": "#52BFEC"
}

如果我正在绘制 barscatter,我可以使用参数color=a_list_of_colors 进行调用,但这不适用于imshow()

相反,我需要使用 cmap 进行调用,但据我了解,不可能创建将特定颜色映射到值的 cmap。

这意味着我需要创建一个像这样的颜色图:

    from matplotlib.colors import ListedColormap 

_colors = ["#DA291E", "DA291E", "DA291E", "DA291E"
"#83DF39", "#83DF39", "#83DF39", "#83DF39", "#83DF39", #...and so on]
cmap = ListedColormap(_colors, name="custom_cmap")

但是有更好的方法来解决这个问题吗?

<小时/>

我以为我可以实现上述方法,但由于某种原因它不起作用,我似乎无法弄清楚为什么。

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

color_list = list(series.map(color_dict))
custom_cmap = ListedColormap(color_list, name="custom_cmap")

系列基本上是这样的:

A
A
A
A
B
B
B
B
B
C
#...and so on

我的df中的第五个元素是B,当我打印custom_cmap.__dict__.colors[4]时,我得到# 83DF39 与我的 df 中的字符串值 B 相对应。所以映射是正确的。

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

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

上面的 df 包含 18 个值,color_list 也包含 18 个值。 df 中的最后一个值是 F,这意味着 color_list 中的最后一个颜色应为 #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')

上面的结果如下图所示。

enter image description here

  • 请注意,此图片中的数据与原始帖子中的 df 中的数据不同。
<小时/>

我测试了不同的color_dict:

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.02.06.07.0 和一些 8.0 得到颜色为红色。

最佳答案

如果建议的代码不能自行运行,则很难看出它在哪里出了问题。

下面将创建一个将字母映射到数字的字典并将其应用于数据帧。然后,它将创建一个颜色图,其中包含与数据框中(可能的)值一样多的颜色。然后,当颜色图在零和颜色图中的元素数量之间标准化时,使用 imshow 进行绘图可以正常工作。 (如果并非所有可能的值实际上都出现在要绘制的特定数据框中,例如在字母 A 和 H 丢失的情况下,这种标准化可能很有用。)

import numpy as np; np.random.seed(42)
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap


df = pd.DataFrame(np.random.choice(list("ABCDEFGH"), size=(8,8)))
print(df)

#mapping from letters to numbers
letter2num = dict(zip(list("ABCDEFGH"), np.arange(8)))
df2 = pd.DataFrame(np.array( [letter2num[i] for i in df.values.flat] ).reshape(df.shape))


#produce colormap with as many colors as there are unique values in df
colors = ["pink", "red", "violet", "blue",
"turquoise", "limegreen", "gold", "brown"] # use hex colors here, if desired.
cmap = ListedColormap(colors)

fig, ax = plt.subplots()
ax.imshow(df2.values, vmin=0, vmax=len(cmap.colors), cmap=cmap)


for i in range(len(df2)):
for j in range(len(df2.columns)):
ax.text(j,i, df.values[i,j], ha="center", va="center")
plt.show()

enter image description here

关于python - 将特定字符串值映射到 matplotlib.pyplot.imshow() 中的特定颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52284019/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com