Reputation: 55
Here is my code. I made half of the data in df to be None, so we get a triangle graph.
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()
But if we changed the a+b to be 1 or larger than 1, the script cannot work, like below:
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()
It seems if more than half of the data is None, heatmap cannot plot such "unreasonable" graphs. Like the codes above, in my work I have a lot of data that has a None type (or void value), so how can I plot the heatmaps?
Upvotes: 1
Views: 1018
Reputation: 260520
The issue is the use of None
instead of NaN
.
None
gets converted to NaN
only if there are also numbers in the column:
pd.DataFrame([[1, None],[None, None]])
0 1
0 1.0 None
1 NaN None
In your example, the first column only has None
items, which leads to an object
dtype and causes heatmap to fail.
Change this bit:
if a+b<1.01:
df[a][b]=float('nan')
Output:
Upvotes: 1