update plot imaged for tutorials: datastore, datastorw_groupstat, datastore_regression, datastore_iterators, datastore_statistics

This commit is contained in:
jkriege2 2023-08-15 09:01:36 +02:00
parent 1cf16249cf
commit e66abc47ac
56 changed files with 125 additions and 28 deletions

28
.gitignore vendored
View File

@ -136,3 +136,31 @@ Sicherungskopie_*
/screenshots/datastore_map_small.png
/screenshots/datastore_sine_small.png
/screenshots/datastore_sineimg_small.png
/screenshots/datastore_regression_lin_small.png
/screenshots/datastore_regression_linrobust_p_small.png
/screenshots/datastore_regression_linrobust_small.png
/screenshots/datastore_regression_linweight_small.png
/screenshots/datastore_regression_nonlinreg_small.png
/screenshots/datastore_regression_nonlinregdatastore_regression_polynom.png
/screenshots/datastore_regression_nonlinregdatastore_regression_polynom_small.png
/screenshots/datastore_regression_polynom_errros_small.png
/screenshots/datastore_regression_polynom_small.png
/screenshots/datastore_regression_nonlinreg_exp_small.png
/screenshots/datastore_regression_nonlinreg_pow_small.png
/screenshots/datastore_groupedstat_barchart_small.png
/screenshots/datastore_groupedstat_barchartrawdata_small.png
/screenshots/datastore_groupedstat_boxplot_small.png
/screenshots/datastore_groupedstat_scatter_small.png
/screenshots/datastore_groupedstat_scatterrawdata_small.png
/screenshots/simpletest_datastore_iterators_cosine_small.png
/screenshots/simpletest_datastore_iterators_cosine_ysorted_small.png
/screenshots/datastore_iterators_cosine_small.png
/screenshots/datastore_iterators_cosine_ysorted_small.png
/screenshots/simpletest_datastore_iterators_cosine.png
/screenshots/simpletest_datastore_iterators_cosine_ysorted.png
/screenshots/datastore_statistics_boxplots_outliers_small.png
/screenshots/datastore_statistics_boxplots_simple_small.png
/screenshots/datastore_statistics_cumhistkde_small.png
/screenshots/datastore_statistics_dataonly_small.png
/screenshots/datastore_statistics_hist_small.png
/screenshots/datastore_statistics_kde_small.png

View File

@ -201,6 +201,11 @@ if(JKQtPlotter_BUILD_EXAMPLES)
logaxes/logaxes,logaxes_nolog,logaxes_nominorgrid/--iteratefunctorsteps
#speed
datastore/datastore,datastore_sine,datastore_linkedcarray,datastore_map,datastore_calccolumns,datastore_image,datastore_image_sorted,datastore_sineimg/--iteratefunctorsteps
datastore_iterators/datastore_iterators,datastore_iterators_cosine,datastore_iterators_cosine_ysorted,datastore_iterators_cosine_yreplaced,/--iteratefunctorsteps
datastore_groupedstat/datastore_groupedstat,datastore_groupedstat_barchartrawdata,datastore_groupedstat_barchart,datastore_groupedstat_boxplot,datastore_groupedstat_scatterrawdata,datastore_groupedstat_scatter/--iteratefunctorsteps
datastore_regression/datastore_regression,datastore_regression_lin,datastore_regression_linrobust,datastore_regression_linrobust_p,datastore_regression_linweight,datastore_regression_nonlinreg_exp,datastore_regression_nonlinreg_pow,datastore_regression_polynom,datastore_regression_polynom_errros/--iteratefunctorsteps
datastore_statistics/datastore_statistics,datastore_statistics_dataonly,datastore_statistics_boxplots_simple,datastore_statistics_boxplots_outliers,datastore_statistics_hist,datastore_statistics_kde,datastore_statistics_cumhistkde/--iteratefunctorsteps
datastore_statistics_2d/datastore_statistics_2d
)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@ -177,9 +177,9 @@ int main(int argc, char* argv[])
app.addExportStepFunctor([&]() { setVisible(1); plot.getPlotter()->setShowKey(false); plot.zoomToFit(); plot.redrawPlot(); plot.resize(400,400*4/6); });
app.addExportStepFunctor([&]() { setVisible(2); plot.getPlotter()->setShowKey(false); plot.zoomToFit(); plot.redrawPlot(); plot.resize(400,400*4/6); });
app.addExportStepFunctor([&]() { setVisible(3); plot.getPlotter()->setShowKey(false); plot.zoomToFit(); plot.redrawPlot(); plot.resize(400,400*4/6); });
app.addExportStepFunctor([&]() { setVisibleV({4,5}); plot.getPlotter()->setShowKey(false); plot.zoomToFit(); plot.redrawPlot(); plot.resize(400,400*4/6); });
app.addExportStepFunctor([&]() { setVisibleV({4,5}); plot.getPlotter()->setShowKey(false); plot.zoomToFit(); plot.redrawPlot(); plot.resize(600,400*4/6); });
app.addExportStepFunctor([&]() { std::sort(datastore->begin(colLinXY.second), datastore->end(colLinXY.second)); setVisibleV({4,5});plot.getPlotter()->setShowKey(false); plot.zoomToFit(); plot.redrawPlot(); });
app.addExportStepFunctor([&]() { setVisible(6); plot.zoomToFit(); plot.getPlotter()->setShowKey(false); plot.redrawPlot(); plot.resize(400,400); });
app.addExportStepFunctor([&]() { setVisible(6); plot.zoomToFit(); plot.getPlotter()->setShowKey(false); plot.redrawPlot(); plot.resize(300,300); });
return app.exec();
}

