matplotlib pyqt4 pandas:多个复选框选择显示哪些图表
我有以下的导入:
import numpy as np
import pandas as pd
import matplotlib
matplotlib.use('QT4Agg')
import matplotlib.pyplot as plt
pd.options.display.mpl_style='default'
还有下面这个图:
fig, axarr = plt.subplots(3, sharex=True)
在第一个子图中,我从多个数据框中绘制了一列数据。x轴是日期轴。
for month in months:
alldataframes[month].Column1.plot( axarr[0] )
第二和第三个子图没问题,没什么好说的。
这里大约有200个月的数据,所以第一个子图里有200条不同的“线”。我想让用户可以选择显示哪些“线”,这样可以让这个子图看起来不那么杂乱。我可以考虑显示200个复选框,每个月一个。勾选一个框就可以在第一个子图中显示或隐藏对应的月份。
有没有更方便的方式来实现这个?如果没有,我该如何用pyqt4或者matplotlib来做到这一点呢?
谢谢
1 个回答
0
你可以把matplotlib的图像嵌入到pyqt的界面里,不过这个过程有点复杂。对于你的情况,你可以在现有的图像上添加一个qt的停靠面板。下面是一个例子:
import numpy as np
import matplotlib
matplotlib.use("Qt4Agg") # This program works with Qt only
import pylab as pl
fig, ax1 = pl.subplots()
t = np.linspace(0, 10, 200)
lines = []
for freq in np.linspace(1, 10, 30):
lines.extend(pl.plot(t, np.sin(2*np.pi*freq*t), label="f={}".format(freq)))
### control panel ###
from PyQt4 import QtGui
from PyQt4 import QtCore
from PyQt4.QtCore import Qt
root = fig.canvas.manager.window
panel = QtGui.QWidget()
hbox = QtGui.QHBoxLayout(panel)
list_box = QtGui.QListWidget(parent = panel)
list_box.setSelectionMode(QtGui.QListWidget.MultiSelection)
list_box.setFlow(QtGui.QListView.LeftToRight)
list_box.setWrapping(True)
list_box.setGridSize(QtCore.QSize(150, 20))
for line in lines:
list_box.addItem(line.get_label())
button_update = QtGui.QPushButton("update", panel)
def on_update(event):
selected_labels = set([item.text() for item in list_box.selectedItems()])
for line in lines:
line.set_visible(line.get_label() in selected_labels)
fig.canvas.draw()
button_update.clicked.connect(on_update)
hbox.addWidget(list_box)
hbox.addWidget(button_update)
panel.setLayout(hbox)
dock = QtGui.QDockWidget("control", root)
root.addDockWidget(Qt.BottomDockWidgetArea, dock)
dock.setWidget(panel)
######################
fig.show()
这是界面的样子: