如果大多数数据为 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')
输出:
这是我的代码。我把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')
输出: