通过迭代创建的Zip列表,可在mpld3 InteractiveLegendPlugin中使用

时间:2019-03-06 23:49:45

标签: python pandas

我想将mpd3互动式图例插件应用于图中的所有支持,诸如此类:

d = {'x': [1,2,3,4,1,2,3,4,1,2,3,4],
     'y1': np.random.randn(12),
     'y2': np.random.randn(12),
     'y3': np.random.randn(12),
     'hue': ['a','a','a','a','b','b','b','b','c','c','c','c']}
df = pd.DataFrame(d)

fig, ax = plt.subplots(1, 3, figsize=(12,7))


plot_list = ['y1','y2','y3']
sub=1
k = df.hue.nunique()
lines = []
for y in plot_list:
  plt.subplot(1, 3, sub)

  ax = sns.lineplot('x',y,'hue',data=df, ci=None, palette=sns.cubehelix_palette(k, start=.2, rot=-.3))
  handles, labels = ax.get_legend_handles_labels() # return lines and labels
  ax.get_legend().remove()
  lines = lines + (plt.subplot(1, 3, sub).lines) #this doesn't do anything in the code as it is right now
  sub=sub+1

interactive_legend = InteractiveLegendPlugin(zip(handles[1:], 
                                                 (plt.subplot(1, 3, 1).lines),
                                                 (plt.subplot(1, 3, 2).lines),
                                                 (plt.subplot(1, 3, 3).lines)
                                                ),
                                                   labels[1:],
                                                   alpha_unsel=0.1,
                                                   alpha_over=1.5, 
                                                   start_visible=True, font_size=18, legend_offset=(750, -20))



plugins.connect(fig, interactive_legend)

plt.subplots_adjust(bottom=0.25, right=0.9, left=0.05, top=0.88, wspace=0.2, hspace= 0.7)

displayHTML(mpld3.fig_to_html(fig))

此代码可以满足我的需要,但是必须为我创建的每个子图手动添加(plt.subplot(1, 3, 3).lines),这看起来非常难看,因为在原始代码中我有12个子图。

我想当我遍历“ for”时肯定有一种非常简单的方法来做到这一点,但是我尝试了类似的方法 添加lines = lines + (plt.subplot(1, 3, sub).lines)并在zip内使用它不起作用。最终仅将插件应用于其中一个地块。

我还尝试将“ +”替换为“,”,但是这样的代码甚至无法工作。

我现在可能过度解释自己,但是我相信问题可能是,我需要迭代后的“行”结果是这样的:

[<matplotlib.lines.Line2D at 0x7f16ab20d240>,
<matplotlib.lines.Line2D at 0x7f16ab20df28>,
<matplotlib.lines.Line2D at 0x7f16ab20d710>],
[<matplotlib.lines.Line2D at 0x7f16ab20d240>,
<matplotlib.lines.Line2D at 0x7f16ab20df28>,
<matplotlib.lines.Line2D at 0x7f16ab20d710>],
[<matplotlib.lines.Line2D at 0x7f16ab20d240>,
<matplotlib.lines.Line2D at 0x7f16ab20df28>,
<matplotlib.lines.Line2D at 0x7f16ab20d710>]

但是使用“ +”我会得到类似的东西:

[<matplotlib.lines.Line2D at 0x7f16ab20d240>,
<matplotlib.lines.Line2D at 0x7f16ab20df28>,
<matplotlib.lines.Line2D at 0x7f16ab20d710>,
<matplotlib.lines.Line2D at 0x7f16ab20d240>,
<matplotlib.lines.Line2D at 0x7f16ab20df28>,
<matplotlib.lines.Line2D at 0x7f16ab20d710>,
<matplotlib.lines.Line2D at 0x7f16ab20d240>,
<matplotlib.lines.Line2D at 0x7f16ab20df28>,
<matplotlib.lines.Line2D at 0x7f16ab20d710>]

然后是“,”,如下所示:

((([],[<matplotlib.lines.Line2D at 0x7f16ab20d240>,
<matplotlib.lines.Line2D at 0x7f16ab20df28>,
<matplotlib.lines.Line2D at 0x7f16ab20d710>]),
[<matplotlib.lines.Line2D at 0x7f16ab20d240>,
<matplotlib.lines.Line2D at 0x7f16ab20df28>,
<matplotlib.lines.Line2D at 0x7f16ab20d710>]),
[<matplotlib.lines.Line2D at 0x7f16ab20d240>,
<matplotlib.lines.Line2D at 0x7f16ab20df28>,
<matplotlib.lines.Line2D at 0x7f16ab20d710>])

所以都不行。

我尝试了其他方法来解决这个问题,但失败了,并且由于很难看到zip的结果(而且代码似乎只能与zip一起使用),所以我没有选择了

0 个答案:

没有答案