Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. QtCharts problem with Spline
Forum Updated to NodeBB v4.3 + New Features

QtCharts problem with Spline

Scheduled Pinned Locked Moved General and Desktop
qtchartsqsplineseries
8 Posts 3 Posters 4.5k Views 2 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.
  • RTjenR Offline
    RTjenR Offline
    RTjen
    wrote on last edited by RTjen
    #1

    I've only recently started using QtCharts with Qt5.6 and testing out the different functionalities.
    I'm trying to use both QBarSeries and QSplineSeries to display two different versions of a histogram.
    However, i keep finding that QSplineSeries will display inconsistent graph compared to the QBarSeries.

    This is the result that I am getting, note that at the red circle, QSpline displays y-value much lower than it should be.
    http://i.imgur.com/JDoofAH.png
    As the amount of data points increase, so to does this occurrence.

    Can someone help me with this problem?

    Thank you.

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

      Hi and welcome to devnet,

      Can you create a minimal compilable example that reproduces this ?

      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
      0
      • RTjenR Offline
        RTjenR Offline
        RTjen
        wrote on last edited by RTjen
        #3
        #include <stdlib.h>
        #include <QVector>
        #include <QDebug>
        #include <QtWidgets/QApplication>
        #include <QtWidgets/QMainWindow>
        #include <QtCharts/QChartView>
        #include <QtCharts/QSplineSeries>
        #include <iostream>
        QT_CHARTS_USE_NAMESPACE
        
        using namespace std;
        int main(int argc, char *argv[])
          {
              QApplication a(argc, argv);
              std::vector<double> xAxisData;
              std::vector<int> matClassFrequencyData;
              int iClassAmount = 50;
        
             xAxisData = {-4.05, -3.86, -3.68, -3.50, -3.32, -3.14, -2.96, -2.78, -2.59, -2.41, -2.23, -2.05, -1.87, -1.69, -1.51, -1.33, -1.14, -0.96, -0.78, -0.60, -0.42, -0.24, -0.06, 0.11, 0.30, 0.48, 0.66, 0.84, 1.02, 1.20, 1.38, 1.56, 1.75, 1.93, 2.11, 2.29, 2.47, 2.65, 2.83, 3.02, 3.20, 3.38, 3.56, 3.74, 3.92, 4.10, 4.28, 4.47, 4.65, 4.83, 5.01};
             matClassFrequencyData = {1, 6, 8, 22, 41, 41, 57, 83, 49, 199, 494, 1192, 2515, 5083, 8362, 9537, 5083, 11451, 13713, 28515, 46887, 58029, 243666, 45902, 17001, 19831, 10600, 9167, 7870, 7056, 4508, 2326, 1111, 319, 407, 142, 129, 99, 85, 72, 57, 19, 27, 28, 11, 4, 4, 2, 4, 1};
        
              QSplineSeries *series = new QSplineSeries();
              series->setName("Histogram");
        
              double minAxisX,
                     maxAxisX,
                     classMark;                            //class mark is the middle point between lower and upper class limit
              minAxisX = xAxisData[0];
              maxAxisX = xAxisData[iClassAmount];
              int maximumFrequency = 0;                 //maximumFrequency used to scale the y-axis
              for (int ir=0; ir < iClassAmount; ir++)
              {
                  classMark = (xAxisData[ir] + xAxisData[ir+1])/2;
                  series->append(classMark, matClassFrequencyData[ir]);
        
                  if (matClassFrequencyData[ir] > maximumFrequency)    //used to find the maximum y-axis
                  {
                      maximumFrequency = matClassFrequencyData[ir];
                  }
              }
              QChart *chart = new QChart();
              chart->addSeries(series);
              chart->legend()->setVisible(true);
              chart->legend()->setAlignment(Qt::AlignBottom);
              chart->setTitle("Spline Histogram");
              chart->createDefaultAxes();
              chart->axisX()->setRange(minAxisX, maxAxisX);
              chart->axisY()->setRange(0, maximumFrequency);
        
              QChartView *chartView = new QChartView(chart);
              chartView->setRenderHint(QPainter::Antialiasing);
        
              QMainWindow window;
              window.setCentralWidget(chartView);
              window.resize(400, 300);
              window.show();
        
              return a.exec();
        }
        

        The problem is the inaccurate decrease of the Spline histogram shown when frequency is between 5083, 11451, 13713, 28515, 46887, 58029, 243666 which is supposed to show an increase instead of a random decrease prior to the jump to max frequency at 243666.

        kshegunovK 1 Reply Last reply
        0
        • RTjenR RTjen
          #include <stdlib.h>
          #include <QVector>
          #include <QDebug>
          #include <QtWidgets/QApplication>
          #include <QtWidgets/QMainWindow>
          #include <QtCharts/QChartView>
          #include <QtCharts/QSplineSeries>
          #include <iostream>
          QT_CHARTS_USE_NAMESPACE
          
          using namespace std;
          int main(int argc, char *argv[])
            {
                QApplication a(argc, argv);
                std::vector<double> xAxisData;
                std::vector<int> matClassFrequencyData;
                int iClassAmount = 50;
          
               xAxisData = {-4.05, -3.86, -3.68, -3.50, -3.32, -3.14, -2.96, -2.78, -2.59, -2.41, -2.23, -2.05, -1.87, -1.69, -1.51, -1.33, -1.14, -0.96, -0.78, -0.60, -0.42, -0.24, -0.06, 0.11, 0.30, 0.48, 0.66, 0.84, 1.02, 1.20, 1.38, 1.56, 1.75, 1.93, 2.11, 2.29, 2.47, 2.65, 2.83, 3.02, 3.20, 3.38, 3.56, 3.74, 3.92, 4.10, 4.28, 4.47, 4.65, 4.83, 5.01};
               matClassFrequencyData = {1, 6, 8, 22, 41, 41, 57, 83, 49, 199, 494, 1192, 2515, 5083, 8362, 9537, 5083, 11451, 13713, 28515, 46887, 58029, 243666, 45902, 17001, 19831, 10600, 9167, 7870, 7056, 4508, 2326, 1111, 319, 407, 142, 129, 99, 85, 72, 57, 19, 27, 28, 11, 4, 4, 2, 4, 1};
          
                QSplineSeries *series = new QSplineSeries();
                series->setName("Histogram");
          
                double minAxisX,
                       maxAxisX,
                       classMark;                            //class mark is the middle point between lower and upper class limit
                minAxisX = xAxisData[0];
                maxAxisX = xAxisData[iClassAmount];
                int maximumFrequency = 0;                 //maximumFrequency used to scale the y-axis
                for (int ir=0; ir < iClassAmount; ir++)
                {
                    classMark = (xAxisData[ir] + xAxisData[ir+1])/2;
                    series->append(classMark, matClassFrequencyData[ir]);
          
                    if (matClassFrequencyData[ir] > maximumFrequency)    //used to find the maximum y-axis
                    {
                        maximumFrequency = matClassFrequencyData[ir];
                    }
                }
                QChart *chart = new QChart();
                chart->addSeries(series);
                chart->legend()->setVisible(true);
                chart->legend()->setAlignment(Qt::AlignBottom);
                chart->setTitle("Spline Histogram");
                chart->createDefaultAxes();
                chart->axisX()->setRange(minAxisX, maxAxisX);
                chart->axisY()->setRange(0, maximumFrequency);
          
                QChartView *chartView = new QChartView(chart);
                chartView->setRenderHint(QPainter::Antialiasing);
          
                QMainWindow window;
                window.setCentralWidget(chartView);
                window.resize(400, 300);
                window.show();
          
                return a.exec();
          }
          

          The problem is the inaccurate decrease of the Spline histogram shown when frequency is between 5083, 11451, 13713, 28515, 46887, 58029, 243666 which is supposed to show an increase instead of a random decrease prior to the jump to max frequency at 243666.

          kshegunovK Offline
          kshegunovK Offline
          kshegunov
          Moderators
          wrote on last edited by kshegunov
          #4

          @RTjen
          Hello,
          I don't use QtCharts, since it's (still) part of the commercial license, but I noticed you have 52 elements in xAxisData and 50 elements in matClassFrequencyData, while iClassAmount is 50. Is this a typo? If not I think you should fix that as well (you seem to have a rogue x point).

          PS.
          Additionally, your x data is not monotonically increasing, so when you calculate the average, as you do, you get the artifact (the points get reordered).

          Kind regards.

          Read and abide by the Qt Code of Conduct

          1 Reply Last reply
          0
          • RTjenR Offline
            RTjenR Offline
            RTjen
            wrote on last edited by RTjen
            #5

            @kshegunov
            Well spotted, there are supposed to be 51 elements in xAxisData (the extra one is an initial value).
            The vector contains class limits which will be averaged into class mark and used on the x axis for QSpline.

            The x axis should now increase incrementally from -4.05 to 5.01 with respective frequency for the y-axis.

            My only problem is the unexplained decrease when frequency is between x-axis (-1.14 to 0.11) with corresponding y-axis (5083 to 46887) which increases but gets displayed with a decrease.
            the decrease shown in red circle here (and what the graph should be): http://imgur.com/KTddg4I

            kshegunovK 1 Reply Last reply
            0
            • RTjenR RTjen

              @kshegunov
              Well spotted, there are supposed to be 51 elements in xAxisData (the extra one is an initial value).
              The vector contains class limits which will be averaged into class mark and used on the x axis for QSpline.

              The x axis should now increase incrementally from -4.05 to 5.01 with respective frequency for the y-axis.

              My only problem is the unexplained decrease when frequency is between x-axis (-1.14 to 0.11) with corresponding y-axis (5083 to 46887) which increases but gets displayed with a decrease.
              the decrease shown in red circle here (and what the graph should be): http://imgur.com/KTddg4I

              kshegunovK Offline
              kshegunovK Offline
              kshegunov
              Moderators
              wrote on last edited by kshegunov
              #6

              @RTjen
              One thing you could check very quickly is whether a simple non-interpolating chart (as lines chart, like QLineSeries) behaves. If you don't get such a decrease there I'd assume it's a bug in the interpolation routine.

              Kind regards.

              Read and abide by the Qt Code of Conduct

              1 Reply Last reply
              0
              • RTjenR Offline
                RTjenR Offline
                RTjen
                wrote on last edited by
                #7

                QLineSeries seem to have no problem displaying the correct chart: http://i.imgur.com/B4odST9.png
                which begs to differ, is this a known bug with the Spline function and I'm wondering if there are ways to fix it.

                Thank you.

                kshegunovK 1 Reply Last reply
                0
                • RTjenR RTjen

                  QLineSeries seem to have no problem displaying the correct chart: http://i.imgur.com/B4odST9.png
                  which begs to differ, is this a known bug with the Spline function and I'm wondering if there are ways to fix it.

                  Thank you.

                  kshegunovK Offline
                  kshegunovK Offline
                  kshegunov
                  Moderators
                  wrote on last edited by kshegunov
                  #8

                  @RTjen

                  which begs to differ, is this a known bug with the Spline function

                  I don't know, as I said I don't use the module, but you could look here (you can login with your forum credentials).
                  One thing that caught my eye though is this bug, which doesn't speak well of the implementation of the charts module, as the developer provided some lazy excuse (this is simply implemented by notifying the owner of the destruction).
                  Anyway, you could either file a bug report or try something else. My father (who uses a commercial license) gave up on the charts and is currently using QCustomPlot, so you could try that if it provides what you're after.

                  I hope that helps.
                  Kind regards.

                  Read and abide by the Qt Code of Conduct

                  1 Reply Last reply
                  1

                  • Login

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