BarChart2D Example

import sys, os
sys.path.append(os.path.dirname(os.path.realpath(__file__)) + "/../shared")

from PySide2 import QtCore
from PySide2.QtCore import Qt, SIGNAL, SLOT, QDate
from PySide2.QtGui import QBrush
from PySide2.QtWidgets import QApplication, QComboBox, QSlider, QLabel, QCheckBox

from DevMachines.QtitanBase import Qtitan
from DevMachines.QtitanChart import (ChartBarSeries2D, ChartStackedBarSeries2D, ChartBarSeriesLabel, ChartLegend)

from DemoChartWindow import DemoChartWindow

class MainWindow(DemoChartWindow):
    ClusteredSeries = 0
    StackedSeries = 1
    Stacked100Series = 2
    SideBySideSeries = 3
    def __init__(self):
        DemoChartWindow.__init__(self, "Bar Chart")
        self.setChart(None)
        self.displayShadow = True
        self.createSeriesParametrs()
        self.seriesChanged(self.seriesSwitcher.currentIndex())

    def createSeriesParametrs(self):
        # Option Series
        seriesTypeGroup = self.createGroupParameters(self.tr("Series"))

        self.seriesSwitcher = QComboBox(seriesTypeGroup)
        self.seriesSwitcher.addItem("Clustered", MainWindow.ClusteredSeries)
        self.seriesSwitcher.addItem("Stacked", MainWindow.StackedSeries)
        self.seriesSwitcher.addItem("100% Stacked", MainWindow.Stacked100Series)
        self.seriesSwitcher.addItem("Side by Side Stacked", MainWindow.SideBySideSeries)
        self.connect(self.seriesSwitcher, SIGNAL("currentIndexChanged(int)"), self, SLOT("seriesChanged(int)"))

        layout = seriesTypeGroup.layout()
        layout.addRow(self.seriesSwitcher)

        self.displayShadowBox = QCheckBox(self.tr("Display shadow"), self)
        self.connect(self.displayShadowBox, SIGNAL("toggled(bool)"), self, SLOT("displayShadowChanged(bool)"))
        layout.addRow(self.displayShadowBox)

        # Option Labels
        self.dataLabelsGroup = self.createGroupParameters(self.tr("Show Data Labels"), True)
        layout = self.dataLabelsGroup.layout()

        self.connect(self.dataLabelsGroup, SIGNAL("toggled(bool)"), self, SLOT("showDataLabels(bool)"))
        self.posDataLabelsSwitcher = QComboBox(self.dataLabelsGroup)
        self.posDataLabelsSwitcher.addItem(self.tr("Top"), ChartBarSeriesLabel.ChartBarLabelTop)
        self.posDataLabelsSwitcher.addItem(self.tr("Center"), ChartBarSeriesLabel.ChartBarLabelCenter)
        self.posDataLabelsSwitcher.setCurrentIndex(1)
        self.connect(self.posDataLabelsSwitcher, SIGNAL("currentIndexChanged(int)"),
        self, SLOT("labelsPositionChanged(int)"))
        layout.addRow(self.posDataLabelsSwitcher)

    def createSeries(self, _type):
        series = None
        if _type == MainWindow.StackedSeries or _type == MainWindow.Stacked100Series:
            series = ChartStackedBarSeries2D()
        else:
            series = ChartBarSeries2D()

        if _type == MainWindow.Stacked100Series:
            series.setStackHeight(100.0)

        return series

    def createBarSeries(self, _type):
        self.createTitle(self.tr("Results"))

        self.chart.legend().setVisible(True)
        self.chart.legend().setVerticalAlignment(ChartLegend.LegendCenter)

        series1 = self.createSeries(_type)
        self.chart.appendSeries(series1)

        series1.setName(self.tr("Atom 330"))
        series1.addAxisPointY(490, "Double-Precision 2")
        series1.addAxisPointY(50,  "Double-Precision 3")
        series1.addAxisPointY(100, "Double-Precision 4")
        series1.addAxisPointY(400, "Double-Precision 5")
        series1.addAxisPointY(60,  "Double-Precision 6")
        series1.addAxisPointY(530, "Double-Precision 7")
        series1.addAxisPointY(230, "Double-Precision 8")
        series1.addAxisPointY(510, "Double-Precision 9")
        series1.addAxisPointY(505, "Double-Precision 10")
        series1.addAxisPointY(490, "Double-Precision 11")

        listViews = self.chart.views()
        view2D = listViews[0]
        axisX = view2D.axisX()
        axisX.label().setAngle(45)

        series2 = self.createSeries(_type)
        self.chart.appendSeries(series2)

        series2.setName(self.tr("Athlon 64 x2"))
        series2.addAxisPointY(1000, "Double-Precision 2" )
        series2.addAxisPointY(500,  "Double-Precision 3" )
        series2.addAxisPointY(100,  "Double-Precision 4" )
        series2.addAxisPointY(900,  "Double-Precision 5" )
        series2.addAxisPointY(100,  "Double-Precision 6" )
        series2.addAxisPointY(730,  "Double-Precision 7" )
        series2.addAxisPointY(30,   "Double-Precision 8" )
        series2.addAxisPointY(100,  "Double-Precision 9" )
        series2.addAxisPointY(1600, "Double-Precision 10")
        series2.addAxisPointY(890 , "Double-Precision 11")

        series3 = self.createSeries(_type)
        self.chart.appendSeries(series3)

        series3.setName(self.tr("2x Xeon 5500"))
        series3.addAxisPointY(1900, "Double-Precision 2" )
        series3.addAxisPointY(600,  "Double-Precision 3" )
        series3.addAxisPointY(500,  "Double-Precision 4" )
        series3.addAxisPointY(2500, "Double-Precision 5" )
        series3.addAxisPointY(1500, "Double-Precision 6" )
        series3.addAxisPointY(1500, "Double-Precision 7" )
        series3.addAxisPointY(3000, "Double-Precision 8" )
        series3.addAxisPointY(2400, "Double-Precision 9" )
        series3.addAxisPointY(1600, "Double-Precision 10")
        series3.addAxisPointY(890,  "Double-Precision 11")

    def createSideBySideSeries(self):
        self.chart.legend().setVisible(True)
        self.chart.legend().setVerticalAlignment(ChartLegend.LegendNear)

        for i in range(0, 4):
            series = ChartStackedBarSeries2D()
            self.chart.appendSeries(series)

            series.setName("Qtitan {0:d} Project 1".format(i + 1))
            series.setStackGroup(i)

            series.addAxisPointY(8 + QtCore.qrand() % 20,  self.tr("USA"))
            series.addAxisPointY(12 + QtCore.qrand() % 20, self.tr("Europe"))
            series.addAxisPointY(7 + QtCore.qrand() % 20,  self.tr("Asia"))

            series = ChartStackedBarSeries2D()
            self.chart.appendSeries(series)
            series.setName("Qtitan {0:d} Project 2".format(i + 1))
            series.setStackGroup(i)

            series.addAxisPointY(10 + QtCore.qrand() % 20, self.tr("USA"))
            series.addAxisPointY(8 + QtCore.qrand() % 20,  self.tr("Europe"))
            series.addAxisPointY(12 + QtCore.qrand() % 20, self.tr("Asia"))

    def updateValueParameters(self):
        DemoChartWindow.updateValueParameters(self)
        if self.displayShadow:
            self.displayShadowBox.setCheckState(Qt.Checked)
        else:
            self.displayShadowBox.setCheckState(Qt.Unchecked)
        self.labelsPositionChanged(self.posDataLabelsSwitcher.currentIndex())

    def displayShadowSeries(self):
        listSeries = self.chart.series()
        for series in listSeries:
            series.setShadow(self.displayShadow)

    def seriesChanged(self, index):
        self.chart.clearSeries()
        self.chart.clearTitles()
        self.chart.setBackgroundBrush(QBrush())

        v = self.seriesSwitcher.itemData(index)
        if v == MainWindow.ClusteredSeries or v == MainWindow.StackedSeries or v == MainWindow.Stacked100Series:
            self.createBarSeries(v)
        elif v == MainWindow.SideBySideSeries:
            self.createSideBySideSeries()

        self.displayShadowSeries()
        self.updateValueParameters()

    def labelsPositionChanged(self, index):
        v = self.posDataLabelsSwitcher.itemData(index)
        listSeries = self.chart.series()
        for series in listSeries:
            label = series.label()
            label.setPosition(ChartBarSeriesLabel.BarLabelPosition(int(v)))

    def typeSeriesChanged(self, state):
        state = state

    def displayShadowChanged(self, checked):
        if self.displayShadow != checked:
            self.displayShadow = checked
            self.displayShadowSeries()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())