有了这个代码片段,我希望得到一个每个色调都有一条线的线条图,它有以下不同的值: 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,另外还有一行,如下所示:

这是一个bug,还是我遗漏了一些明显的东西?
发布于 2020-05-25 22:34:50
当色调可以转换为整数时,这是一个已知的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);发布于 2020-05-26 03:14:25
正如@LudvigH对另一个答案的评论所说,这不是一个bug,即使在这种情况下默认行为是令人惊讶的。正如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")

https://stackoverflow.com/questions/62004561
复制相似问题