python seaborn绘图中的图例标签不正确

python seaborn绘图中的图例标签不正确,python,matplotlib,seaborn,Python,Matplotlib,Seaborn,上面的图是使用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=Non

上面的图是使用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)
--编辑:


有没有办法填补这些圆圈?它们没有填充的原因是它们可能在这个特定的绘图中没有数据

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

完整示例:

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循环中)操纵
图例中的
句柄
对象

这将产生:

与原始版本相比(无for循环):


编辑:多亏了评论的建议,现在黑客行为少了

@importantanceofbeingernest,我正在使用seaborn(0.8)和matpltolib(2.0)的最新版本。测试数据呢?如果你真的想得到答案,请提供答案。也就是说,一些示例数据带有要运行的代码,以重现该数据。当我绘制缺少数据的FactoryPlot时,图例中没有未填充的圆。图例中缺少变量有什么意义?而且,如果你真的在传说中需要它们,那么它们没有被填满不是一个很好的区别吗?它们很容易识别。@user308827如果没有工作示例,这是不可能重现的。如果没有数据,就不会画圆。我想这里的每个人都会从答案中的a中受益,即使问题拒绝提供a。你不应该通过
\uuuuu dict\uuuuu
访问私有属性。Matplotlib具有访问所有这些对象的公共方法,例如,
ax.get_legend\u handles_labels()
@ImportanceOfBeingErnest创建自己的两点数据帧来测试w/非常简单。如果您想查看我使用的答案,请查看答案历史记录。(我把它拿出来是因为在我看来,它混淆了答案,没有增加多少价值,但总体上同意你的看法。)嗯,是的,它有点复杂,它返回的句柄实际上是轴中的对象,而不是图例中的对象。您需要更改这些,然后在执行此操作后调用
legend