from PyQt5.QtWidgets import QApplication, QMainWindow, QToolTip
import sys
from PyQt5.QtChart import QChart, QChartView, QBarSet, QPercentBarSeries, QBarCategoryAxis
from PyQt5.QtGui import QPainter, QPixmap, QTransform
from PyQt5.QtCore import Qt, QPointF, QRect
from functools import partial


class Window(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("PyQt BarChart")
        self.setGeometry(100,100, 480,300)
        self.show()
        self.create_bar()      

    def create_bar(self):        
        series = QPercentBarSeries()        
        set_items = {"Parwiz":[1 , 2 , 3 , 4 , 5 , 6],
                       "Bob":[ 5 , 0 , 0 , 4 , 0 , 7],
                       "Tom":[3 , 5 , 8 , 13 , 8 , 5],
                       "Logan":[ 5 , 6 , 7 , 3 , 4 , 5],
                       "Karim":[9, 7, 5, 3, 1, 6]}

        for name, values in set_items.items():
            _set = QBarSet(name)
            _set.append(values)
            _set.hovered.connect(partial(self.show_tooltip, _set.label(), values))
            _set.doubleClicked.connect(self.resetZoom)
            series.append(_set) 
            
      
        self.chart = QChart()
        self.chart.addSeries(series)
        self.chart.setTitle("Percent Example")
        
        self.chart.setAnimationOptions(QChart.SeriesAnimations)

        self.categories = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"]
        axis = QBarCategoryAxis()
        axis.append(self.categories)
        self.chart.createDefaultAxes()
        self.chart.setAxisX(axis, series)

        self.chart.legend().setVisible(True)
        self.chart.legend().setAlignment(Qt.AlignBottom)

        
        chartView = QChartView(self.chart)
        chartView.setRenderHint(QPainter.Antialiasing)
        chartView.setGeometry(100,100, 800,480)  
        chartView.setInteractive(True)    
        chartView.setRubberBand(chartView.RectangleRubberBand)        

        self.setCentralWidget(chartView)
        
    def show_tooltip(self, label, values):
               
        hoverPoint = QPointF(self.chart.cursor().pos().x() - self.x(), 
                             self.chart.cursor().pos().y() - self.y())
        
        bar_coords = self.chart.mapToValue(hoverPoint)
        index_ = int(round(bar_coords.x(),0))

        try:
            category = self.categories[index_]          
            text = f'Label: {label}\nCategory: {category}\nValue: {values[index_]}'
            QToolTip.showText(self.chart.cursor().pos(), text,  self)         
        except IndexError: #Out of chart range
            pass    


App = QApplication(sys.argv)
window = Window()
sys.exit(App.exec_())