我有一个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"
}
如果我正在绘制一个bar
或一个scatter
,我可以用参数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 = list(series.map(color_dict))
custom_cmap = ListedColormap(color_list, name="custom_cmap")
长series
基本上如下所示:
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个值,颜色列表也包含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')
上面的结果如下图所示
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.0
、2.0
、6.0
、7.0
和一些8.0
获得红色
如果提议的代码本身不可运行,就很难看出哪里出了问题
下面将创建一个将字母映射到数字的字典,并将其应用于数据帧。然后,它将创建一个包含尽可能多的颜色的colormap,因为数据框中有(可能的)值。然后,当colormap在0和colormap中的元素数之间进行规格化时,使用imshow进行打印效果良好。(如果并非所有可能的值都实际出现在要绘制的特定数据帧中,例如在缺少字母A和H的情况下,此规范化可能非常有用。)
相关问题 更多 >
编程相关推荐