matplotlib pyqt4 pandas:多个复选框选择显示哪些图表

0 投票
1 回答
1802 浏览
提问于 2025-05-01 01:28

我有以下的导入:

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()

这是界面的样子:

在这里输入图片描述

撰写回答