from
PyQt5.QtWidgets
import
*
import
sys
import
numpy as np
import
pyqtgraph as pg
from
PyQt5.QtGui
import
*
from
PyQt5.QtCore
import
*
from
collections
import
namedtuple
class
Window(QMainWindow):
def
__init__(
self
):
super
().__init__()
self
.setWindowTitle(
"PyQtGraph"
)
self
.setGeometry(
100
,
100
,
600
,
500
)
icon
=
QIcon(
"skin.png"
)
self
.setWindowIcon(icon)
self
.UiComponents()
self
.show()
def
UiComponents(
self
):
widget
=
QWidget()
label
=
QLabel(
"Geeksforgeeks Scatter Plot Graph with Text"
)
label.setMinimumWidth(
130
)
label.setWordWrap(
True
)
pg.setConfigOptions(antialias
=
True
)
plt
=
pg.plot()
TextSymbol
=
namedtuple(
"TextSymbol"
,
"label symbol scale"
)
n
=
150
def
createLabel(label, angle):
symbol
=
QPainterPath()
f
=
QFont()
f.setPointSize(
10
)
symbol.addText(
0
,
0
, f, label)
br
=
symbol.boundingRect()
scale
=
min
(
1.
/
br.width(),
1.
/
br.height())
tr
=
QTransform()
tr.scale(scale, scale)
tr.rotate(angle)
tr.translate(
-
br.x()
-
br.width()
/
2.
,
-
br.y()
-
br.height()
/
2.
)
return
TextSymbol(label, tr.
map
(symbol),
0.1
/
scale)
def
random_str():
return
(
'
'.join([chr(np.random.randint(ord('
A
'), ord('
z')))
for
i
in
range
(np.random.randint(
1
,
5
))]),
np.random.randint(
0
,
360
))
scatter
=
pg.ScatterPlotItem(size
=
10
, pen
=
pg.mkPen(
'w'
), pxMode
=
True
)
pos
=
np.random.normal(size
=
(
2
, n), scale
=
1e
-
5
)
spots
=
[{
'pos'
: pos[:, i],
'data'
:
1
,
'brush'
: pg.intColor(i, n),
'symbol'
: i
%
5
,
'size'
:
5
+
i
/
10.
}
for
i
in
range
(n)]
scatter.addPoints(spots)
spots
=
[{
'pos'
: pos[:, i],
'data'
:
1
,
'brush'
: pg.intColor(i, n),
'symbol'
: label[
1
],
'size'
: label[
2
]
*
(
5
+
i
/
10.
)}
for
(i, label)
in
[(i, createLabel(
*
random_str()))
for
i
in
range
(n)]]
scatter.addPoints(spots)
plt.addItem(scatter)
layout
=
QGridLayout()
label.setMinimumWidth(
130
)
widget.setLayout(layout)
layout.addWidget(label,
1
,
0
)
layout.addWidget(plt,
0
,
1
,
3
,
1
)
self
.setCentralWidget(widget)
App
=
QApplication(sys.argv)
window
=
Window()
sys.exit(App.
exec
())