实战PyQt5: 161-QChart图表之散点图交互操作

散点交互示例

在本文中我们演示使用散点图在图表中进行交互的示例,在图表中创建两个QScatterSeries序列,序列1添加数据,构成一个8x8排列的散点图表,序列2为一个序列,将这两个序列都添加到图表中,并显示出来,如下图:

 

然后我们给散点序列的点击信号clicked()连接一个槽函数handleClickedPoint来处理这个点击事件,在handleClickedPoint()中,根据鼠标的点击,计算出选中的散点位置,并将该散点值从散点序列1中移除,添加到散点序列2中。

代码

完整代码如下:

import sys,math
from PyQt5.QtCore import Qt, QPointF
from PyQt5.QtGui import QPainter
from PyQt5.QtWidgets import QApplication, QMainWindow
from  PyQt5.QtChart import QChartView, QChart, QScatterSeries
 
class MyChartView(QChartView):
    def __init__(self, parent = None):
        super(MyChartView, self).__init__(parent)
        self. setRenderHint(QPainter.Antialiasing)
        
        self.chart().setTitle('单击与散点进行交互')
        
        self.scatter = QScatterSeries()
        self.scatter.setName('散点1')
        for x in range(8):
            for y in range(8):
                self.scatter.append(QPointF(0.5*(1+x), 0.5*(1+y)))
        self.scatter2 = QScatterSeries()
        self.scatter2.setName('散点2')
        
        self.chart().addSeries(self.scatter2)
        self.chart().addSeries(self.scatter)
        self.chart().createDefaultAxes()
        self.chart().axes(Qt.Horizontal)[0].setRange(0, 4.5)
        self.chart().axes(Qt.Vertical)[0].setRange(0, 4.5)
        
        self.scatter.clicked.connect(self.handleClickedPoint)
        
    def handleClickedPoint(self, point):
        clickedPoint = point
        #从散点序列中发现最接近的点
        closest = QPointF(-sys.maxsize-1,  sys.maxsize)
        distance = sys.maxsize
        points = self.scatter.pointsVector()
        for currentPoint in points:
            dx = currentPoint.x() - clickedPoint.x()
            dy = currentPoint.y() - clickedPoint.y()
            currentDistance = math.sqrt(dx * dx + dy * dy)
            if currentDistance < distance:
                distance = currentDistance
                closest = currentPoint
                
        #从散点序列1中删除最近的点,并将其附加到散点序列2中
        self.scatter.remove(closest)
        self.scatter2.append(closest)
        
 
class DemoScatterInteractions(QMainWindow):
    def __init__(self, parent=None):
        super(DemoScatterInteractions, self).__init__(parent)   
        
         # 设置窗口标题
        self.setWindowTitle('实战 Qt for Python: 散点图交互演示')      
        # 设置窗口大小
        self.resize(480, 360)
        
        chartView = MyChartView(self)  
        self.setCentralWidget(chartView)
      
        
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = DemoScatterInteractions()
    window.show()
    sys.exit(app.exec())   

运行效果如下图:

 散点图交互示例

本文知识点

  • 使用QScatterSeries.clicked()点击信号实现选中序列中的点。

前一篇: 实战PyQt5:160-QChart图表之对图表进行交互操作

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值