【问题标题】:How to smooth a graph in pyqtgraph?如何在pyqtgraph中平滑图形?
【发布时间】:2021-01-31 06:31:25
【问题描述】:

我用 pyqtgraph 绘制了一个图表,现​​在我正在尝试“平滑”图表(而不是 zigzag),它(我读过)应该与 antialias 一起使用,但我找不到正确的“位置”让它发挥作用。

import sys
from PyQt5 import QtWidgets
import pyqtgraph as pg

class MainWindow(QtWidgets.QMainWindow):

    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)
        self.plot()

    def plot(self):
        self.graphWidget = pg.PlotWidget()
        self.setCentralWidget(self.graphWidget)
        self.graphWidget.setBackground('w')
        pen = pg.mkPen(color=('b'), width=2)
        styles = {'color':'r', 'font-size':'15px'}

        self.graphWidget.setConfigOptions(antialias=True)  # AttributeError: setConfigOptions

        self.graphWidget.setLabel('left', 'x-values', **styles)
        self.graphWidget.setLabel('bottom', 'y-values', **styles)
        
        x_values = [1, 2, 3, 4, 5]
        y_values = [2, 1, 2, 4, 3]

        self.graphWidget.plot(x_values, y_values, pen=pen, symbol='o',
                                   symbolSize=8, symbolPen='k', symbolBrush='k')

def main():
    app = QtWidgets.QApplication(sys.argv)
    main = MainWindow()
    main.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

我也试过这个,但没有成功(没有做任何不同的事情):

pen = pg.mkPen(color=('b'), width=2, antialias=True)
self.graphWidget.plot(x_values, y_values, pen=pen, symbol='o',
                                   symbolSize=8, symbolPen='k', symbolBrush='k', antialias=True)

如果有人能告诉我如何使用此权限(或者是否有其他选项可以平滑图表),我将非常高兴。

我正在使用 Python 3.8、PyQt5 5.15.0、PyCharm 2020.2 和 Linux Mint 19.3。

【问题讨论】:

    标签: python pyqt5 pyqtgraph


    【解决方案1】:

    anti-aliasing 属性的目的不是使绘制的曲线平滑,而是使绘制平滑。如果您想要平滑曲线,则必须对点进行插值,例如使用 scipy.interpolate.make_interp_spline:

    import sys
    from PyQt5 import QtWidgets
    import pyqtgraph as pg
    import numpy as np
    from scipy.interpolate import make_interp_spline
    
    
    class MainWindow(QtWidgets.QMainWindow):
        def __init__(self, *args, **kwargs):
            super(MainWindow, self).__init__(*args, **kwargs)
            self.plot()
    
        def plot(self):
            pg.setConfigOptions(antialias=True)
            self.graphWidget = pg.PlotWidget()
            self.setCentralWidget(self.graphWidget)
            self.graphWidget.setBackground("w")
            pen = pg.mkPen(color=("b"), width=2)
            styles = {"color": "r", "font-size": "15px"}
    
            self.graphWidget.setLabel("left", "x-values", **styles)
            self.graphWidget.setLabel("bottom", "y-values", **styles)
    
            x_values = [1, 2, 3, 4, 5]
            y_values = [2, 1, 2, 4, 3]
    
            xnew = np.linspace(min(x_values), max(x_values), 100)
            spl = make_interp_spline(x_values, y_values, 3)
            ynew = spl(xnew)
    
            self.graphWidget.plot(xnew, ynew, pen=pen)
    
    
    def main():
        app = QtWidgets.QApplication(sys.argv)
        main = MainWindow()
        main.show()
        sys.exit(app.exec_())
    
    
    if __name__ == "__main__":
        main()
    

    【讨论】:

      【解决方案2】:

      正如documentation 中所述,您必须为模块设置抗锯齿:

      pg.setConfigOptions(antialias=True)
      

      另外,由于所有pyqtgraph 图实际上都是QGraphicsView 的子类,因此设置适当的renderHints()

      self.graphWidget.setRenderHints(QtGui.QPainter.Antialiasing)
      

      【讨论】:

        猜你喜欢
        • 2023-03-29
        • 2021-11-28
        • 2021-03-07
        • 1970-01-01
        • 2023-03-22
        • 2021-03-21
        • 2016-02-29
        • 2023-03-08
        • 2015-07-21
        相关资源
        最近更新 更多