【问题标题】:Is this an error in the seaborn.lineplot hue parameter?这是 seaborn.lineplot 色调参数中的错误吗?
【发布时间】:2020-09-12 05:14:29
【问题描述】:

使用此代码 sn-p,我期望每个色相有一条线的线图,它具有以下不同的值:[1, 5, 10, 20, 40]。

import math
import pandas as pd
import seaborn as sns

sns.set(style="whitegrid")

TANH_SCALING = [1, 5, 10, 20, 40]
X_VALUES = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
COLUMNS = ['x', 'y', 'hue group']

tanh_df = pd.DataFrame(columns=COLUMNS)

for sc in TANH_SCALING:
    data = {
        COLUMNS[0]: X_VALUES,
        COLUMNS[1]: [math.tanh(x/sc) for x in X_VALUES],
        COLUMNS[2]: len(X_VALUES)*[sc]}
    tanh_df = tanh_df.append(
        pd.DataFrame(data=data, columns=COLUMNS),
        ignore_index=True
    )

sns.lineplot(x=COLUMNS[0], y=COLUMNS[1], hue=COLUMNS[2], data=tanh_df);

但是,我得到的是一个带有值 [0, 15, 30, 45] 的色调图例,以及一个附加行,如下所示:

这是一个错误还是我遗漏了一些明显的东西?

【问题讨论】:

    标签: python pandas seaborn


    【解决方案1】:

    当色调可以转换为整数时,这是 seaborn 的一个已知错误。您可以为色调添加前缀,以便转换为整数失败:

    for sc in TANH_SCALING:
        data = {
            COLUMNS[0]: X_VALUES,
            COLUMNS[1]: [math.tanh(x/sc) for x in X_VALUES],
            COLUMNS[2]: len(X_VALUES)*[f'A{sc}']}             # changes here
        tanh_df = tanh_df.append(
            pd.DataFrame(data=data, columns=COLUMNS),
            ignore_index=True
        )
    

    输出:

    或者在您创建数据之后:

    # data creation
    for sc in TANH_SCALING:
        data = {
            COLUMNS[0]: X_VALUES,
            COLUMNS[1]: [math.tanh(x/sc) for x in X_VALUES],
            COLUMNS[2]: len(X_VALUES)*[f'A{sc}']}
        tanh_df = tanh_df.append(
            pd.DataFrame(data=data, columns=COLUMNS),
            ignore_index=True
        )
    
    
    # hue manipulation
    sns.lineplot(x=COLUMNS[0], y=COLUMNS[1], 
                 hue='A_' + tanh_df[COLUMNS[2]].astype(str), # change hue here
                 data=tanh_df);
    

    【讨论】:

    • 我不知道我是否会称其为“错误”。它更像是一个功能。让色调为数字维度将确保色调以“比例”呈现。如果您想要分类表示(即每个值一种颜色),请将其设置为分类数据类型,例如字符串。我感觉合理。否则你有一个很好的答案。
    【解决方案2】:

    正如@LudvigH 对另一个答案的评论所说,这不是一个错误,即使在这种情况下默认行为令人惊讶。如docs 中所述:

    如果存在,对色调(以及较小程度的尺寸)语义的默认处理取决于变量是否被推断为表示“数字”或“分类”数据。特别是,数字变量默认使用顺序颜色图表示,图例条目显示常规“刻度”,其值可能存在于数据中,也可能不存在。这种行为可以通过各种参数来控制,如下所述。

    这里有两种控制行为的具体方法。

    如果您想保留数字颜色映射但让图例显示数据中的确切值,请设置legend="full"

    sns.lineplot(x=COLUMNS[0], y=COLUMNS[1], hue=COLUMNS[2], data=tanh_df, legend="full")
    

    如果您想让 seaborn 将 hue 参数的级别视为离散的分类值,请传递命名的分类颜色图或您要使用的特定颜色的列表或字典:

    sns.lineplot(x=COLUMNS[0], y=COLUMNS[1], hue=COLUMNS[2], data=tanh_df, palette="deep")
    

    【讨论】:

      猜你喜欢
      • 2014-12-27
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      • 2013-05-04
      • 2013-05-04
      • 2011-09-28
      • 2017-07-23
      • 2012-09-15
      相关资源
      最近更新 更多