使用以下代码,我可以通过单击复选按钮来打开和关闭图表上的线条。
然而,这两个系列的传奇一直在流传。
我希望一个系列的传奇在该系列出现时消失。
请注意,我不想要的东西这样。在这里,用户单击图例以打开和关闭系列,当系列关闭时,其图例图的线的 alpha 变为几乎透明。
我想要的是(通过图表本身外部的事件)要隐藏的线系列和要消失的图例中的相应条目,然后通过另一个切换再次重新存在。
这是代码:
import tkinter as tk
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
class App(tk.Frame):
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent, *args, **kwargs)
self.btn = tk.Label(parent, text='A simple plot')
self.btn.grid(row=0, column=0, padx=20, pady=10)
self.lfr = tk.LabelFrame(parent)
self.lfr.grid(row=1, column=0)
self.var_y = tk.IntVar()
self.var_z = tk.IntVar()
self.check_y = tk.Checkbutton(self.lfr, text="Chart of y", variable=self.var_y, command=self.checkbutton_changed)
self.check_z = tk.Checkbutton(self.lfr, text="Chart of z", variable=self.var_z, command=self.checkbutton_changed)
self.check_y.grid(column=0, row=1)
self.check_z.grid(column=1, row=1)
self.check_y.select()
self.check_z.select()
self.x = range(1, 11)
self.y = [1, 2, 3, 2, 1, 3, 4, 5, 5, 5]
self.z = [3, 1, 1, 3, 4, 5, 3, 2, 2, 2]
fig = plt.figure(figsize=(8, 5))
self.ax = fig.add_subplot(111)
self.plot_y = self.ax.plot(self.x, self.y, label="data y")[0]
self.plot_z = self.ax.plot(self.x, self.z, label="data z")[0]
self.plot_y.set_visible(self.var_y.get())
self.plot_z.set_visible(self.var_z.get())
plt.legend()
plt.gca().invert_yaxis()
plt.xticks(self.x, rotation=60)
self.canvas = FigureCanvasTkAgg(fig, master=parent)
self.canvas.draw()
self.canvas.get_tk_widget().grid(row=2, column=0, ipadx=40, ipady=20)
def checkbutton_changed(self):
self.plot_y.set_visible(self.var_y.get())
self.plot_z.set_visible(self.var_z.get())
self.ax.figure.canvas.draw()
if __name__ == '__main__':
root = tk.Tk()
App(root)
root.mainloop()
我想我应该对图例做一些类似于我对系列所做的事情(使它们成为类变量,以便我以后可以在命令复选按钮的方法中使用它们),但我看不出究竟是什么......
其他改进也将不胜感激。
提前致谢
在每个切换中使用句柄和标签更新matplotlib.pyplot.legend()。
def checkbutton_changed(self):
print('---')
self.plot_y.set_visible(self.var_y.get())
self.plot_z.set_visible(self.var_z.get())
handles = []
labels = []
if self.var_y.get():
handles.append(self.plot_y)
labels.append('data y')
if self.var_z.get():
handles.append(self.plot_z)
labels.append('data z')
plt.legend(handles, labels)
self.ax.figure.canvas.draw()
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句