Python绘图:来自数据框的热图,如果是字符串,则使用固定颜色

时间:2016-10-14 17:19:19

标签: python pandas matplotlib dataframe heatmap

我试图将Python中的大型(pandas)数据框可视化为热图。此数据框有两种类型的变量:字符串("缺席"或"未知")和浮点数。

我希望热图显示的单元格为" Absent"黑色和"未知"红色,数据帧的其余部分作为普通热图,浮点数为绿色。

我可以使用条件格式化单元格在Excel中轻松完成此操作,但我无法通过matplotlib,seaborn,ggplot在线找到任何帮助。我错过了什么?

感谢您的时间。

1 个答案:

答案 0 :(得分:2)

您可以使用cmap_custom.set_under('red')cmap_custom.set_over('black')将自定义颜色应用于低于及高于vminvmax的值(请参阅12 ):

import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.axes_grid1 as axes_grid1
import pandas as pd

# make a random DataFrame
np.random.seed(1)
arr = np.random.choice(['Absent', 'Unknown']+list(range(10)), size=(5,7))
df = pd.DataFrame(arr)

# find the largest and smallest finite values
finite_values = pd.to_numeric(list(set(np.unique(df.values))
                                   .difference(['Absent', 'Unknown'])))
vmin, vmax = finite_values.min(), finite_values.max()

# change Absent and Unknown to numeric values
df2 = df.replace({'Absent': vmax+1, 'Unknown': vmin-1})
# make sure the values are numeric
for col in df2:
    df2[col] = pd.to_numeric(df2[col])

fig, ax = plt.subplots()
cmap_custom = plt.get_cmap('Greens')
cmap_custom.set_under('red')
cmap_custom.set_over('black')
im = plt.imshow(df2, interpolation='nearest', cmap = cmap_custom, 
           vmin=vmin, vmax=vmax)
# add a colorbar (https://stackoverflow.com/a/18195921/190597)
divider = axes_grid1.make_axes_locatable(ax)
cax = divider.append_axes("right", size="5%", pad=0.05)
plt.colorbar(im, cax=cax, extend='both')
plt.show()

DataFrame

In [117]: df
Out[117]: 
        0        1  2        3  4        5       6
0       3        9  6        7  9        3  Absent
1  Absent  Unknown  5        4  7        0       2
2       3        0  2        9  8        0       2
3       5        5  7  Unknown  5   Absent       4
4       7        7  5        4  7  Unknown  Absent

变为

enter image description here