Heat maps display numeric tabular data where the cells are colored depending upon the contained value. Heat maps are great for making trends in this kind of data more readily apparent, particularly when the data is ordered and there is clustering.
dataset: Seaborn - flights
In [1]:
%matplotlib inline
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
plt.rcParams['figure.figsize'] = (20.0, 10.0)
plt.rcParams['font.family'] = "serif"
In [2]:
df = pd.pivot_table(data=sns.load_dataset("flights"),
index='month',
values='passengers',
columns='year')
df.head()
Out[2]:
Default plot
In [3]:
sns.heatmap(df)
Out[3]:
cmap
adjusts the colormap used. I like diverging colormaps for heatmaps because they provide good contrast.
In [4]:
sns.heatmap(df, cmap='coolwarm')
Out[4]:
center
can be used to indicate at which numeric value to use the center of the colormap. Above we see most of the map using blues, so by setting the value of center
equal to the midpoint of the data then we can create a map where there are more equal amounts of red and blue shades.
In [5]:
midpoint = (df.values.max() - df.values.min()) / 2
sns.heatmap(df, cmap='coolwarm', center=midpoint)
Out[5]:
Adjust the lower and upper contrast bounds with vmin
and vmax
. Everything below vmin
will be the same color. Likewise for above vmax
.
In [6]:
midpoint = (df.values.max() - df.values.min()) / 2
sns.heatmap(df, cmap='coolwarm', center=midpoint, vmin=150, vmax=400)
Out[6]:
In [7]:
midpoint = (df.values.max() - df.values.min()) / 2
sns.heatmap(df, cmap='coolwarm', center=midpoint, vmin=-100, vmax=800)
Out[7]:
robust
sets contrast levels based on quantiles and works like an "auto-contrast" for choosing good values
In [8]:
p = sns.heatmap(df, cmap='coolwarm', robust=True)
Label the rectangles with annot=True
, which also chooses a suitable text color
In [9]:
p = sns.heatmap(df, cmap='coolwarm', annot=True)
The format of the annotation can be changed with fmt
-- here I'll change from the default scientific notation to one decimal precision
In [10]:
p = sns.heatmap(df, cmap='coolwarm', annot=True, fmt=".1f")
Any other parameters for the text, such as the font size, can be passed with annot_kws
.
In [11]:
p = sns.heatmap(df, cmap='coolwarm', annot=True, fmt=".1f",annot_kws={'size':16})
cbar
can be used to turn off the colorbar
In [12]:
p = sns.heatmap(df,
cmap='coolwarm',
annot=True,
fmt=".1f",
annot_kws={'size':16},
cbar=False)
square
forces the aspect ratio of the blocks to be equal
In [13]:
p = sns.heatmap(df,
cmap='coolwarm',
annot=True,
fmt=".1f",
annot_kws={'size':10},
cbar=False,
square=True)
xticklabels
and yticklabels
are booleans to turn off the axis labels
In [14]:
p = sns.heatmap(df,
cmap='coolwarm',
annot=True,
fmt=".1f",
annot_kws={'size':10},
cbar=False,
square=True,
xticklabels=False,
yticklabels=False)
If you would like to hide certain values, pass in a binary mask
In [15]:
mask = np.zeros(df.shape)
mask[1::2,1::2] = 1
p = sns.heatmap(df,
cmap='coolwarm',
annot=True,
fmt=".1f",
annot_kws={'size':10},
cbar=False,
square=True,
xticklabels=False,
yticklabels=False,
mask=mask)
Finalize
In [44]:
plt.rcParams['font.size'] = 20
bg_color = (0.88,0.85,0.95)
plt.rcParams['figure.facecolor'] = bg_color
plt.rcParams['axes.facecolor'] = bg_color
fig, ax = plt.subplots(1)
p = sns.heatmap(df,
cmap='coolwarm',
annot=True,
fmt=".1f",
annot_kws={'size':16},
ax=ax)
plt.xlabel('Month')
plt.ylabel('Year')
ax.set_ylim((0,15))
plt.text(5,12.3, "Heat Map", fontsize = 95, color='Black', fontstyle='italic')
Out[44]:
In [ ]:
p.get_figure().savefig('../../figures/heatmap.png')