我有多个图表可以相互比较,但比较图表然后更改代码以比较下一个功能是非常耗时的。这就是为什么我决定使用按钮来显示和隐藏我需要的情节。
由于不同数量的图表同时显示,因此图形在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()
答案 0 :(得分:0)
lines
应该是您要切换可见性的行列表。因此,您可能希望使用for循环中的行填充此列表。
lines = []
for f in flist:
line, = ax1.plot(... )
lines.append(line)