View File

@ -171,6 +171,7 @@ int main(int argc, char* argv[])
size_t colScatterRawY=datastore1->addColumn("scatterplot, rawdata, y");
std::random_device rd; // random number generators:
std::mt19937 gen{rd()};
gen.seed(12345);
std::normal_distribution<> d1{0,0.5};
const size_t N=100;
const double xmax=3.5;
@ -263,7 +264,13 @@ int main(int argc, char* argv[])
// show plotter and make it a decent size
mainWidget.show();
mainWidget.resize(1200,400);
mainWidget.resize(900,300);
app.addExportStepPlotFunctor([&]() { gBar->setVisible(false); plotbarchart->redrawPlot(); return plotbarchart;});
app.addExportStepPlotFunctor([&]() { gBar->setVisible(true); plotbarchart->redrawPlot(); return plotbarchart;});
app.addExportStepPlotFunctor([&]() { return plotboxplot; });
app.addExportStepPlotFunctor([&]() { gScatterErr->setVisible(false); plotscattererrors->redrawPlot(); return plotscattererrors;});
app.addExportStepPlotFunctor([&]() { gScatterErr->setVisible(true); plotscattererrors->redrawPlot(); return plotscattererrors;});
return app.exec();
}

View File

@ -48,7 +48,7 @@ In other tutorials we used e.g. `JKQTPDatastore::set()` to set values in data co
```
Here we added two columns with 50 entries. `XCol` contains linearly spaced values between 0 and 2*pi and `YCol` contains 50 uninitialized values. Then we iterate an index `i` over all these items (`datastore->getRows(XCol)` returns the rows in a column, i.e. 50 in the example above) and used `JKQTPDatastore::set()` to store the calculated values in the two columns. The current x-values is read from `XCol` using `JKQTPDatastore::get()`. The resulting plot looks like this:
![simpletest_datastore_iterators_cosine](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/datastore_iterators_cosine.png)
![datastore_iterators_cosine](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/datastore_iterators_cosine.png)
The same loop can be written using iterators:
```.cpp
@ -90,14 +90,14 @@ Of course you can now also interface other algorithms, like e.g. [`std::sort()`]
With this line of code, the `YCol` is sorted in ascending order and the plot becomes:
![simpletest_datastore_iterators_cosine_ysorted](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/datastore_iterators_cosine_ysorted.png)
![datastore_iterators_cosine_ysorted](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/datastore_iterators_cosine_ysorted.png)
Another example would be to replace all value `y<-0.5` with the value `1.0` using [`std::replace_if()`](https://de.cppreference.com/w/cpp/algorithm/replace):
```.cpp
std::replace_if(datastore->begin(YCol), datastore->end(YCol), [](double v) { return v<-0.5; }, 1.0);
```
![simpletest_datastore_iterators_cosine_yreplaced](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/datastore_iterators_cosine_yreplaced.png)
![datastore_iterators_cosine_yreplaced](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/datastore_iterators_cosine_yreplaced.png)
Finally also the [erase-remove idiom](https://en.wikipedia.org/wiki/Erase%E2%80%93remove_idiom) (e.g. known from `std::vector`) is supported:
```.cpp

View File

@ -52,7 +52,9 @@ int main(int argc, char* argv[])
// 2.3 combining with addLinearColumn() you can also use C++ STL algorithms:
//size_t XCol=datastore->addLinearColumn(50, 0, 4.0*JKQTPSTATISTICS_PI, "cos curve: x-data");
//size_t YCol=datastore->addColumn("cos curve: y-data");
size_t YCol2=datastore->addColumn("cos curve: y-data");
//std::transform(datastore->begin(XCol), datastore->end(XCol), datastore->backInserter(YCol), cos);
std::transform(datastore->begin(XCol), datastore->end(XCol), datastore->backInserter(YCol2), cos);
// 2.4. Just for fun we can now sort the data:
//std::sort(datastore->begin(YCol), datastore->end(YCol));
// or replace any value <-0.5 with 1:
@ -74,5 +76,10 @@ int main(int argc, char* argv[])
plot.show();
plot.resize(600,400);
app.addExportStepFunctor([&]() { std::sort(datastore->begin(YCol), datastore->end(YCol)); });
app.addExportStepFunctor([&]() {
std::replace_if(datastore->begin(YCol2), datastore->end(YCol2), [](double v) { return v<-0.5; }, 1.0); linegraph->setYColumn(YCol2); plot.zoomToFit(); });
return app.exec();
}

View File

@ -282,7 +282,8 @@ The regression models can be plotted using a `JKQTPXFunctionLineGraph`. the fucn
The resulting plot looks like this:
![datastore_regression_nonlinreg](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/datastore_regression_nonlinreg.png)
![datastore_regression_nonlinreg_exp](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/datastore_regression_nonlinreg_exp.png)
![datastore_regression_nonlinreg_pow](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/datastore_regression_nonlinreg_pow.png)
Of course also "adaptors" exist that allow to perform the steps above in a single function call:

View File

@ -54,6 +54,7 @@ int main(int argc, char* argv[])
// columns and added gaussian noise
std::random_device rd; // random number generators:
std::mt19937 gen{rd()};
gen.seed(12345);
std::normal_distribution<> d1{0,1};
double a0=-5;
double b0=2;
@ -96,8 +97,8 @@ int main(int argc, char* argv[])
size_t colWLinE=datastore1->addColumn("wlin data, errors");
for (double x=-5; x<=10; x++) {
double factor=1;
if (ddecide(gen)==4) {
factor=4;
if (ddecide(gen)>=3) {
factor=6;
}
const double err=de(gen)*factor;
datastore1->appendToColumn(colWLinX, x);
@ -192,12 +193,15 @@ int main(int argc, char* argv[])
p=1.5;
g=jkqtpstatAddRobustIRLSLinearRegression(graphD, nullptr, nullptr, false, false, p);
g->setTitle(g->getTitle()+", $p="+jkqtp_floattolatexqstr(p)+"$");
auto gp1=g;
p=1.7;
g=jkqtpstatAddRobustIRLSLinearRegression(graphD, nullptr, nullptr, false, false, p);
g->setTitle(g->getTitle()+", $p="+jkqtp_floattolatexqstr(p)+"$");
auto gp2=g;
p=2;
g=jkqtpstatAddRobustIRLSLinearRegression(graphD, nullptr, nullptr, false, false, p);
g->setTitle(g->getTitle()+", $p="+jkqtp_floattolatexqstr(p)+"$");
auto gp3=g;
@ -276,16 +280,20 @@ int main(int argc, char* argv[])
std::vector<double> pPoly {1,2,-2,0.5};
size_t colPolyX=datastore1->addColumn("polynomial data, x");
size_t colPolyY=datastore1->addColumn("polynomial data, y");
size_t colPolyYNN=datastore1->addColumn("polynomial data, y, no noise");
for (double x=-10; x<=10; x++) {
datastore1->appendToColumn(colPolyX, x);
datastore1->appendToColumn(colPolyY, jkqtp_polyEval(x, pPoly.begin(), pPoly.end())+d1(gen)*50.0);
datastore1->appendToColumn(colPolyYNN, jkqtp_polyEval(x, pPoly.begin(), pPoly.end()));
}
// we visualize this data with a simple scatter graph:
QVector<JKQTPGraph*> plotPNoise, plotsPNN;
JKQTPXYLineGraph* graphP;
plot6->addGraph(graphP=new JKQTPXYLineGraph(plot6));
graphP->setXYColumns(colPolyX, colPolyY);
graphP->setDrawLine(false);
graphP->setTitle(QString("data $%1+\\mathcal{N}(0,50)$").arg(jkqtp_polynomialModel2Latex(pPoly.begin(), pPoly.end())));
plotPNoise<<graphP;
// 6.2. now we can fit polynomials with different number of coefficients:
for (size_t p=0; p<=5; p++) {
std::vector<double> pFit;
@ -294,6 +302,25 @@ int main(int argc, char* argv[])
plot6->addGraph(gPoly=new JKQTPXFunctionLineGraph(plot6));
gPoly->setPlotFunctionFunctor(jkqtp_generatePolynomialModel(pFit.begin(), pFit.end()));
gPoly->setTitle(QString("regression: $%1$").arg(jkqtp_polynomialModel2Latex(pFit.begin(), pFit.end())));
plotPNoise<<gPoly;
}
JKQTPXYLineGraph* graphPNN;
plot6->addGraph(graphPNN=new JKQTPXYLineGraph(plot6));
graphPNN->setXYColumns(colPolyX, colPolyYNN);
graphPNN->setDrawLine(false);
graphPNN->setTitle(QString("data $%1$").arg(jkqtp_polynomialModel2Latex(pPoly.begin(), pPoly.end())));
graphPNN->setVisible(false);
plotsPNN<<graphPNN;
// 6.2. now we can fit polynomials with different number of coefficients:
for (size_t p=0; p<=5; p++) {
std::vector<double> pFit;
JKQTPXFunctionLineGraph* gPoly;
jkqtpstatPolyFit(datastore1->begin(colPolyX), datastore1->end(colPolyX), datastore1->begin(colPolyYNN), datastore1->end(colPolyYNN), p, std::back_inserter(pFit));
plot6->addGraph(gPoly=new JKQTPXFunctionLineGraph(plot6));
gPoly->setPlotFunctionFunctor(jkqtp_generatePolynomialModel(pFit.begin(), pFit.end()));
gPoly->setTitle(QString("regression: $%1$").arg(jkqtp_polynomialModel2Latex(pFit.begin(), pFit.end())));
gPoly->setVisible(false);
plotsPNN<<gPoly;
}
// 6.3. of course also the "adaptor" shortcuts are available:
//for (size_t p=0; p<=5; p++) {
@ -338,5 +365,14 @@ int main(int argc, char* argv[])
mainWidget.show();
mainWidget.resize(1600,800);
app.addExportStepPlotFunctor([&]() { mainWidget.resize(2000, 900); return plot1; });
app.addExportStepPlotFunctor([&]() { gp1->setVisible(false); gp2->setVisible(false); gp3->setVisible(false); plot3->redrawPlot(); return plot3; });
app.addExportStepPlotFunctor([&]() { gp1->setVisible(true); gp2->setVisible(true); gp3->setVisible(true); plot3->redrawPlot(); return plot3; });
app.addExportStepPlot(plot2);
app.addExportStepPlot(plot4);
app.addExportStepPlot(plot5);
app.addExportStepPlotFunctor([&]() { std::for_each(plotPNoise.begin(), plotPNoise.end(), [](JKQTPGraph* g) {g->setVisible(false);}); std::for_each(plotsPNN.begin(), plotsPNN.end(), [](JKQTPGraph* g) {g->setVisible(true);}); plot6->setX(-12.5,12.5); plot6->redrawPlot(); return plot6; });
app.addExportStepPlotFunctor([&]() { std::for_each(plotPNoise.begin(), plotPNoise.end(), [](JKQTPGraph* g) {g->setVisible(true);}); std::for_each(plotsPNN.begin(), plotsPNN.end(), [](JKQTPGraph* g) {g->setVisible(false);}); plot6->setX(-12.5,12.5); plot6->redrawPlot(); return plot6; });
return app.exec();
}

View File

@ -54,6 +54,7 @@ int main(int argc, char* argv[])
size_t randomdatacol3=datastore1->addColumn("random data 3");
std::random_device rd; // random number generators:
std::mt19937 gen{rd()};
gen.seed(12345);
std::uniform_int_distribution<> ddecide(0,1);
std::normal_distribution<> d1{0,1};
std::normal_distribution<> d2{6,1.2};
@ -146,26 +147,29 @@ int main(int argc, char* argv[])
// 4.1. We repeat the JKQTPPeakStreamGraph visualization from above:
plot1->addGraph(gData1=new JKQTPPeakStreamGraph(plot1));
gData1->setDataColumn(randomdatacol1);
gData1->setBaseline(-0.1);
gData1->setPeakHeight(-0.05);
gData1->setDrawBaseline(false);
gData1->setTitle("random data $"+d1_latex+"+"+d2_latex+"$");
JKQTPPeakStreamGraph* pgData1;
plot1->addGraph(pgData1=new JKQTPPeakStreamGraph(plot1));
pgData1->setDataColumn(randomdatacol1);
pgData1->setBaseline(-0.1);
pgData1->setPeakHeight(-0.05);
pgData1->setDrawBaseline(false);
pgData1->setTitle("random data $"+d1_latex+"+"+d2_latex+"$");
// 4.2. same as 3.1-3.2, but for the second and thirdcolumn of data:
plot1->addGraph(gData2=new JKQTPPeakStreamGraph(plot1));
gData2->setDataColumn(randomdatacol2);
gData2->setBaseline(-0.1);
gData2->setPeakHeight(0.05);
gData2->setDrawBaseline(false);
gData2->setTitle("random data subset $"+d1_latex+"$");
plot1->addGraph(gData3=new JKQTPPeakStreamGraph(plot1));
gData3->setDataColumn(randomdatacol3);
gData3->setBaseline(-0.15);
gData3->setPeakHeight(-0.05);
gData3->setDrawBaseline(false);
gData3->setTitle("random data subset $"+d2_latex+"$");
JKQTPPeakStreamGraph* pgData2;
plot1->addGraph(pgData2=new JKQTPPeakStreamGraph(plot1));
pgData2->setDataColumn(randomdatacol2);
pgData2->setBaseline(-0.1);
pgData2->setPeakHeight(0.05);
pgData2->setDrawBaseline(false);
pgData2->setTitle("random data subset $"+d1_latex+"$");
JKQTPPeakStreamGraph* pgData3;
plot1->addGraph(pgData3=new JKQTPPeakStreamGraph(plot1));
pgData3->setDataColumn(randomdatacol3);
pgData3->setBaseline(-0.15);
pgData3->setPeakHeight(-0.05);
pgData3->setDrawBaseline(false);
pgData3->setTitle("random data subset $"+d2_latex+"$");
// 4.3. for comparison we add plots of the initial distributions:
plot1->addGraph(new JKQTPXFunctionLineGraph(std::bind(&jkqtp_gaussdist, std::placeholders::_1, d1.mean(), d1.stddev()), d1_latex, plot1));
@ -289,5 +293,12 @@ int main(int argc, char* argv[])
mainWidget.show();
mainWidget.resize(1200,800);
app.addExportStepPlotFunctor([&]() { gData1->setVisible(true); gBox1.first->setVisible(false); gBox1.second->setVisible(false); gData2->setVisible(true); gBox2->setVisible(false); gData3->setVisible(true); gBox3->setVisible(false); plot1box->redrawPlot(); return plot1box; });
app.addExportStepPlotFunctor([&]() { gData1->setVisible(false); gBox1.first->setVisible(false); gBox1.second->setVisible(false); gData2->setVisible(true); gBox2->setVisible(true); gData3->setVisible(true); gBox3->setVisible(true); plot1box->redrawPlot(); return plot1box; });
app.addExportStepPlotFunctor([&]() { gData1->setVisible(true); gBox1.first->setVisible(true); gBox1.second->setVisible(true); gData2->setVisible(false); gBox2->setVisible(false); gData3->setVisible(false); gBox3->setVisible(false); plot1box->redrawPlot(); return plot1box; });
app.addExportStepPlotFunctor([&]() { return plot1; });
app.addExportStepPlotFunctor([&]() { return plot1kde; });
app.addExportStepPlotFunctor([&]() { return plot1cum; });
return app.exec();
}

View File

@ -102,6 +102,7 @@ int main(int argc, char* argv[])
// random number generators:
std::random_device rd;
std::mt19937 gen{rd()};
gen.seed(12345);
std::uniform_int_distribution<> ddecide(0,2);
std::normal_distribution<> d1x{5,3};
std::normal_distribution<> d1y{5,1};

View File

@ -40,6 +40,7 @@ JKQTPPeakStreamGraph::JKQTPPeakStreamGraph(JKQTBasePlotter *parent):
yPeaks=true;
peakHeight=1;
drawBaseline=true;
parentPlotStyle=-1;
initLineStyle(parent, parentPlotStyle, JKQTPPlotStyleType::Default);
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.9 KiB

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 137 KiB

After

Width:  |  Height:  |  Size: 201 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.5 KiB

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 KiB

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 147 KiB

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 7.3 KiB