Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Qt for Python
  4. How can I plot a pie chart from a database?
Forum Updated to NodeBB v4.3 + New Features

How can I plot a pie chart from a database?

Scheduled Pinned Locked Moved Unsolved Qt for Python
17 Posts 4 Posters 1.3k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • L Offline
    L Offline
    LT-K101
    wrote on last edited by
    #1

    I want to plot a pie chart using the values obtained from my query but I'm finding it difficult to do so. The example below has values already assigned to it. Please how can I use the results obtained in the table in the image below to plot similar pie chart ?

    Sample Code

     #create pieseries
            series  = QPieSeries()
     
            #append some data to the series 
            series.append("Apple", 80)
            series.append("Banana", 70)
            series.append("Pear", 50)
            series.append("Melon", 80)
           
    
            #create QChart object
            chart = QChart()
            chart.addSeries(series)
            chart.setAnimationOptions(QChart.SeriesAnimations)
            chart.setTitle("Fruits Pie Chart")
            chart.setTheme(QChart.ChartThemeDark)
    

    Database result

    Screenshot 2022-03-23 160725.png

    1 Reply Last reply
    0
    • SGaistS Offline
      SGaistS Offline
      SGaist
      Lifetime Qt Champion
      wrote on last edited by
      #2

      Hi,

      The simple method is to loop through your table and take the value from the first column as text for the series item and the value from the second column converted to an int for the value of said item.

      Interested in AI ? www.idiap.ch
      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

      L 1 Reply Last reply
      1
      • SGaistS SGaist

        Hi,

        The simple method is to loop through your table and take the value from the first column as text for the series item and the value from the second column converted to an int for the value of said item.

        L Offline
        L Offline
        LT-K101
        wrote on last edited by
        #3

        @SGaist Below is what I came out with but it does not seem working , could you please check to see what I'm doing wrong?

                store_name = []
                store_count = []
        
                for store_name, store_count in zip(store_name,store_count):
                    print(store_name,store_count)
        
        
                    series = QPieSeries()
                    series.append("Store", str(store_name[0]))
                    series.append("Count",int(store_count[1]))
        
                    chart = QChart()
                    chart.legend().hide()
                    chart.addSeries(series)
                    chart.createDefaultAxes()
                    chart.setAnimationOptions(QChart.SeriesAnimations)
                    chart.setTitle("Pie Chart Example")
        
                    chart.legend().setVisible(True)
                    chart.legend().setAlignment(Qt.AlignBottom)
        
                    chartview = QChartView(chart)
                    chartview.setRenderHint(QPainter.Antialiasing)
                    self.ui.widget.setChart(chart)
        
        1 Reply Last reply
        0
        • SGaistS Offline
          SGaistS Offline
          SGaist
          Lifetime Qt Champion
          wrote on last edited by
          #4

          You are creating as many charts as you have entries. Your loop should only add data to the QPieSeries object.

          Interested in AI ? www.idiap.ch
          Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

          L 1 Reply Last reply
          1
          • SGaistS SGaist

            You are creating as many charts as you have entries. Your loop should only add data to the QPieSeries object.

            L Offline
            L Offline
            LT-K101
            wrote on last edited by
            #5

            @SGaist Please could you help me correct what you saying in the code I provided because I'm new to pyqt5 and python. Thank you.

            1 Reply Last reply
            0
            • SGaistS Offline
              SGaistS Offline
              SGaist
              Lifetime Qt Champion
              wrote on last edited by
              #6

              Only ˋseries.append` should be in the loop. And following what you asked, there should be only one line.

              Interested in AI ? www.idiap.ch
              Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

              L 1 Reply Last reply
              0
              • SGaistS SGaist

                Only ˋseries.append` should be in the loop. And following what you asked, there should be only one line.

                L Offline
                L Offline
                LT-K101
                wrote on last edited by LT-K101
                #7

                @SGaist I have place the series.append in the loop as directed but chart does not show. The title " Pie Chart Example" is the only thing displaying. Please below is what I did.

                        store_name = []
                        store_count = []
                
                        series = QPieSeries()
                
                        for store_name, store_count in zip(store_name,store_count):         
                
                            series.append("Store", str(store_name[0]))
                            series.append("Count",int(store_count[1]))
                         
                        chart = QChart()
                        chart.legend().hide()
                        chart.addSeries(series)
                        chart.createDefaultAxes()
                        chart.setAnimationOptions(QChart.SeriesAnimations)
                        chart.setTitle("Pie Chart Example")
                
                JonBJ 1 Reply Last reply
                0
                • L LT-K101

                  @SGaist I have place the series.append in the loop as directed but chart does not show. The title " Pie Chart Example" is the only thing displaying. Please below is what I did.

                          store_name = []
                          store_count = []
                  
                          series = QPieSeries()
                  
                          for store_name, store_count in zip(store_name,store_count):         
                  
                              series.append("Store", str(store_name[0]))
                              series.append("Count",int(store_count[1]))
                           
                          chart = QChart()
                          chart.legend().hide()
                          chart.addSeries(series)
                          chart.createDefaultAxes()
                          chart.setAnimationOptions(QChart.SeriesAnimations)
                          chart.setTitle("Pie Chart Example")
                  
                  JonBJ Offline
                  JonBJ Offline
                  JonB
                  wrote on last edited by JonB
                  #8

                  @LT-K101
                  If store_name and store_count are empty, how many items does this append to the series, how many times does it go round the loop? Verify how many elements you added to the series if you expect it to show something?

                  L 1 Reply Last reply
                  0
                  • SGaistS Offline
                    SGaistS Offline
                    SGaist
                    Lifetime Qt Champion
                    wrote on last edited by
                    #9

                    Your series entries are supposed to have the store name as first parameter and the count as second. That's not what you are doing. Also, are you sure that both parameters are from the right types ?

                    Interested in AI ? www.idiap.ch
                    Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                    1 Reply Last reply
                    1
                    • L Offline
                      L Offline
                      LT-K101
                      wrote on last edited by LT-K101
                      #10

                      @JonB and @SGaist Thanks a lot problem solved. Please is it possible to display a geographical area map instead of pie chart using same data from database?

                      1 Reply Last reply
                      0
                      • SGaistS Offline
                        SGaistS Offline
                        SGaist
                        Lifetime Qt Champion
                        wrote on last edited by
                        #11

                        Possible, likely yes but you will have to be able to associate your stores with their geographical positions which if you don't have already, you would have to add to your database or retrieve through some other means.

                        Interested in AI ? www.idiap.ch
                        Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                        L 1 Reply Last reply
                        0
                        • SGaistS SGaist

                          Possible, likely yes but you will have to be able to associate your stores with their geographical positions which if you don't have already, you would have to add to your database or retrieve through some other means.

                          L Offline
                          L Offline
                          LT-K101
                          wrote on last edited by
                          #12

                          @SGaist Thanks I will try my hands on it and let you know

                          1 Reply Last reply
                          0
                          • JonBJ JonB

                            @LT-K101
                            If store_name and store_count are empty, how many items does this append to the series, how many times does it go round the loop? Verify how many elements you added to the series if you expect it to show something?

                            L Offline
                            L Offline
                            LT-K101
                            wrote on last edited by LT-K101
                            #13

                            @JonB Please I'm trying to use same table and approach to plot a barchart but i get the following error could you please help me out with what I'm doing wrong.

                            series.append(store_name[0], store_count[1])
                            TypeError: arguments did not match any overloaded call:
                            append(self, QBarSet): argument 1 has unexpected type 'str'
                            append(self, Iterable[QBarSet]): argument 1 has unexpected type 'str'

                               
                                    series = QPercentBarSeries()
                            
                                    for store_name, store_count in zip(store_name, store_count):
                                        
                                        series.append(store_name[0], store_count[1])
                             
                                    chart = QChart()
                                    chart.addSeries(series)
                                    chart.setTitle("Item Type Example")
                                    chart.setAnimationOptions(QChart.SeriesAnimations)
                            
                                    categories = ["Store A", "Store B", "Store C", "Store D"]
                                    axis = QBarCategoryAxis()
                                    axis.append(categories)
                                    chart.createDefaultAxes()
                                    chart.setAxisX(axis, series)
                            
                                    chart.legend().setVisible(True)
                                    chart.legend().setAlignment(Qt.AlignBottom)
                            
                                    chartView = QChartView(chart)
                                    chartView.setRenderHint(QPainter.Antialiasing)
                            
                                    self.ui.widget_2.setChart(chart)
                            
                            jsulmJ JonBJ 2 Replies Last reply
                            0
                            • L LT-K101

                              @JonB Please I'm trying to use same table and approach to plot a barchart but i get the following error could you please help me out with what I'm doing wrong.

                              series.append(store_name[0], store_count[1])
                              TypeError: arguments did not match any overloaded call:
                              append(self, QBarSet): argument 1 has unexpected type 'str'
                              append(self, Iterable[QBarSet]): argument 1 has unexpected type 'str'

                                 
                                      series = QPercentBarSeries()
                              
                                      for store_name, store_count in zip(store_name, store_count):
                                          
                                          series.append(store_name[0], store_count[1])
                               
                                      chart = QChart()
                                      chart.addSeries(series)
                                      chart.setTitle("Item Type Example")
                                      chart.setAnimationOptions(QChart.SeriesAnimations)
                              
                                      categories = ["Store A", "Store B", "Store C", "Store D"]
                                      axis = QBarCategoryAxis()
                                      axis.append(categories)
                                      chart.createDefaultAxes()
                                      chart.setAxisX(axis, series)
                              
                                      chart.legend().setVisible(True)
                                      chart.legend().setAlignment(Qt.AlignBottom)
                              
                                      chartView = QChartView(chart)
                                      chartView.setRenderHint(QPainter.Antialiasing)
                              
                                      self.ui.widget_2.setChart(chart)
                              
                              jsulmJ Offline
                              jsulmJ Offline
                              jsulm
                              Lifetime Qt Champion
                              wrote on last edited by
                              #14

                              @LT-K101 The error message tells you what is wrong, you just need to check documentation: https://doc.qt.io/qt-5/qabstractbarseries.html#append
                              There are two append methods: one takes a QBarSet * as parameter, second one takes QList<QBarSet *>. You are passing two parameters: how should this work?

                              https://forum.qt.io/topic/113070/qt-code-of-conduct

                              1 Reply Last reply
                              0
                              • L LT-K101

                                @JonB Please I'm trying to use same table and approach to plot a barchart but i get the following error could you please help me out with what I'm doing wrong.

                                series.append(store_name[0], store_count[1])
                                TypeError: arguments did not match any overloaded call:
                                append(self, QBarSet): argument 1 has unexpected type 'str'
                                append(self, Iterable[QBarSet]): argument 1 has unexpected type 'str'

                                   
                                        series = QPercentBarSeries()
                                
                                        for store_name, store_count in zip(store_name, store_count):
                                            
                                            series.append(store_name[0], store_count[1])
                                 
                                        chart = QChart()
                                        chart.addSeries(series)
                                        chart.setTitle("Item Type Example")
                                        chart.setAnimationOptions(QChart.SeriesAnimations)
                                
                                        categories = ["Store A", "Store B", "Store C", "Store D"]
                                        axis = QBarCategoryAxis()
                                        axis.append(categories)
                                        chart.createDefaultAxes()
                                        chart.setAxisX(axis, series)
                                
                                        chart.legend().setVisible(True)
                                        chart.legend().setAlignment(Qt.AlignBottom)
                                
                                        chartView = QChartView(chart)
                                        chartView.setRenderHint(QPainter.Antialiasing)
                                
                                        self.ui.widget_2.setChart(chart)
                                
                                JonBJ Offline
                                JonBJ Offline
                                JonB
                                wrote on last edited by
                                #15

                                @LT-K101 said in How can I plot a pie chart from a database?:

                                    for store_name, store_count in zip(store_name, store_count):
                                        
                                        series.append(store_name[0], store_count[1])
                                

                                In addition to @jsulm. This still seems like nonsense to me. I don't know what it does, and I have no idea what you do it for/intend it to achieve.

                                Why don't you at least insert

                                print store_name[0], store_count[1]
                                

                                above the series.append() in the for loop and see if that works and what it outputs that you are appending? Is it correct?

                                1 Reply Last reply
                                0
                                • L Offline
                                  L Offline
                                  LT-K101
                                  wrote on last edited by
                                  #16

                                  @JonB and @jsulm Thanks for the heads up. I did the following and it worked.

                                  
                                          item_name = (result)
                                  
                                          series = QHorizontalBarSeries()
                                  
                                          for item,num in item_name:
                                  
                                              item_name1 = QBarSet(item)
                                  
                                              item_name1 << num
                                  
                                              series.append(item_name1)
                                  
                                  1 Reply Last reply
                                  1
                                  • L Offline
                                    L Offline
                                    LT-K101
                                    wrote on last edited by
                                    #17

                                    This is the result i obtained. Please is there a way to space the bars out with this barchart type?

                                    Screenshot (65).png

                                    1 Reply Last reply
                                    0

                                    • Login

                                    • Login or register to search.
                                    • First post
                                      Last post
                                    0
                                    • Categories
                                    • Recent
                                    • Tags
                                    • Popular
                                    • Users
                                    • Groups
                                    • Search
                                    • Get Qt Extensions
                                    • Unsolved