我想将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一起使用),所以我没有选择了