访问for循环中生成的单独图(matplotlib)

时间:2018-03-15 17:49:23

标签: python matplotlib

我有多个图表可以相互比较,但比较图表然后更改代码以比较下一个功能是非常耗时的。这就是为什么我决定使用按钮来显示和隐藏我需要的情节。

由于不同数量的图表同时显示,因此图形在for循环中计算。这是以底部显示的方式完成的。
问题是我无法访问for循环中的图表来打开它们。所以我需要三个按钮,每个功能一个。

for f in flist:
    ax1.plot(f['x'], f['fx'], label=f['fname'] )
ax1.legend()

在上面的部分中,我生成了图表,在下一部分中,我必须访问图表和标签名称

lines = [ax1]

但这并不像我所说的那样有效。您有什么建议我可以解决这个问题吗? 我从matplotlib示例(See Check Buttons example)获得了代码。下面显示的是我想要使用它的方式的代码示例,但不起作用。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
from matplotlib.widgets import CheckButtons

flist = []
xl = [np.linspace(0,8,265)]

for xi in xl:
    flist.append({'x': xi, 'fx': -0.4*(xi-4)**2+3,'fname':'-0.4*(xi-4)**2+3'})
    flist.append({'x': xi, 'fx': -0.4 * (xi - 5) ** 2 + 3, 'fname': ' -0.4*(xi-5)**2+3'})
    flist.append({'x': xi, 'fx': -0.4 * (xi - 3.5) ** 2 + 3, 'fname': '-0.4*(xi-3.5)**2+3'})

fig = plt.figure(figsize=(12, 6))
gs = GridSpec(2, 2, width_ratios=[1, 2.5])

ax1 = plt.subplot(gs[:, :-1])
for f in flist:
    ax1.plot(f['x'], f['fx'], label=f['fname'] )
ax1.legend()
ax1.set_xlabel("time")
ax1.set_ylabel("amplitude")
ax1.set_title('graphs')

lines = [ax1]

# Make checkbuttons with all plotted lines with correct visibility
rax = plt.axes([0.05, 0.4, 0.1, 0.15])
labels = [str(line.get_label()) for line in lines]
visibility = [line.get_visible() for line in lines]
check = CheckButtons(rax, labels, visibility)

def func(label):
    index = labels.index(label)
    lines[index].set_visible(not lines[index].get_visible())
    plt.draw()
check.on_clicked(func)
plt.tight_layout()

plt.show()

1 个答案:

答案 0 :(得分:0)

lines应该是您要切换可见性的行列表。因此,您可能希望使用for循环中的行填充此列表。

lines = []
for f in flist:
    line, = ax1.plot(... )
    lines.append(line)