mirror of
https://github.com/jkriege2/JKQtPlotter.git
synced 2024-12-26 02:21:43 +08:00
added barchart example (+minor improvements)
This commit is contained in:
parent
b36a021f13
commit
604f59fd0d
95
README.md
95
README.md
@ -81,7 +81,7 @@ int main(int argc, char* argv[])
|
|||||||
The result looks like this:
|
The result looks like this:
|
||||||
![jkqtplotter_simpletest1](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest1.png)
|
![jkqtplotter_simpletest1](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest1.png)
|
||||||
|
|
||||||
###Very simple line-graph
|
###Simple line-graph with error bars
|
||||||
This project (see `./test/jkqtplotter_simpletest_symbols_and_errors/`) simply creates a JKQtPlotter widget (as a new window) and adds a single line-graph (a sine-wave) that has y-errorbars. In addition, this example shows how to change some of the axis properties and how to use LaTeX markup to format axis labels (can actually be used for all labels in JKQtPlotter). Also, in comparison to the last example, here we initialize the data from C-type arrays (double*), instead of QVector<double> objects.
|
This project (see `./test/jkqtplotter_simpletest_symbols_and_errors/`) simply creates a JKQtPlotter widget (as a new window) and adds a single line-graph (a sine-wave) that has y-errorbars. In addition, this example shows how to change some of the axis properties and how to use LaTeX markup to format axis labels (can actually be used for all labels in JKQtPlotter). Also, in comparison to the last example, here we initialize the data from C-type arrays (double*), instead of QVector<double> objects.
|
||||||
|
|
||||||
The soruce code of the main application is (see `./test/jkqtplotter_simpletest_symbols_and_errors/jkqtplotter_simpletest_symbols_and_errors.cpp`):
|
The soruce code of the main application is (see `./test/jkqtplotter_simpletest_symbols_and_errors/jkqtplotter_simpletest_symbols_and_errors.cpp`):
|
||||||
@ -156,6 +156,99 @@ int main(int argc, char* argv[])
|
|||||||
The result looks like this:
|
The result looks like this:
|
||||||
![jkqtplotter_simpletest_symbols_and_errors](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_symbols_and_errors.png)
|
![jkqtplotter_simpletest_symbols_and_errors](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_symbols_and_errors.png)
|
||||||
|
|
||||||
|
###Simple barchart
|
||||||
|
This project (see `./test/jkqtplotter_simpletest_barchart/`) simply creates a JKQtPlotter widget (as a new window) and adds a single line-graph (a sine-wave) that has y-errorbars. In addition, this example shows how to change some of the axis properties and how to use LaTeX markup to format axis labels (can actually be used for all labels in JKQtPlotter). Also, in comparison to the last example, here we initialize the data from C-type arrays (double*), instead of QVector<double> objects.
|
||||||
|
|
||||||
|
The soruce code of the main application is (see `./test/jkqtplotter_simpletest_barchart/jkqtplotter_simpletest_barchart.cpp`):
|
||||||
|
```c++
|
||||||
|
#include <QApplication>
|
||||||
|
#include "jkqtplotter.h"
|
||||||
|
|
||||||
|
#define Ndata 5
|
||||||
|
int main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
QApplication app(argc, argv);
|
||||||
|
|
||||||
|
// 1. create a plotter window and get a pointer to the internal datastore (for convenience)
|
||||||
|
JKQtPlotter plot;
|
||||||
|
plot.get_plotter()->set_useAntiAliasingForGraphs(true); // nicer (but slower) plotting
|
||||||
|
plot.get_plotter()->set_useAntiAliasingForSystem(true); // nicer (but slower) plotting
|
||||||
|
plot.get_plotter()->set_useAntiAliasingForText(true); // nicer (but slower) text rendering
|
||||||
|
JKQTPdatastore* ds=plot.getDatastore();
|
||||||
|
|
||||||
|
// 2. now we create data for three simple barchart
|
||||||
|
QString L[Ndata]={ "cat. A", "cat. B", "cat. C", "cat. D", "other"};
|
||||||
|
double X[Ndata]={ 1, 2, 3, 4, 5};
|
||||||
|
double Y1[Ndata]={ 5, 4, 3, 4, 5};
|
||||||
|
double Y2[Ndata]={ -5, -3, 1, 3, 6};
|
||||||
|
double Y3[Ndata]={ 6, 2, 5, 3, 6};
|
||||||
|
|
||||||
|
// 3. make data available to JKQtPlotter by adding it to the internal datastore.
|
||||||
|
// Note: In this step the data is copied (of not specified otherwise)
|
||||||
|
// the variables columnX and columnY... will contain the internal column ID of the
|
||||||
|
// newly created columns with names "x" and "y..." and the (copied) data from X
|
||||||
|
// and Y...
|
||||||
|
size_t columnX=ds->addCopiedColumn(X, Ndata, "x");
|
||||||
|
size_t columnY1=ds->addCopiedColumn(Y1, Ndata, "y1");
|
||||||
|
size_t columnY2=ds->addCopiedColumn(Y2, Ndata, "y2");
|
||||||
|
size_t columnY3=ds->addCopiedColumn(Y3, Ndata, "y3");
|
||||||
|
|
||||||
|
// 4. create graphs in the plot, which plots the dataset X/Y1, X/Y2 and X/Y3:
|
||||||
|
JKQTPbarHorizontalGraph* graph1=new JKQTPbarHorizontalGraph(&plot);
|
||||||
|
graph1->set_xColumn(columnX);
|
||||||
|
graph1->set_yColumn(columnY1);
|
||||||
|
graph1->set_title(QObject::tr("dataset 1"));
|
||||||
|
JKQTPbarHorizontalGraph* graph2=new JKQTPbarHorizontalGraph(&plot);
|
||||||
|
graph2->set_xColumn(columnX);
|
||||||
|
graph2->set_yColumn(columnY2);
|
||||||
|
graph2->set_title(QObject::tr("dataset 2"));
|
||||||
|
JKQTPbarHorizontalGraph* graph3=new JKQTPbarHorizontalGraph(&plot);
|
||||||
|
graph3->set_xColumn(columnX);
|
||||||
|
graph3->set_yColumn(columnY3);
|
||||||
|
graph3->set_title(QObject::tr("dataset 3"));
|
||||||
|
|
||||||
|
|
||||||
|
// 5. add the graphs to the plot, so it is actually displayed
|
||||||
|
plot.addGraph(graph1);
|
||||||
|
plot.addGraph(graph2);
|
||||||
|
plot.addGraph(graph3);
|
||||||
|
|
||||||
|
// 6. now we set the graphs, so they are plotted side-by-side
|
||||||
|
// This function searches all JKQTPbarHorizontalGraph in the current
|
||||||
|
// plot and sets their shift/scale so they form a nice plot with
|
||||||
|
// side-by-side groups
|
||||||
|
graph1->autoscaleBarWidthAndShift(0.75, 1);
|
||||||
|
|
||||||
|
// 7. data is grouped into 5 numbere groups (1..5), but we also have string
|
||||||
|
// labels for these groups (stored in L). In order to display these labels,
|
||||||
|
// we have to tell the x-Axis to use these special labels:
|
||||||
|
plot.getXAxis()->addAxisTickLabels(X, L, Ndata);
|
||||||
|
// also we can rotate the labels a bit (by 45 degree), so they fit better
|
||||||
|
plot.getXAxis()->set_tickLabelAngle(45);
|
||||||
|
plot.getXAxis()->set_tickLabelFontSize(12);
|
||||||
|
|
||||||
|
// 8. finally we move the plot key/legend to the outside, top-right
|
||||||
|
// and lay it out as a single row
|
||||||
|
// NOTE: plot is a descendent of QWidget, which uses an internal object of
|
||||||
|
// type JKQTBasePlotter, which does the actual plotting.
|
||||||
|
// So many properties of the plot are only available in this internal
|
||||||
|
// object, which you can access by plot.get_plotter().
|
||||||
|
plot.get_plotter()->set_keyPosition(JKQTPkeyOutsideTopRight);
|
||||||
|
plot.get_plotter()->set_keyLayout(JKQTPkeyLayoutOneRow);
|
||||||
|
|
||||||
|
// 9 autoscale the plot so the graph is contained
|
||||||
|
plot.zoomToFit();
|
||||||
|
|
||||||
|
// show plotter and make it a decent size
|
||||||
|
plot.show();
|
||||||
|
plot.resize(600,400);
|
||||||
|
|
||||||
|
return app.exec();
|
||||||
|
}
|
||||||
|
```
|
||||||
|
The result looks like this:
|
||||||
|
![jkqtplotter_simpletest_barchart](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_barchart.png)
|
||||||
|
|
||||||
|
|
||||||
##Screenshots
|
##Screenshots
|
||||||
###Scatter Plots and Boxplots
|
###Scatter Plots and Boxplots
|
||||||
|
@ -195,20 +195,50 @@ class LIB_EXPORT JKQTPcoordinateAxis: public QObject {
|
|||||||
} else {
|
} else {
|
||||||
return xx/(scaleSign*scale);
|
return xx/(scaleSign*scale);
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
|
|
||||||
/** \brief clear axis tick labels. This switches back to automatic labels mode for the axis. */
|
/** \brief clear axis tick labels. This switches back to automatic labels mode for the axis. */
|
||||||
inline void clearAxisTickLabels() {
|
inline void clearAxisTickLabels() {
|
||||||
tickLabels.clear();
|
tickLabels.clear();
|
||||||
update_plot();
|
update_plot();
|
||||||
};
|
}
|
||||||
|
|
||||||
/** \brief add a new tick label to the axis */
|
/** \brief add a new tick label to the axis */
|
||||||
inline void addAxisTickLabel(double x, QString label) {
|
inline void addAxisTickLabel(double x, QString label) {
|
||||||
tickLabels.append(qMakePair(x, label));
|
tickLabels.append(qMakePair(x, label));
|
||||||
update_plot();
|
update_plot();
|
||||||
};
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/** \brief add a new tick label to the axis */
|
||||||
|
inline void addAxisTickLabels(const QVector<double>& x, const QStringList& label) {
|
||||||
|
for (int i=0; i<qMin(x.size(), label.size()); i++) {
|
||||||
|
tickLabels.append(qMakePair(x[i], label[i]));
|
||||||
|
}
|
||||||
|
update_plot();
|
||||||
|
}
|
||||||
|
/** \brief add a new tick label to the axis */
|
||||||
|
inline void addAxisTickLabels(const double* x, const QStringList& label) {
|
||||||
|
for (int i=0; i<label.size(); i++) {
|
||||||
|
tickLabels.append(qMakePair(x[i], label[i]));
|
||||||
|
}
|
||||||
|
update_plot();
|
||||||
|
}
|
||||||
|
/** \brief add a new tick label to the axis */
|
||||||
|
inline void addAxisTickLabels(const QVector<double>& x, const QString* label) {
|
||||||
|
for (int i=0; i<x.size(); i++) {
|
||||||
|
tickLabels.append(qMakePair(x[i], label[i]));
|
||||||
|
}
|
||||||
|
update_plot();
|
||||||
|
}
|
||||||
|
/** \brief add a new tick label to the axis */
|
||||||
|
inline void addAxisTickLabels(const double* x, const QString* label, int items) {
|
||||||
|
for (int i=0; i<items; i++) {
|
||||||
|
tickLabels.append(qMakePair(x[i], label[i]));
|
||||||
|
}
|
||||||
|
update_plot();
|
||||||
|
}
|
||||||
|
|
||||||
/** \brief returns the size of the left/bottom axis in pixels */
|
/** \brief returns the size of the left/bottom axis in pixels */
|
||||||
virtual QSize getSize1(JKQTPEnhancedPainter& painter)=0;
|
virtual QSize getSize1(JKQTPEnhancedPainter& painter)=0;
|
||||||
|
@ -407,7 +407,10 @@ class LIB_EXPORT JKQtBasePlotter: public QObject {
|
|||||||
*/
|
*/
|
||||||
JKQTPPROPERTY(bool, useAntiAliasingForGraphs);
|
JKQTPPROPERTY(bool, useAntiAliasingForGraphs);
|
||||||
|
|
||||||
/** \brief specifies whether to use antialiasing when drawing any text */
|
/** \brief specifies whether to use antialiasing when drawing any text
|
||||||
|
* \note You can set this property \c false to increase plotting speed of complex plots (with many graphs inside). You can reach a
|
||||||
|
* roughly three-fold speed improvement!
|
||||||
|
*/
|
||||||
JKQTPPROPERTY(bool, useAntiAliasingForText);
|
JKQTPPROPERTY(bool, useAntiAliasingForText);
|
||||||
|
|
||||||
/** \brief multiplier which is used for font sizes when the plot is exported/printed */
|
/** \brief multiplier which is used for font sizes when the plot is exported/printed */
|
||||||
@ -1009,6 +1012,7 @@ class LIB_EXPORT JKQtBasePlotter: public QObject {
|
|||||||
|
|
||||||
JKQTPGET_SET_MACRO_I(bool, useAntiAliasingForSystem, update_plot())
|
JKQTPGET_SET_MACRO_I(bool, useAntiAliasingForSystem, update_plot())
|
||||||
JKQTPGET_SET_MACRO_I(bool, useAntiAliasingForGraphs, update_plot())
|
JKQTPGET_SET_MACRO_I(bool, useAntiAliasingForGraphs, update_plot())
|
||||||
|
JKQTPGET_SET_MACRO_I(bool, useAntiAliasingForText, update_plot())
|
||||||
|
|
||||||
JKQTPGET_SET_MACRO_I(QColor, graphColor, update_plot())
|
JKQTPGET_SET_MACRO_I(QColor, graphColor, update_plot())
|
||||||
JKQTPGET_SET_MACRO_I(double, graphWidth, update_plot())
|
JKQTPGET_SET_MACRO_I(double, graphWidth, update_plot())
|
||||||
|
@ -1897,6 +1897,9 @@ class LIB_EXPORT JKQTPbarHorizontalGraph: public JKQTPxyGraph, public JKQTPxyGra
|
|||||||
* \note This function will scale ALL graphs of the parent plot, which were derived from JKQTPbarHorizontalGraph, that match in orientation (as returned by isHorizontal() ).
|
* \note This function will scale ALL graphs of the parent plot, which were derived from JKQTPbarHorizontalGraph, that match in orientation (as returned by isHorizontal() ).
|
||||||
*/
|
*/
|
||||||
virtual void autoscaleBarWidthAndShift(double maxWidth=0.9, double shrinkFactor=0.8);
|
virtual void autoscaleBarWidthAndShift(double maxWidth=0.9, double shrinkFactor=0.8);
|
||||||
|
inline void autoscaleBarWidthAndShiftSeparatedGroups(double groupWidth=0.75) {
|
||||||
|
autoscaleBarWidthAndShift(groupWidth, 1);
|
||||||
|
}
|
||||||
|
|
||||||
virtual bool isHorizontal() const;
|
virtual bool isHorizontal() const;
|
||||||
|
|
||||||
|
BIN
screenshots/jkqtplotter_simpletest_barchart.png
Normal file
BIN
screenshots/jkqtplotter_simpletest_barchart.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 30 KiB |
@ -0,0 +1,84 @@
|
|||||||
|
#include <QApplication>
|
||||||
|
#include "jkqtplotter.h"
|
||||||
|
|
||||||
|
#define Ndata 5
|
||||||
|
int main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
QApplication app(argc, argv);
|
||||||
|
|
||||||
|
// 1. create a plotter window and get a pointer to the internal datastore (for convenience)
|
||||||
|
JKQtPlotter plot;
|
||||||
|
plot.get_plotter()->set_useAntiAliasingForGraphs(true); // nicer (but slower) plotting
|
||||||
|
plot.get_plotter()->set_useAntiAliasingForSystem(true); // nicer (but slower) plotting
|
||||||
|
plot.get_plotter()->set_useAntiAliasingForText(true); // nicer (but slower) text rendering
|
||||||
|
JKQTPdatastore* ds=plot.getDatastore();
|
||||||
|
|
||||||
|
// 2. now we create data for three simple barchart
|
||||||
|
QString L[Ndata]={ "cat. A", "cat. B", "cat. C", "cat. D", "other"};
|
||||||
|
double X[Ndata]={ 1, 2, 3, 4, 5};
|
||||||
|
double Y1[Ndata]={ 5, 4, 3, 4, 5};
|
||||||
|
double Y2[Ndata]={ -5, -3, 1, 3, 6};
|
||||||
|
double Y3[Ndata]={ 6, 2, 5, 3, 6};
|
||||||
|
|
||||||
|
// 3. make data available to JKQtPlotter by adding it to the internal datastore.
|
||||||
|
// Note: In this step the data is copied (of not specified otherwise)
|
||||||
|
// the variables columnX and columnY... will contain the internal column ID of the
|
||||||
|
// newly created columns with names "x" and "y..." and the (copied) data from X
|
||||||
|
// and Y...
|
||||||
|
size_t columnX=ds->addCopiedColumn(X, Ndata, "x");
|
||||||
|
size_t columnY1=ds->addCopiedColumn(Y1, Ndata, "y1");
|
||||||
|
size_t columnY2=ds->addCopiedColumn(Y2, Ndata, "y2");
|
||||||
|
size_t columnY3=ds->addCopiedColumn(Y3, Ndata, "y3");
|
||||||
|
|
||||||
|
// 4. create graphs in the plot, which plots the dataset X/Y1, X/Y2 and X/Y3:
|
||||||
|
JKQTPbarHorizontalGraph* graph1=new JKQTPbarHorizontalGraph(&plot);
|
||||||
|
graph1->set_xColumn(columnX);
|
||||||
|
graph1->set_yColumn(columnY1);
|
||||||
|
graph1->set_title(QObject::tr("dataset 1"));
|
||||||
|
JKQTPbarHorizontalGraph* graph2=new JKQTPbarHorizontalGraph(&plot);
|
||||||
|
graph2->set_xColumn(columnX);
|
||||||
|
graph2->set_yColumn(columnY2);
|
||||||
|
graph2->set_title(QObject::tr("dataset 2"));
|
||||||
|
JKQTPbarHorizontalGraph* graph3=new JKQTPbarHorizontalGraph(&plot);
|
||||||
|
graph3->set_xColumn(columnX);
|
||||||
|
graph3->set_yColumn(columnY3);
|
||||||
|
graph3->set_title(QObject::tr("dataset 3"));
|
||||||
|
|
||||||
|
|
||||||
|
// 5. add the graphs to the plot, so it is actually displayed
|
||||||
|
plot.addGraph(graph1);
|
||||||
|
plot.addGraph(graph2);
|
||||||
|
plot.addGraph(graph3);
|
||||||
|
|
||||||
|
// 6. now we set the graphs, so they are plotted side-by-side
|
||||||
|
// This function searches all JKQTPbarHorizontalGraph in the current
|
||||||
|
// plot and sets their shift/scale so they form a nice plot with
|
||||||
|
// side-by-side groups
|
||||||
|
graph1->autoscaleBarWidthAndShift(0.75, 1);
|
||||||
|
|
||||||
|
// 7. data is grouped into 5 numbere groups (1..5), but we also have string
|
||||||
|
// labels for these groups (stored in L). In order to display these labels,
|
||||||
|
// we have to tell the x-Axis to use these special labels:
|
||||||
|
plot.getXAxis()->addAxisTickLabels(X, L, Ndata);
|
||||||
|
// also we can rotate the labels a bit (by 45 degree), so they fit better
|
||||||
|
plot.getXAxis()->set_tickLabelAngle(45);
|
||||||
|
plot.getXAxis()->set_tickLabelFontSize(12);
|
||||||
|
|
||||||
|
// 8. finally we move the plot key/legend to the outside, top-right
|
||||||
|
// and lay it out as a single row
|
||||||
|
// NOTE: plot is a descendent of QWidget, which uses an internal object of
|
||||||
|
// type JKQTBasePlotter, which does the actual plotting.
|
||||||
|
// So many properties of the plot are only available in this internal
|
||||||
|
// object, which you can access by plot.get_plotter().
|
||||||
|
plot.get_plotter()->set_keyPosition(JKQTPkeyOutsideTopRight);
|
||||||
|
plot.get_plotter()->set_keyLayout(JKQTPkeyLayoutOneRow);
|
||||||
|
|
||||||
|
// 9 autoscale the plot so the graph is contained
|
||||||
|
plot.zoomToFit();
|
||||||
|
|
||||||
|
// show plotter and make it a decent size
|
||||||
|
plot.show();
|
||||||
|
plot.resize(600,400);
|
||||||
|
|
||||||
|
return app.exec();
|
||||||
|
}
|
@ -0,0 +1,16 @@
|
|||||||
|
# source code for this simple demo
|
||||||
|
SOURCES = jkqtplotter_simpletest_barchart.cpp
|
||||||
|
|
||||||
|
# configure Qt
|
||||||
|
CONFIG += qt
|
||||||
|
QT += core gui svg
|
||||||
|
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport
|
||||||
|
|
||||||
|
# output executable name
|
||||||
|
TARGET = jkqtplotter_simpletest_barchart
|
||||||
|
|
||||||
|
# include JKQtPlotter source code
|
||||||
|
include(../../jkqtplotter.pri)
|
||||||
|
# here you can activate some debug options
|
||||||
|
#DEFINES += SHOW_JKQTPLOTTER_DEBUG
|
||||||
|
#DEFINES += JKQTBP_AUTOTIMER
|
Loading…
Reference in New Issue
Block a user