尝试在PyQt5和Matplotlib中使用python绘制饼图,但出现了一些问题。我可以有一个饼图和要显示的数据,但是如果我在调用某个函数时向其提供新数据,则我将尝试更新该图。
mplvl是我要添加图形的窗口小部件名称。
每次我调用此函数时,它只会添加另一个子图。我已经尝试过清除图形,清除图形,但是我无法仅仅删除并重绘图形。我认为我对Matplotlib的真正工作方式感到困惑,但是任何帮助将不胜感激。
import datetime
import calendar as cal
import sys
from PyQt5 import QtCore
from PyQt5.QtWidgets import QApplication, QDialog, QMainWindow, QMessageBox, QTableWidgetItem
from PyQt5.uic import loadUi
from matplotlib.figure import Figure
from matplotlib.backends.backend_qt5agg import (FigureCanvasQTAgg as FigureCanvas)
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
loadUi('main.ui', self)
self.date_from.setDate(QtCore.QDate(c_date.year, c_date.month, 1))
self.date_to.setDate(QtCore.QDate(c_date.year, c_date.month, cal.monthrange(c_date.year, c_date.month)[1]))
self.date_from.dateChanged.connect(self.fcn_date_changed)
self.date_to.dateChanged.connect(self.fcn_date_changed)
def fcn_date_changed(self):
print("from: " + self.date_from.text() + " to: " + self.date_to.text())
labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
sizes = [15, 30, 45, 10]
fig = Figure()
ax1 = fig.add_subplot(111)
ax1.set_title('Percentage Spending by Category')
ax1.pie(sizes, labels=labels, autopct='%1.1f%%', shadow=False, startangle=90)
main.canvas = FigureCanvas(fig)
main.mplvl.addWidget(main.canvas)
if __name__ == "__main__":
app = QApplication(sys.argv)
main_window = MainWindow()
main_window.show()
sys.exit(app.exec_())
下面是main.ui:
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>861</width>
<height>611</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="QPushButton" name="btn_add_item">
<property name="geometry">
<rect>
<x>10</x>
<y>10</y>
<width>71</width>
<height>41</height>
</rect>
</property>
<property name="text">
<string>Add Item</string>
</property>
</widget>
<widget class="QPushButton" name="btn_edit_item">
<property name="geometry">
<rect>
<x>190</x>
<y>540</y>
<width>81</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>Edit Item</string>
</property>
</widget>
<widget class="QListWidget" name="recent_items">
<property name="geometry">
<rect>
<x>10</x>
<y>130</y>
<width>351</width>
<height>401</height>
</rect>
</property>
</widget>
<widget class="QLabel" name="lbl_recent_items">
<property name="geometry">
<rect>
<x>10</x>
<y>110</y>
<width>251</width>
<height>16</height>
</rect>
</property>
<property name="text">
<string>Recent Items</string>
</property>
</widget>
<widget class="QPushButton" name="btn_delete_item">
<property name="geometry">
<rect>
<x>280</x>
<y>540</y>
<width>81</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>Delete Item</string>
</property>
</widget>
<widget class="QWidget" name="mplwindow" native="true">
<property name="geometry">
<rect>
<x>380</x>
<y>130</y>
<width>471</width>
<height>401</height>
</rect>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<layout class="QVBoxLayout" name="mplvl"/>
</widget>
<widget class="QPushButton" name="btn_view_items">
<property name="geometry">
<rect>
<x>280</x>
<y>100</y>
<width>81</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>View Items</string>
</property>
</widget>
<widget class="QDateEdit" name="date_from">
<property name="geometry">
<rect>
<x>110</x>
<y>60</y>
<width>110</width>
<height>21</height>
</rect>
</property>
<property name="calendarPopup">
<bool>true</bool>
</property>
</widget>
<widget class="QDateEdit" name="date_to">
<property name="geometry">
<rect>
<x>250</x>
<y>60</y>
<width>110</width>
<height>21</height>
</rect>
</property>
<property name="calendarPopup">
<bool>true</bool>
</property>
</widget>
<widget class="QLabel" name="lbl_showing_items1">
<property name="geometry">
<rect>
<x>10</x>
<y>60</y>
<width>101</width>
<height>21</height>
</rect>
</property>
<property name="text">
<string>Showing items from: </string>
</property>
</widget>
<widget class="QLabel" name="lbl_showing_items1_2">
<property name="geometry">
<rect>
<x>230</x>
<y>60</y>
<width>21</width>
<height>21</height>
</rect>
</property>
<property name="text">
<string>to:</string>
</property>
</widget>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>861</width>
<height>21</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>
答案 0 :(得分:3)
逻辑是:
AxesSubplot
,pie(
))draw()
进行绘画。 # ...
self.date_to.dateChanged.connect(self.fcn_date_changed)
fig = Figure()
self.canvas = FigureCanvas(fig)
self.mplvl.addWidget(self.canvas)
self.ax1 = fig.add_subplot(111)
self.ax1.pie([])
def fcn_date_changed(self):
self.ax1.clear()
self.ax1.set_title("Percentage Spending by Category")
print("from: " + self.date_from.text() + " to: " + self.date_to.text())
labels = "Frogs", "Hogs", "Dogs", "Logs"
sizes = [15, 30, 45, 10]
self.ax1.pie(
sizes, labels=labels, autopct="%1.1f%%", shadow=False, startangle=90
)
self.ax1.figure.canvas.draw()