2017-05-26 114 views
0

我想绘制Matplotlib中同一轴上的线条和数据点。当我尝试首先绘制线条时,数据点被清除,并且当我尝试首先绘制数据点时也是如此。下面是最少的代码:使用Matplotlib Widget同时绘制数据点和线条

from PyQt4 import QtGui 
import sys 
import ui_sof_test #Gui File 
from matplotlib.ticker import AutoMinorLocator 

class Gui(QtGui.QMainWindow, ui_sof_test.Ui_MainWindow): 

    def __init__(self):   
     super(self.__class__, self).__init__()   
     self.setupUi(self) 
     self.call_test() 
    def call_test(self): 
     x = [1,2,3,4,5,6,7,8,9,10] 
     y = [1000,2000,3000,4000,5000,6000,7000,8000,9000,10000] 
     self.plot_test(x,y) 
    def plot_test(self, x, y):   
     ax1 = self.mplwidget.axes 
     fig = self.mplwidget.figure #Add a figure 
     ax1.plot(x, y, 'k', linestyle = "solid", linewidth = 1) 
     ax1.plot(x, y, "ro")   
     #Log scale 
     ax1.set_xscale('log') 
     ax1.set_yscale('log') 
     #format tick labels 
     ax1.axis([1, 20, 100, 100000]) 
     #set Limits   

     #Gridlines 
     #Plot y axis minor tick marks 

     minorLocatory = AutoMinorLocator() 
     ax1.yaxis.set_minor_locator(minorLocatory) 
     ax1.tick_params(which='both', width= 0.5) 
     ax1.tick_params(which='major', length=7) 
     ax1.tick_params(which='minor', length=4, color='k') 
     ax1.minorticks_on() 
     #Make Border of Chart White 
     fig.set_facecolor('white') 
     #Plot Grid   
     ax1.grid(b=True, which='both', color='k', linestyle='-')  

     #Draw Chart 
     fig.canvas.update() 
     fig.canvas.draw()  

def main(): 
    app = QtGui.QApplication(sys.argv) # A new instance of QApplication 
    form = Gui() # We set the form to be our ExampleApp (design) 
    form.show() # Show the form 
    app.exec_() # and execute the. app 

if __name__ == '__main__': # if we're running file directly and not importing it 
    main() # run the main function 
` 

这里从PyQt4的UI文件中创建Python代码。只要将它保存为ui_sof_test.py:

from PyQt4 import QtCore, QtGui 

try: 
    _fromUtf8 = QtCore.QString.fromUtf8 
except AttributeError: 
    def _fromUtf8(s): 
     return s 

try: 
    _encoding = QtGui.QApplication.UnicodeUTF8 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig, _encoding) 
except AttributeError: 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig) 

class Ui_MainWindow(object): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName(_fromUtf8("MainWindow")) 
     MainWindow.resize(1441, 705) 
     self.centralwidget = QtGui.QWidget(MainWindow) 
     self.centralwidget.setObjectName(_fromUtf8("centralwidget")) 
     self.tabWidget = QtGui.QTabWidget(self.centralwidget) 
     self.tabWidget.setGeometry(QtCore.QRect(0, 0, 1111, 671)) 
     self.tabWidget.setObjectName(_fromUtf8("tabWidget")) 
     self.tab = QtGui.QWidget() 
     self.tab.setObjectName(_fromUtf8("tab")) 
     self.mplwidget = MatplotlibWidget(self.tab) 
     self.mplwidget.setGeometry(QtCore.QRect(10, 20, 761, 461)) 
     self.mplwidget.setObjectName(_fromUtf8("mplwidget")) 
     self.tabWidget.addTab(self.tab, _fromUtf8("")) 
     MainWindow.setCentralWidget(self.centralwidget) 
     self.menubar = QtGui.QMenuBar(MainWindow) 
     self.menubar.setGeometry(QtCore.QRect(0, 0, 1441, 21)) 
     self.menubar.setObjectName(_fromUtf8("menubar")) 
     MainWindow.setMenuBar(self.menubar) 
     self.statusbar = QtGui.QStatusBar(MainWindow) 
     self.statusbar.setObjectName(_fromUtf8("statusbar")) 
     MainWindow.setStatusBar(self.statusbar) 

     self.retranslateUi(MainWindow) 
     self.tabWidget.setCurrentIndex(0) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 

    def retranslateUi(self, MainWindow): 
     MainWindow.setWindowTitle(_translate("MainWindow", "Motor Tester", None)) 
     self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Test", None)) 

from matplotlibwidget import MatplotlibWidget 
+0

实际上,我绘制相同的数据。我只是在线上覆盖数据点。 –

+0

我也只是尝试没有日志规模。我得到了同样的结果。 –

+0

@ImportanceOfBeingErnest我相信我的问题符合标准。期望的行为:绘制数据点和线,具体问题:将绘制一个或另一个,但不是两个。另外,代码很短。我感谢你的回答,但我的代码仍然不会产生这两个情节。有人可以告诉我为什么吗? –

回答

2

出于某种原因,第一条曲线会从轴在绘制第二个删除。
解决方法是在绘制第二个图后手动添加第一个图。

line, = ax1.plot(x, y, 'k', linestyle = "solid", linewidth = 1) 
line2, = ax1.plot(x, y, marker="o", color="red", ls="") 
ax1.add_artist(line) 

由于在原则上绘制程序工作正常(如下图所示),其原因必须使用MatplotlibWidget,对此我不确定其实际作用。

但是,如果我们通过

fig = Figure() 
ax = fig.add_subplot(111) 
self.mplwidget = FigureCanvas(fig) 
self.tabWidget.addTab(self.mplwidget, _fromUtf8("")) 

取代它,我们有进口

from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas 
from matplotlib.figure import Figure 

,并在以后使用

ax1 = self.mplwidget.figure.axes[0] 

预期该地块所示。 所以你可能会停止使用MatplotlibWidget,如果它导致这样的奇怪问题。


小例子,表明这些原则绘制按预期工作:

import matplotlib.pyplot as plt 
from matplotlib.ticker import AutoMinorLocator 
import numpy as np 

class C(): 
    def __init__(self): 
     self.mplwidget = self 
     self.figure = plt.figure() 
     self.axes = self.figure.add_subplot(111) 

    def plot_test(self, x, y): 
     ax1 = self.mplwidget.axes 
     fig = self.mplwidget.figure #Add a figure 
     ax1.plot(x, y, 'k', linestyle = "solid", linewidth = 1) 
     ax1.plot(x, y, "ro")   
     #Log scale 
     ax1.set_xscale('log') 
     ax1.set_yscale('log') 
     #format tick labels 
     ax1.axis([1, 20, 100, 100000]) 
     #set Limits   

     #Gridlines 
     #Plot y axis minor tick marks 
     minorLocatory = AutoMinorLocator() 
     ax1.yaxis.set_minor_locator(minorLocatory) 
     ax1.tick_params(which='both', width= 0.5) 
     ax1.tick_params(which='major', length=7) 
     ax1.tick_params(which='minor', length=4, color='k') 
     ax1.minorticks_on() 
     #Make Border of Chart White 
     fig.set_facecolor('white') 
     #Plot Grid   
     ax1.grid(b=True, which='both', color='k', linestyle='-')   
     #Draw Chart 
     fig.canvas.update() 
     fig.canvas.draw() 

x, y = np.linspace(1,20), np.logspace(2, 5) 

c = C() 
c.plot_test(x,y) 
plt.show() 

enter image description here

+0

我更新了解决方案。 – ImportanceOfBeingErnest