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.5k 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 25 Mar 2022, 15:20 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
    • S Offline
      S Offline
      SGaist
      Lifetime Qt Champion
      wrote on 25 Mar 2022, 19:56 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 26 Mar 2022, 18:00
      1
      • S SGaist
        25 Mar 2022, 19:56

        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 26 Mar 2022, 18:00 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
        • S Offline
          S Offline
          SGaist
          Lifetime Qt Champion
          wrote on 26 Mar 2022, 19:42 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 26 Mar 2022, 19:47
          1
          • S SGaist
            26 Mar 2022, 19:42

            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 26 Mar 2022, 19:47 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
            • S Offline
              S Offline
              SGaist
              Lifetime Qt Champion
              wrote on 26 Mar 2022, 19:52 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 26 Mar 2022, 20:15
              0
              • S SGaist
                26 Mar 2022, 19:52

                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 26 Mar 2022, 20:15 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")
                
                J 1 Reply Last reply 26 Mar 2022, 20:30
                0
                • L LT-K101
                  26 Mar 2022, 20:15

                  @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")
                  
                  J Offline
                  J Offline
                  JonB
                  wrote on 26 Mar 2022, 20:30 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 28 Mar 2022, 20:41
                  0
                  • S Offline
                    S Offline
                    SGaist
                    Lifetime Qt Champion
                    wrote on 26 Mar 2022, 20:34 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 26 Mar 2022, 21:31 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
                      • S Offline
                        S Offline
                        SGaist
                        Lifetime Qt Champion
                        wrote on 27 Mar 2022, 19:26 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 28 Mar 2022, 20:28
                        0
                        • S SGaist
                          27 Mar 2022, 19:26

                          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 28 Mar 2022, 20:28 last edited by
                          #12

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

                          1 Reply Last reply
                          0
                          • J JonB
                            26 Mar 2022, 20:30

                            @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 28 Mar 2022, 20:41 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 J 2 Replies Last reply 29 Mar 2022, 06:37
                            0
                            • L LT-K101
                              28 Mar 2022, 20:41

                              @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 29 Mar 2022, 06:37 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
                                28 Mar 2022, 20:41

                                @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)
                                
                                J Offline
                                J Offline
                                JonB
                                wrote on 29 Mar 2022, 08:29 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 1 Apr 2022, 08:25 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 1 Apr 2022, 08:31 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

                                    1/17

                                    25 Mar 2022, 15:20

                                    • Login

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