【问题标题】:How to set a different linestyle for each hue group in a kdeplot / displot如何为 kdeplot / displot 中的每个色调组设置不同的线型
【发布时间】:2022-01-02 10:28:43
【问题描述】:
  • 如何为seaborn.kdeplotseaborn.displotkind='kde' 中的每个hue 组分配不同的linestyle
    • 坐标轴级别和图形级别选项都将接受linestyle/lsstr,这适用于所有hue 组。
import seaborn as sns
import matplotlib.pyplot as plt

# load sample data
iris = sns.load_dataset("iris")

# convert data to long form
im = iris.melt(id_vars='species')

# axes-level plot works with 1 linestyle
fig = plt.figure(figsize=(6, 5))
p1 = sns.kdeplot(data=im, x='value', hue='variable', fill=True, ls='-.')

# figure-level plot works with 1 linestyle
p2 = sns.displot(kind='kde', data=im, x='value', hue='variable', fill=True, ls='-.')
  • kdeplot

  • displot

复习问题

【问题讨论】:

    标签: python matplotlib seaborn


    【解决方案1】:
    • 对于fill=True,要更新的对象位于.collections
    • 对于fill=False,要更新的对象位于.lines
    • 更新图例相当简单:
      • handles = p.legend_.legendHandles[::-1] 提取并反转图例句柄。它们被反转以更新,因为它们的更新顺序与 linestyle 的更新顺序相反
      • 请注意,图形级绘图使用._legend 提取图例,轴级绘图使用.legend_
    • python 3.8.12matplotlib 3.4.3seaborn 0.11.2 中测试

    kdeplot:轴级

    • axes 对象中提取并迭代.collections.lines 并使用.set_linestyle

    fill=True

    fig = plt.figure(figsize=(6, 5))
    p = sns.kdeplot(data=im, x='value', hue='variable', fill=True)
    
    lss = [':', '--', '-.', '-']
    
    handles = p.legend_.legendHandles[::-1]
    
    for line, ls, handle in zip(p.collections, lss, handles):
        line.set_linestyle(ls)
        handle.set_ls(ls)
    

    fill=False

    fig = plt.figure(figsize=(6, 5))
    p = sns.kdeplot(data=im, x='value', hue='variable')
    
    lss = [':', '--', '-.', '-']
    
    handles = p.legend_.legendHandles[::-1]
    
    for line, ls, handle in zip(p.lines, lss, handles):
        line.set_linestyle(ls)
        handle.set_ls(ls)
    

    displot: 人物级别

    • 类似于轴级绘图,但每个轴都必须迭代
    • 图例handles 可以在for line, ls, handle in zip(ax.collections, lss, handles) 中更新,但这适用于每个子图的更新。因此,将创建一个单独的循环来仅更新图例 handles 一次。

    fill=True

    g = sns.displot(kind='kde', data=im, col='variable', x='value', hue='species', fill=True, common_norm=False, facet_kws={'sharey': False})
    
    axes = g.axes.flat
    
    lss = [':', '--', '-.']
    
    for ax in axes:
        for line, ls in zip(ax.collections, lss):
            line.set_linestyle(ls)
            
    handles = g._legend.legendHandles[::-1]
    for handle, ls in zip(handles, lss):
        handle.set_ls(ls)
    

    fill=False

    g = sns.displot(kind='kde', data=im, col='variable', x='value', hue='species', common_norm=False, facet_kws={'sharey': False})
    
    axes = g.axes.flat
    
    lss = [':', '--', '-.']
    
    for ax in axes:
        for line, ls in zip(ax.lines, lss):
            line.set_linestyle(ls)
            
    handles = g._legend.legendHandles[::-1]
    for handle, ls in zip(handles, lss):
        handle.set_ls(ls)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-01
      • 2022-01-01
      • 1970-01-01
      • 2015-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多