在seaborn FacetGrid热力图中获得图例

4
我们如何为seaborn的FacetGrid热力图获取图例?使用.add_legend()方法无法正常工作。使用此前的问题中的代码:
import pandas as pd
import numpy as np
import itertools
import seaborn as sns

print("seaborn version {}".format(sns.__version__))
# R expand.grid() function in Python
# https://dev59.com/eGct5IYBdhLWcg3wZMfn#12131385
def expandgrid(*itrs):
   product = list(itertools.product(*itrs))
   return {'Var{}'.format(i+1):[x[i] for x in product] for i in range(len(itrs))}

methods=['method 1', 'method2', 'method 3', 'method 4']
times = range(0,100,10)
data = pd.DataFrame(expandgrid(methods, times, times))
data.columns = ['method', 'dtsi','rtsi']
data['nw_score'] = np.random.sample(data.shape[0])

def facet(data,color):
    data = data.pivot(index="dtsi", columns='rtsi', values='nw_score')
    g = sns.heatmap(data, cmap='Blues', cbar=False)

with sns.plotting_context(font_scale=5.5):
    g = sns.FacetGrid(data, col="method", col_wrap=2, size=3, aspect=1)
    g = g.map_dataframe(facet)
    g.add_legend()
    g.set_titles(col_template="{col_name}", fontweight='bold', fontsize=18)

enter image description here


您能解释一下您想要哪种图例吗?当您在单个轴集中有多位艺术家时,图例非常有用。在您的示例中,每个子图中仅有一个艺术家(热力图),并且每个子图都根据相应的列名唯一命名,因此在这种情况下,我认为图例是多余的。 - ali_m
你需要适应这里的答案(https://dev59.com/RV4c5IYBdhLWcg3wEGt_) - mwaskom
谢谢@mwaskom!我是新手,很兴奋能使用它。 - jmatsen
1个回答

11
在matplotlib中,您想要的是一个颜色条(colorbar),而不是图例(legend)。前者用于连续数据,而后者用于分类数据。虽然FacetGrid不支持颜色条,但很容易通过扩展示例代码来添加颜色条。请保留HTML标签。
import pandas as pd
import numpy as np
import itertools
import seaborn as sns

methods=['method 1', 'method2', 'method 3', 'method 4']
times = range(0, 100, 10)
data = pd.DataFrame(list(itertools.product(methods, times, times)))
data.columns = ['method', 'dtsi','rtsi']
data['nw_score'] = np.random.sample(data.shape[0])

def facet_heatmap(data, color, **kws):
    data = data.pivot(index="dtsi", columns='rtsi', values='nw_score')
    sns.heatmap(data, cmap='Blues', **kws)  # <-- Pass kwargs to heatmap

with sns.plotting_context(font_scale=5.5):
    g = sns.FacetGrid(data, col="method", col_wrap=2, size=3, aspect=1)

cbar_ax = g.fig.add_axes([.92, .3, .02, .4])  # <-- Create a colorbar axes

g = g.map_dataframe(facet_heatmap,
                    cbar_ax=cbar_ax,
                    vmin=0, vmax=1)  # <-- Specify the colorbar axes and limits

g.set_titles(col_template="{col_name}", fontweight='bold', fontsize=18)
g.fig.subplots_adjust(right=.9)  # <-- Add space so the colorbar doesn't overlap the plot

在此输入图片描述

我已经在内联注释中指出了我所做的更改以及其原因。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接