如何在Seaborn的clustermap树形图中指定线宽

时间:2015-10-15 18:26:38

标签: python matplotlib seaborn

通常我会通过编辑matplotlib.rcParams来增加matplotlib的全局线宽。这似乎直接适用于SciPy's dendrogram实现,但不适用于Seaborn's clustermap(使用SciPy的树形图)。任何人都可以建议一种工作方法吗?

import matplotlib
matplotlib.rcParams['lines.linewidth'] = 10
import seaborn as sns; sns.set()

flights = sns.load_dataset("flights")
flights = flights.pivot("month", "year", "passengers")
g = sns.clustermap(flights)

3 个答案:

答案 0 :(得分:2)

可能有一种更简单的方法,但这似乎有效:

import matplotlib
import seaborn as sns; sns.set()

flights = sns.load_dataset("flights")
flights = flights.pivot("month", "year", "passengers")
g = sns.clustermap(flights)
for l in g.ax_row_dendrogram.lines:
        l.set_linewidth(10)
for l in g.ax_col_dendrogram.lines:
        l.set_linewidth(10)

编辑这不再适用于Seaborn v.7.1.1(也可能是某些早期版本); g.ax_col_dendrogram.lines现在返回一个空列表。我无法找到增加线宽的方法,最后我暂时修改了Seaborn模块。在文件matrix.py中,函数class _DendrogramPlotter,线宽被硬编码为0.5;我把它修改为1.5:

line_kwargs = dict(linewidths=1.5, colors='k')

这很有效,但显然不是一种非常可持续的方法。

答案 1 :(得分:2)

现在,以下合并的拉取请求https://github.com/mwaskom/seaborn/pull/1935以更可靠的方式解决了这一问题。我假设它将在v0.9.0之后的版本中包含。

您可以使用LineCollection参数来控制树状图的tree_kws属性。

例如:

>>> import seaborn as sns
>>> iris = sns.load_dataset("iris")
>>> species = iris.pop("species")
>>> g = sns.clustermap(iris, tree_kws=dict(linewidths=1.5, colors=(0.2, 0.2, 0.4))

将使用另一种深紫色为树创建1.5磅粗线的簇图。

答案 2 :(得分:0)

对于较新版本的seaborn(经0.7.1、0.9.0测试),这些行位于LineCollection中,而不是单独存在。因此,它们的宽度可以如下更改:

import seaborn as sns
import matplotlib.pyplot as plt

# load data and make clustermap
df = sns.load_dataset('iris')
g = sns.clustermap(df[['sepal_length', 'sepal_width']])

for a in g.ax_row_dendrogram.collections:
    a.set_linewidth(10)

for a in g.ax_col_dendrogram.collections:
    a.set_linewidth(10)