QChart を使って棒グラフを作成してみました。
公式のサンプルは以下です。
基本的な挙動は上記が理解しやすいと思いますが、実際にはループで処理することが多いと思うので、少し変更してみました。 pandas などと組み合わせれば大量のデータであっても効率的にグラフを作成できると思います。
環境
- PySide 6.2.2.1
サンプル
import sys
from PySide6.QtWidgets import *
from PySide6.QtCore import Qt
from PySide6.QtCharts import *
from PySide6.QtGui import QPainter, QCursor
class BarChartSample(QChartView):
__categories = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun']
__samples = {
'Hoge': [9, 7, 5, 3, 1, 2],
'Piyo': [3, 5, 8, 13, 8, 5],
'Fuga': [5, 0, 0, 4, 0, 7],
'Foo': [1, 2, 3, 4, 5, 6],
'Bar': [5, 6, 7, 3, 4, 5],
}
def __init__(self, parent = None):
super().__init__(parent)
series = QBarSeries()
#series = QStackedBarSeries()
for key, values in self.__samples.items():
barset = QBarSet(key)
for value in values:
barset.append(value)
series.append(barset)
chart = QChart()
chart.addSeries(series)
chart.setTitle('Barchart example')
chart.setAnimationOptions(QChart.SeriesAnimations)
axis_x = QBarCategoryAxis()
axis_x.append(self.__categories)
chart.addAxis(axis_x, Qt.AlignBottom)
series.attachAxis(axis_x)
axis_y = QValueAxis()
chart.addAxis(axis_y, Qt.AlignLeft)
series.attachAxis(axis_y)
chart.legend().setVisible(True)
chart.legend().setAlignment(Qt.AlignBottom)
self.setRenderHint(QPainter.Antialiasing)
self.setChart(chart)
class MainWindows(QMainWindow):
def __init__(self):
super().__init__()
barchart = BarChartSample(self)
self.setCentralWidget(barchart)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindows()
window.show()
window.resize(720, 480)
sys.exit(app.exec())
QBarSeries
を QStackedBarSeries
に変更すれば積み上げグラフになります。
参考 URL
- https://doc.qt.io/qtforpython/examples/example_charts__barchart.html
- https://doc.qt.io/qt-5/qbarset.html#append
- https://bitwalk.blogspot.com/2021/07/qt-for-python-3.html
- https://doc.qt.io/qt-5/qchart.html#ChartTheme-enum
- https://runebook.dev/ja/docs/qt/qbarset
- https://runebook.dev/ja/docs/qt/qabstractbarseries#clicked
- https://doc.qt.io/qt-5/qstackedbarseries.html