diff --git a/README.md b/README.md index a1df5604b0..044b8a5cb2 100644 --- a/README.md +++ b/README.md @@ -83,6 +83,7 @@ int main(int argc, char* argv[]) } ``` The result looks like this: + ![jkqtplotter_simpletest1](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest1.png) ### Simple line-graph with error bars @@ -369,29 +370,110 @@ If you use `JKQTPbarHorizontalGraphStacked` instead of `JKQTPbarVerticalStackabl ![JKQTPbarHorizontalGraphStacked](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/doc/images/JKQTPbarHorizontalGraphStacked.png) -## Screenshots -### Scatter Plots and Boxplots -![Scatterplots](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/screen_scatter.png) -### Different Types of Barcharts -![Barcharts](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/screen_barcharts.png) +### Simple math image plot +This project (see `./test/jkqtplotter_simpletest_imageplot/`) simply creates a JKQtPlotter widget (as a new window) and adds a color-coded image plot of a mathematical function (here the Airy disk). The image is stored as a simple C-array in row-major ordering and then copied into a single column of the internal datasdtore (JKQTPMathImage could be directly used without the internal datastore). This very simple interface can also be used to interface with many common image processing libraries, like CImg or OpenCV. -### Image Plots -You can plot C-arrays as images in different color-coding styles. Diferent Overlays/masks are also available. Finally you can use LaTeX markup to format any axis/plot/tick/... label. there is an internal LaTeX parser in this package. -![Scatterplots](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/screen_images_latex.png) +The soruce code of the main application is (see `./test/jkqtplotter_simpletest_imageplot/jkqtplotter_simpletest_imageplot.cpp`): +```c++ +#include +#include +#include "jkqtplotter/jkqtplotter.h" +#include "jkqtplotter/jkqtpimageelements.h" + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif -### Plotting a user-defined (parsed) function -Yes, a complete math expression parser is contained! -![Function Plot](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/screen_functionplot.png) +int main(int argc, char* argv[]) +{ + QApplication app(argc, argv); -### Axis-Label styles in LogLog-Plot -![LogLog Plot](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/screen_loglog.png) + JKQtPlotter plot; + // 1. create a plotter window and get a pointer to the internal datastore (for convenience) + 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 the charts (taken from https://commons.wikimedia.org/wiki/File:Energiemix_Deutschland.svg) + const int NX=100; // image dimension in x-direction [pixels] + const int NY=100; // image dimension in x-direction [pixels] + const double dx=1e-2; // size of a pixel in x-direction [micrometers] + const double dy=1e-2; // size of a pixel in x-direction [micrometers] + const double w=static_cast(NX)*dx; + const double h=static_cast(NY)*dy; + double airydisk[NX*NY]; // row-major image + + // 2.1 Parameters for airy disk plot (see https://en.wikipedia.org/wiki/Airy_disk) + double NA=1.1; // numerical aperture of lens + double wavelength=488e-3; // wavelength of the light [micrometers] + + // 2.2 calculate image of airy disk in a row-major array + double x, y=-h/2.0; + for (int iy=0; iyaddCopiedImageAsColumn(airydisk, NX, NY, "imagedata"); + + // 4. create graphs in the plot, which plots the dataset year/other, year/coal, ... + // The color of the graphs is set by calling set_fillColor_and_darkenedColor(), which sets the + // fillColor to the given color and makes the outline of the bars (i.e. their "color") a darker + // shade of the given color. + JKQTPColumnMathImage* graph=new JKQTPColumnMathImage(&plot); + graph->set_title(""); + graph->set_imageColumn(cAiryDisk); + graph->set_Nx(NX); + graph->set_Ny(NY); + graph->set_x(-w/2.0); + graph->set_y(-h/2.0); + graph->set_width(w); + graph->set_height(h); + graph->set_palette(JKQTPMathImageMATLAB); // color-map is "MATLAB" + graph->get_colorBarRightAxis()->set_axisLabel("light intensity [A.U.]"); // get coordinate axis of color-bar and set its label + + // 5. add the graphs to the plot, so it is actually displayed + plot.addGraph(graph); + + // 6. set axis labels + plot.get_xAxis()->set_axisLabel("x [{\\mu}m]"); + plot.get_yAxis()->set_axisLabel("y [{\\mu}m]"); + + // 7. fix axis and plot aspect ratio to 1 + plot.get_plotter()->set_maintainAspectRatio(true); + plot.get_plotter()->set_maintainAxisAspectRatio(true); + + // 8 autoscale the plot so the graph is contained + plot.zoomToFit(); + + // show plotter and make it a decent size + plot.show(); + plot.resize(600,600); + plot.setWindowTitle("JKQTPColumnMathImage"); + + + return app.exec(); +} +``` +The result looks like this: + +![jkqtplotter_simpletest_imageplot](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_imageplot.png) + diff --git a/screenshots/README.md b/screenshots/README.md index 3771ba7785..70e63bb408 100644 --- a/screenshots/README.md +++ b/screenshots/README.md @@ -9,8 +9,11 @@ ## Image Plots You can plot C-arrays as images in different color-coding styles. Diferent Overlays/masks are also available. Finally you can use LaTeX markup to format any axis/plot/tick/... label. there is an internal LaTeX parser in this package. + ![Scatterplots](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/screen_images_latex.png) +![Scatterplots](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_imageplot.png) + ## Plotting a user-defined (parsed) function Yes, a complete math expression parser is contained! @@ -22,9 +25,11 @@ Yes, a complete math expression parser is contained! ## Parametrized Scatter Plots and Data Viewer Scatter Plots can have symbols where the shape/color/size is parametrized by a data column. Also the plotter is built around an internal datastore, which you can access (readonly!!!) by a data-viewer that is accessible from the contextmenu in any plot. + ![LogLog Plot](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/screen_parmetrizedplots_datatable.png) ## Barcharts + ![JKQTPbarVerticalGraphStacked](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/doc/images/JKQTPbarVerticalGraphStacked.png) ![JKQTPbarHorizontalGraphStacked](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/doc/images/JKQTPbarHorizontalGraphStacked.png) ![jkqtplotter_simpletest_barchart](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_barchart.png) diff --git a/screenshots/jkqtplotter_simpletest_imageplot.png b/screenshots/jkqtplotter_simpletest_imageplot.png new file mode 100644 index 0000000000..93b3e0882c Binary files /dev/null and b/screenshots/jkqtplotter_simpletest_imageplot.png differ diff --git a/test/jkqtplotter_simpletest_imageplot/jkqtplotter_simpletest_imageplot.cpp b/test/jkqtplotter_simpletest_imageplot/jkqtplotter_simpletest_imageplot.cpp new file mode 100644 index 0000000000..a76812fd6a --- /dev/null +++ b/test/jkqtplotter_simpletest_imageplot/jkqtplotter_simpletest_imageplot.cpp @@ -0,0 +1,93 @@ +#include +#include +#include "jkqtplotter/jkqtplotter.h" +#include "jkqtplotter/jkqtpimageelements.h" + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + + +int main(int argc, char* argv[]) +{ + QApplication app(argc, argv); + + JKQtPlotter plot; + // 1. create a plotter window and get a pointer to the internal datastore (for convenience) + 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 the charts (taken from https://commons.wikimedia.org/wiki/File:Energiemix_Deutschland.svg) + const int NX=100; // image dimension in x-direction [pixels] + const int NY=100; // image dimension in x-direction [pixels] + const double dx=1e-2; // size of a pixel in x-direction [micrometers] + const double dy=1e-2; // size of a pixel in x-direction [micrometers] + const double w=static_cast(NX)*dx; + const double h=static_cast(NY)*dy; + double airydisk[NX*NY]; // row-major image + + // 2.1 Parameters for airy disk plot (see https://en.wikipedia.org/wiki/Airy_disk) + double NA=1.1; // numerical aperture of lens + double wavelength=488e-3; // wavelength of the light [micrometers] + + // 2.2 calculate image of airy disk in a row-major array + double x, y=-h/2.0; + for (int iy=0; iyaddCopiedImageAsColumn(airydisk, NX, NY, "imagedata"); + + // 4. create graphs in the plot, which plots the dataset year/other, year/coal, ... + // The color of the graphs is set by calling set_fillColor_and_darkenedColor(), which sets the + // fillColor to the given color and makes the outline of the bars (i.e. their "color") a darker + // shade of the given color. + JKQTPColumnMathImage* graph=new JKQTPColumnMathImage(&plot); + graph->set_title(""); + graph->set_imageColumn(cAiryDisk); + graph->set_Nx(NX); + graph->set_Ny(NY); + graph->set_x(-w/2.0); + graph->set_y(-h/2.0); + graph->set_width(w); + graph->set_height(h); + graph->set_palette(JKQTPMathImageMATLAB); // color-map is "MATLAB" + graph->get_colorBarRightAxis()->set_axisLabel("light intensity [A.U.]"); // get coordinate axis of color-bar and set its label + + // 5. add the graphs to the plot, so it is actually displayed + plot.addGraph(graph); + + // 6. set axis labels + plot.get_xAxis()->set_axisLabel("x [{\\mu}m]"); + plot.get_yAxis()->set_axisLabel("y [{\\mu}m]"); + + // 7. fix axis and plot aspect ratio to 1 + plot.get_plotter()->set_maintainAspectRatio(true); + plot.get_plotter()->set_maintainAxisAspectRatio(true); + + // 8 autoscale the plot so the graph is contained + plot.zoomToFit(); + + // show plotter and make it a decent size + plot.show(); + plot.resize(600,600); + plot.setWindowTitle("JKQTPColumnMathImage"); + + + return app.exec(); +} diff --git a/test/jkqtplotter_simpletest_imageplot/jkqtplotter_simpletest_imageplot.pro b/test/jkqtplotter_simpletest_imageplot/jkqtplotter_simpletest_imageplot.pro new file mode 100644 index 0000000000..d121f10f29 --- /dev/null +++ b/test/jkqtplotter_simpletest_imageplot/jkqtplotter_simpletest_imageplot.pro @@ -0,0 +1,16 @@ +# source code for this simple demo +SOURCES = jkqtplotter_simpletest_imageplot.cpp + +# configure Qt +CONFIG += qt +QT += core gui svg +greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport + +# output executable name +TARGET = jkqtplotter_simpletest_imageplot + +# include JKQtPlotter source code +include(../../lib/jkqtplotter.pri) +# here you can activate some debug options +#DEFINES += SHOW_JKQTPLOTTER_DEBUG +#DEFINES += JKQTBP_AUTOTIMER