散点交互示例
在本文中我们演示使用散点图在图表中进行交互的示例,在图表中创建两个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()点击信号实现选中序列中的点。