如果大多数数据为 None,则无法绘制 Seaborn 热图

Seaborn heatmap cannot be plotted if most data is None

这是我的代码。我把df中一半的数据设为None,所以我们得到一个三角图

import seaborn as sns
import matplotlib.pyplot  as plt
import pandas as pd
df= {}
for a in [0,0.125,0.25,0.375,0.5,0.625,0.75,0.875,1]:
    df[a]={}
    for b in [0,0.125,0.25,0.375,0.5,0.625,0.75,0.875,1]:
        if a+b<1:
            df[a][b]=None
        else:
            df[a][b]=a+b
sns.heatmap(pd.DataFrame(df),square=True,annot=True,fmt=".1f",cmap="YlGnBu_r")
plt.show()

但是如果我们将 a+b 改为 1 或大于 1,脚本将无法运行,如下所示:

import seaborn as sns
import matplotlib.pyplot  as plt
import pandas as pd
df= {}
for a in [0,0.125,0.25,0.375,0.5,0.625,0.75,0.875,1]:
    df[a]={}
    for b in [0,0.125,0.25,0.375,0.5,0.625,0.75,0.875,1]:
        if a+b<1.01:
            df[a][b]=None
        else:
            df[a][b]=a+b
sns.heatmap(pd.DataFrame(df),square=True,annot=True,fmt=".1f",cmap="YlGnBu_r")
plt.show()

好像一半以上的数据是None,heatmap就画不出这种“不合理”的图了。像上面的代码一样,在我的工作中,我有很多具有 None 类型(或 void 值)的数据,那么如何绘制热图?

问题是使用 None 而不是 NaN

只有当列中也有数字时,

None 才会转换为 NaN

pd.DataFrame([[1, None],[None, None]])

     0     1
0  1.0  None
1  NaN  None

在您的示例中,第一列只有 None 个项目,这导致 object dtype 并导致热图失败。

更改此位:

        if a+b<1.01:
            df[a][b]=float('nan')

输出: