Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Plot on top of seaborn clustermap

I generated a clustermap using seaborn.clustermap. I'd like to draw/plot an horizontal line on top of the heatmap like in this figureenter image description here

I simply tried to use matplotlib as:

plt.plot([x1, x2], [y1, y2], 'k-', lw = 10)

but the line is not displayed. The object returned by seaborn.clustermap doesn't have any properties like in this similar question. How can I plot the line?

Here is the code that generates a "random" clustermap similar to the one I posted:

import numpy as np
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
import random 

data = np.random.random((50, 50))
df = pd.DataFrame(data)
row_colors = ["b" if random.random() > 0.2 else "r"  for i in range (0,50)]
cmap = sns.diverging_palette(133, 10, n=7, as_cmap=True)
result = sns.clustermap(df, row_colors=row_colors, col_cluster = False, cmap=cmap, linewidths = 0)
plt.plot([5, 30], [5, 5], 'k-', lw = 10)
plt.show()
like image 485
Titus Pullo Avatar asked Sep 30 '15 14:09

Titus Pullo


1 Answers

The axes object that you want is hiding in ClusterGrid.ax_heatmap. This code finds this axis and simply uses ax.plot() to draw the line. You could also use ax.axhline().

import numpy as np
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
import random 

data = np.random.random((50, 50))
df = pd.DataFrame(data)
row_colors = ["b" if random.random() > 0.2 else "r"  for i in range (0,50)]
cmap = sns.diverging_palette(133, 10, n=7, as_cmap=True)
result = sns.clustermap(df, row_colors=row_colors, col_cluster = False, cmap=cmap, linewidths = 0)
print dir(result)  # here is where you see that the ClusterGrid has several axes objects hiding in it
ax = result.ax_heatmap  # this is the important part
ax.plot([5, 30], [5, 5], 'k-', lw = 10)
plt.show()

enter image description here

like image 67
DanHickstein Avatar answered Oct 21 '22 14:10

DanHickstein