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

How to specify linewidth in Seaborn's clustermap dendrograms

通常我会通过编辑 matplotlib.rcParams 来增加 matplotlib 的全局线宽。这似乎直接适用于 SciPy's dendrogram implementation but not with 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)

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

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. 0.7.1(可能还有一些更早的版本); g.ax_col_dendrogram.lines 现在 returns 一个空列表。我找不到增加线宽的方法,最后我临时修改了 Seaborn 模块。在文件matrix.py、函数class _DendrogramPlotter中,线宽硬编码为0.5;我修改为1.5:

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

这行得通,但显然不是一个非常可持续的方法。

对于较新版本的 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)

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

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

例如:

>>> 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 pt 粗线的聚类图,颜色为另一种深紫色。