【问题标题】:Seaborn global hue orderSeaborn 全局色调顺序
【发布时间】:2021-08-17 16:53:14
【问题描述】:

我经常使用hue 参数来区分类别,但似乎 seaborn 在将色调与类别匹配的方式上并不一致(根据我的阅读,它取决于绘制的数据,特别是它的顺序)。我想避免到处传递 hue_order 参数,因为我知道我会在某个时候忘记它并且不会注意到它(这会导致误解,因为我会认为色调是正确的)。

有没有办法全局设置hue_order(所有地块的固定顺序)?

更好的是,是否可以将分类索引设置为所有行为相同(例如,字母数字顺序)?

现在我使用以下丑陋的策略:

SNS_SETTINGS = dict(hue_order=[...])

sns.displot(df, **SNS_SETTINGS, x="time", kind="ecdf", hue="algorithm")

【问题讨论】:

  • 要求确保了解您的情况,您是否也将hue 参数也放入字典中,因为它们是成对出现的?因为在这种情况下,您将“永远”不会忘记hue_order,因为您也不会拥有hue
  • 啊,是的,你是对的。此外,我将在几乎所有的绘图中使用这个常数(不仅是displots)。这可能确实是一个很好的解决方案:D
  • 我不确定“全局色调顺序”的概念是否有意义,因为它意味着您只使用一个色调变量。您可以做的是在数据对象上设置一个“类别”dtype,它将在任何时候使用该数据时提供排序信息。
  • 这取决于,如果您只有字符串,您可以接受按字母顺序对所有色调进行排序。虽然它也不是完美的,但每个类别都有一个色调,全局设置会更好。这样,即使您没有显示所有类别,色调也会保持一致。

标签: seaborn


【解决方案1】:

一个非常实用的解决方案是在SNS_SETTINGS 字典中添加hue 参数。这种耦合将确保您的绘图所需的一致性。

另一种解决方案,在您的特定情况下可能合适,也可能不合适,是使用functools.partial 定义自定义函数,定义一次参数以获得更短的函数调用:

from functools import partial

displot_by_algorithm = partial(sns.displot, hue="algorithm", hue_order=[...])

这样,你以后可以调用

displot_by_algorithm(df, x="time", kind="ecdf")

当然,您必须为要使用的所有不同绘图函数定义这样的函数,因此权衡可能不值得。

【讨论】:

  • 是的,谢谢,我真的认为第一个解决方案最适合我,但在其他情况下使用 partial 可能是值得的。我仍然很想告诉 seaborn 如何表现(这样可以避免将来出现任何混淆/错误)。同时,我会接受你的回答。
猜你喜欢
  • 2020-04-10
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多