【问题标题】:Incorrect legend labels in python seaborn plotspython seaborn图中的图例标签不正确
【发布时间】:2017-07-28 15:55:27
【问题描述】:

上面的情节是在 python 中使用 seaborn 制作的。但是,不知道为什么有些图例圈用颜色填充,而另一些则没有。这是我正在使用的颜色图:

sns.color_palette("Set2", 10)

g = sns.factorplot(x='month', y='vae_factor', hue='ad_name', col='crop', data=df_sub_panel,
                   col_wrap=3, size=5, lw=0.5, ci=None, capsize=.2, palette=sns.color_palette("Set2", 10),
                   sharex=False, aspect=.9, legend_out=False)
g.axes[0].legend(fancybox=None)

--编辑:

有没有办法可以填充圆圈?他们没有被填充的原因是他们可能在这个特定的图中没有数据

【问题讨论】:

  • @ImportanceOfBeingErnest,我正在使用 seaborn (0.8) 和 matpltolib (2.0) 的最新版本
  • 测试数据呢?
  • 如果您真的想得到答案,请提供minimal reproducible example。 IE。一些示例数据,其中包含要运行的代码来重现这一点。当我绘制缺少数据的因子图时,图例中没有未填充的圆圈。
  • 图例中缺少变量有什么意义?而且,如果您在图例中确实需要它们,那么没有填充它们不是很好的区别吗?它们很容易被识别。
  • @user308827 如果没有工作示例,这是不可能重现的

标签: python matplotlib seaborn


【解决方案1】:

当没有数据时,圆圈不会被填充,我想你已经推断出来了。但是可以通过操作图例对象来强制。

完整示例:

import pandas as pd
import seaborn as sns

df_sub_panel = pd.DataFrame([
  {'month':'jan', 'vae_factor':50, 'ad_name':'China', 'crop':False},
  {'month':'feb', 'vae_factor':60, 'ad_name':'China', 'crop':False},
  {'month':'feb', 'vae_factor':None, 'ad_name':'Mexico', 'crop':False},
])

sns.color_palette("Set2", 10)

g = sns.factorplot(x='month', y='vae_factor', hue='ad_name', col='crop', data=df_sub_panel,
                   col_wrap=3, size=5, lw=0.5, ci=None, capsize=.2, palette=sns.color_palette("Set2", 10),
                   sharex=False, aspect=.9, legend_out=False)

# fill in empty legend handles (handles are empty when vae_factor is NaN)
for handle in g.axes[0].get_legend_handles_labels()[0]:
  if not handle.get_facecolors().any():
    handle.set_facecolor(handle.get_edgecolors())

legend = g.axes[0].legend(fancybox=None)

sns.plt.show()

重要的部分是最后(在 for 循环中)legend 中的 handle 对象的操作。

这将生成:

与原版相比(没有 for 循环):

编辑:多亏了 cmets 的建议,现在不那么老套了!

【讨论】:

  • 无数据时不画圆。我认为这里的每个人都会从答案中的minimal reproducible example 中受益,即使问题拒绝提供。
  • 您不应通过__dict__ 访问私有属性。 Matplotlib 具有访问所有这些对象的公共方法,例如ax.get_legend_handles_labels().
  • @ImportanceOfBeingErnest 制作自己的两点数据框以测试 w/ 非常容易。如果您想查看我使用的答案历史记录,请查看答案。 (我把它拿出来是因为 IMO 它在没有增加太多价值的情况下混淆了答案,但总的来说同意你。)
  • 嗯,是的,它有点复杂,它返回的句柄实际上是轴中的对象,而不是图例中的对象。您需要更改这些,然后在这样做后致电legend
  • 如果提供minimal reproducible example 是微不足道的,我看不出提供该数据框的问题。
猜你喜欢
  • 2020-08-05
  • 1970-01-01
  • 2021-06-25
  • 2019-07-08
  • 1970-01-01
  • 2021-01-29
  • 2019-03-22
  • 2017-03-19
  • 1970-01-01
相关资源
最近更新 更多