mirror of
https://github.com/jkriege2/JKQtPlotter.git
synced 2024-12-25 10:01:38 +08:00
added y-range-plot JKQTPfilledVerticalRangeGraph and example for it + date/time axes
This commit is contained in:
parent
2724b007aa
commit
18a3a9857a
@ -20,6 +20,7 @@ All test-projects are Qt-projects that use qmake to build. You can load them int
|
|||||||
| [![](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest1_small.png)](https://github.com/jkriege2/JKQtPlotter/tree/master/test/jkqtplotter_simpletest) | [Very Basic Example (Line Graph)](https://github.com/jkriege2/JKQtPlotter/tree/master/test/jkqtplotter_simpletest) | `JKQTPxyLineGraph`<br/>C-style arrays of data |
|
| [![](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest1_small.png)](https://github.com/jkriege2/JKQtPlotter/tree/master/test/jkqtplotter_simpletest) | [Very Basic Example (Line Graph)](https://github.com/jkriege2/JKQtPlotter/tree/master/test/jkqtplotter_simpletest) | `JKQTPxyLineGraph`<br/>C-style arrays of data |
|
||||||
| [![](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_symbols_and_styles_small.png)](https://github.com/jkriege2/JKQtPlotter/tree/master/test/jkqtplotter_simpletest_symbols_and_styles) | [Line Graph with Different Symbols and Line Styles](https://github.com/jkriege2/JKQtPlotter/tree/master/test/jkqtplotter_simpletest_symbols_and_styles) | `JKQTPxyLineGraph`<br/>C++ vector of data<br/>setting line styles and symbol styles<br/>automatic graph coloring |
|
| [![](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_symbols_and_styles_small.png)](https://github.com/jkriege2/JKQtPlotter/tree/master/test/jkqtplotter_simpletest_symbols_and_styles) | [Line Graph with Different Symbols and Line Styles](https://github.com/jkriege2/JKQtPlotter/tree/master/test/jkqtplotter_simpletest_symbols_and_styles) | `JKQTPxyLineGraph`<br/>C++ vector of data<br/>setting line styles and symbol styles<br/>automatic graph coloring |
|
||||||
| [![](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_logaxes_small.png)](https://github.com/jkriege2/JKQtPlotter/tree/master/test/jkqtplotter_simpletest_logaxes) | [logarithmic axes](https://github.com/jkriege2/JKQtPlotter/tree/master/test/jkqtplotter_simpletest_logaxes) | `JKQTPxyLineGraph` and `JKQTPgeoText`<br/>C++ vector of data<br/>logarithmic axes<br/>plot line styles<br/>internal LaTeX parser<br/>add commenting text to a graph |
|
| [![](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_logaxes_small.png)](https://github.com/jkriege2/JKQtPlotter/tree/master/test/jkqtplotter_simpletest_logaxes) | [logarithmic axes](https://github.com/jkriege2/JKQtPlotter/tree/master/test/jkqtplotter_simpletest_logaxes) | `JKQTPxyLineGraph` and `JKQTPgeoText`<br/>C++ vector of data<br/>logarithmic axes<br/>plot line styles<br/>internal LaTeX parser<br/>add commenting text to a graph |
|
||||||
|
| [![](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_dateaxes_small.png)](https://github.com/jkriege2/JKQtPlotter/tree/master/test/jkqtplotter_simpletest_dateaxes) | [date/time axes](https://github.com/jkriege2/JKQtPlotter/tree/master/test/jkqtplotter_simpletest_dateaxes) | `JKQTPxyLineGraph` and ``<br/>C++ vector of data<br/>date/time axes<br/>plot min/max range graph<br/>internal LaTeX parser<br/>data from CSV files |
|
||||||
| [![](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_symbols_and_errors_small.png)](https://github.com/jkriege2/JKQtPlotter/tree/master/test/jkqtplotter_simpletest_symbols_and_errors) | [Simple Line/Symbol Graph With Errorbars](https://github.com/jkriege2/JKQtPlotter/tree/master/test/jkqtplotter_simpletest_symbols_and_errors) | `JKQTPxyLineErrorGraph`<br/>C-style arrays of data |
|
| [![](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_symbols_and_errors_small.png)](https://github.com/jkriege2/JKQtPlotter/tree/master/test/jkqtplotter_simpletest_symbols_and_errors) | [Simple Line/Symbol Graph With Errorbars](https://github.com/jkriege2/JKQtPlotter/tree/master/test/jkqtplotter_simpletest_symbols_and_errors) | `JKQTPxyLineErrorGraph`<br/>C-style arrays of data |
|
||||||
| [![](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_barchart_small.png)](https://github.com/jkriege2/JKQtPlotter/tree/master/test/jkqtplotter_simpletest_barchart) | [Simple Bar Charts](https://github.com/jkriege2/JKQtPlotter/tree/master/test/jkqtplotter_simpletest_barchart) | `JKQTPbarVerticalGraph`<br/>C-style arrays of data |
|
| [![](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_barchart_small.png)](https://github.com/jkriege2/JKQtPlotter/tree/master/test/jkqtplotter_simpletest_barchart) | [Simple Bar Charts](https://github.com/jkriege2/JKQtPlotter/tree/master/test/jkqtplotter_simpletest_barchart) | `JKQTPbarVerticalGraph`<br/>C-style arrays of data |
|
||||||
| [![](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/JKQTPbarVerticalGraphStacked_small.png)](https://github.com/jkriege2/JKQtPlotter/tree/master/test/jkqtplotter_simpletest_stackedbars) | [Stacked Bar Charts](https://github.com/jkriege2/JKQtPlotter/tree/master/test/jkqtplotter_simpletest_stackedbars) | `JKQTPbarVerticalStackableGraph`, `JKQTPbarHorizontalStackableGraph`<br/>C++-style vectors of data |
|
| [![](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/JKQTPbarVerticalGraphStacked_small.png)](https://github.com/jkriege2/JKQtPlotter/tree/master/test/jkqtplotter_simpletest_stackedbars) | [Stacked Bar Charts](https://github.com/jkriege2/JKQtPlotter/tree/master/test/jkqtplotter_simpletest_stackedbars) | `JKQTPbarVerticalStackableGraph`, `JKQTPbarHorizontalStackableGraph`<br/>C++-style vectors of data |
|
||||||
|
BIN
doc/images/JKQTPfilledVerticalRangeGraph.png
Normal file
BIN
doc/images/JKQTPfilledVerticalRangeGraph.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 31 KiB |
BIN
doc/images/JKQTPfilledVerticalRangeGraph_WithLines.png
Normal file
BIN
doc/images/JKQTPfilledVerticalRangeGraph_WithLines.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 40 KiB |
BIN
doc/images/jkqtplotter_simpletest_dateaxes.png
Normal file
BIN
doc/images/jkqtplotter_simpletest_dateaxes.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 38 KiB |
@ -255,9 +255,9 @@ void JKQTPcoordinateAxis::loadSettings(QSettings& settings, QString group) {
|
|||||||
JKQTPPROPERTYload(settings, group+axisPrefix, minorTickLabelFontSize, "minor_tick_label_font_size", toDouble());
|
JKQTPPROPERTYload(settings, group+axisPrefix, minorTickLabelFontSize, "minor_tick_label_font_size", toDouble());
|
||||||
JKQTPPROPERTYload(settings, group+axisPrefix, minorTickLabelFullNumber, "minor_tick_label_full_number", toBool());
|
JKQTPPROPERTYload(settings, group+axisPrefix, minorTickLabelFullNumber, "minor_tick_label_full_number", toBool());
|
||||||
|
|
||||||
JKQTPPROPERTYload(settings, group+axisPrefix, tickTimeFormat, "tick_time_format", toDouble());
|
JKQTPPROPERTYload(settings, group+axisPrefix, tickTimeFormat, "tick_time_format", toString());
|
||||||
JKQTPPROPERTYload(settings, group+axisPrefix, tickDateFormat, "tick_date_format", toDouble());
|
JKQTPPROPERTYload(settings, group+axisPrefix, tickDateFormat, "tick_date_format", toString());
|
||||||
JKQTPPROPERTYload(settings, group+axisPrefix, tickDateTimeFormat, "tick_datetime_format", toDouble());
|
JKQTPPROPERTYload(settings, group+axisPrefix, tickDateTimeFormat, "tick_datetime_format", toString());
|
||||||
|
|
||||||
|
|
||||||
JKQTPPROPERTYload(settings, group+axisPrefix, minTicks, "min_ticks", toUInt());
|
JKQTPPROPERTYload(settings, group+axisPrefix, minTicks, "min_ticks", toUInt());
|
||||||
@ -577,17 +577,17 @@ QString JKQTPcoordinateAxis::floattolabel(double data) {
|
|||||||
}; break;
|
}; break;
|
||||||
case JKQTPCALTdate: {
|
case JKQTPCALTdate: {
|
||||||
QDateTime dt;
|
QDateTime dt;
|
||||||
dt.setMSecsSinceEpoch(uint(data));
|
dt.setMSecsSinceEpoch(uint64_t(data));
|
||||||
return dt.toString(tickDateFormat);
|
return dt.toString(tickDateFormat);
|
||||||
}; break;
|
}; break;
|
||||||
case JKQTPCALTtime: {
|
case JKQTPCALTtime: {
|
||||||
QDateTime dt;
|
QDateTime dt;
|
||||||
dt.setMSecsSinceEpoch(uint(data));
|
dt.setMSecsSinceEpoch(uint64_t(data));
|
||||||
return dt.toString(tickTimeFormat);
|
return dt.toString(tickTimeFormat);
|
||||||
}; break;
|
}; break;
|
||||||
case JKQTPCALTdatetime: {
|
case JKQTPCALTdatetime: {
|
||||||
QDateTime dt;
|
QDateTime dt;
|
||||||
dt.setMSecsSinceEpoch(uint(data));
|
dt.setMSecsSinceEpoch(uint64_t(data));
|
||||||
return dt.toString(tickDateTimeFormat);
|
return dt.toString(tickDateTimeFormat);
|
||||||
}; break;
|
}; break;
|
||||||
default:
|
default:
|
||||||
|
@ -650,11 +650,11 @@ class LIB_EXPORT JKQTPcoordinateAxis: public QObject {
|
|||||||
JKQTPPROPERTY(double, lineWidthZeroAxis)
|
JKQTPPROPERTY(double, lineWidthZeroAxis)
|
||||||
|
|
||||||
|
|
||||||
/** \brief format string for time tick labels */
|
/** \brief format string for time tick labels, see see QDateTime::toString() documentation for details on format strings */
|
||||||
JKQTPPROPERTY(QString, tickTimeFormat)
|
JKQTPPROPERTY(QString, tickTimeFormat)
|
||||||
/** \brief format string for date tick labels */
|
/** \brief format string for date tick labels, see see QDateTime::toString() documentation for details on format strings */
|
||||||
JKQTPPROPERTY(QString, tickDateFormat)
|
JKQTPPROPERTY(QString, tickDateFormat)
|
||||||
/** \brief format string for datetime tick labels */
|
/** \brief format string for datetime tick labels, see see QDateTime::toString() documentation for details on format strings */
|
||||||
JKQTPPROPERTY(QString, tickDateTimeFormat)
|
JKQTPPROPERTY(QString, tickDateTimeFormat)
|
||||||
|
|
||||||
/** \brief calculates the tick spacing for a linear axis that spans \a awidth and that should
|
/** \brief calculates the tick spacing for a linear axis that spans \a awidth and that should
|
||||||
|
@ -2388,3 +2388,241 @@ bool JKQTPxyParametrizedErrorScatterGraph::intPlotXYErrorIndicatorsGetColor(JKQT
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
JKQTPfilledVerticalRangeGraph::JKQTPfilledVerticalRangeGraph(JKQtBasePlotter *parent):
|
||||||
|
JKQTPxyGraph(parent)
|
||||||
|
{
|
||||||
|
drawSelectionLine=false;
|
||||||
|
selectionLineColor=Qt::transparent;
|
||||||
|
color=QColor("red");
|
||||||
|
fillColor=color.lighter();
|
||||||
|
style=Qt::SolidLine;
|
||||||
|
lineWidth=2;
|
||||||
|
parentPlotStyle=-1;
|
||||||
|
drawLine=true;
|
||||||
|
fillStyle=Qt::SolidPattern;
|
||||||
|
|
||||||
|
if (parent) { // get style settings from parent object
|
||||||
|
parentPlotStyle=parent->getNextStyle();
|
||||||
|
//std::cout<<"got style settings from parent: "<<parentPlotStyle<<std::endl;
|
||||||
|
color=parent->getPlotStyle(parentPlotStyle).color();
|
||||||
|
style=parent->getPlotStyle(parentPlotStyle).style();
|
||||||
|
fillColor=color.lighter();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
JKQTPfilledVerticalRangeGraph::JKQTPfilledVerticalRangeGraph(JKQtPlotter *parent):
|
||||||
|
JKQTPxyGraph(parent)
|
||||||
|
{
|
||||||
|
drawSelectionLine=false;
|
||||||
|
selectionLineColor=Qt::transparent;
|
||||||
|
color=QColor("red");
|
||||||
|
fillColor=color.lighter();
|
||||||
|
style=Qt::SolidLine;
|
||||||
|
lineWidth=2;
|
||||||
|
parentPlotStyle=-1;
|
||||||
|
drawLine=true;
|
||||||
|
fillStyle=Qt::SolidPattern;
|
||||||
|
|
||||||
|
if (parent) { // get style settings from parent object
|
||||||
|
parentPlotStyle=parent->getNextStyle();
|
||||||
|
//std::cout<<"got style settings from parent: "<<parentPlotStyle<<std::endl;
|
||||||
|
color=parent->getPlotStyle(parentPlotStyle).color();
|
||||||
|
style=parent->getPlotStyle(parentPlotStyle).style();
|
||||||
|
fillColor=color.lighter();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool JKQTPfilledVerticalRangeGraph::getYMinMax(double &miny, double &maxy, double &smallestGreaterZero)
|
||||||
|
{
|
||||||
|
bool start=true;
|
||||||
|
miny=0;
|
||||||
|
maxy=0;
|
||||||
|
smallestGreaterZero=0;
|
||||||
|
|
||||||
|
if (parent==nullptr) return false;
|
||||||
|
|
||||||
|
JKQTPdatastore* datastore=parent->getDatastore();
|
||||||
|
int imin=0;
|
||||||
|
int imax=qMin(qMin(datastore->getColumn(static_cast<size_t>(xColumn)).getRows(), datastore->getColumn(static_cast<size_t>(yColumn)).getRows()), datastore->getColumn(static_cast<size_t>(yColumn2)).getRows());
|
||||||
|
// interpret data ranges
|
||||||
|
if (datarange_start>-1) {
|
||||||
|
imin=qMin(datarange_start, static_cast<long long>(imax));
|
||||||
|
}
|
||||||
|
if (datarange_end>-1) {
|
||||||
|
imax=qMin(datarange_end, static_cast<long long>(imax));
|
||||||
|
}
|
||||||
|
if (imax<imin) {
|
||||||
|
int h=imin;
|
||||||
|
imin=imax;
|
||||||
|
imax=h;
|
||||||
|
}
|
||||||
|
if (imin<0) imin=0;
|
||||||
|
if (imax<0) imax=0;
|
||||||
|
|
||||||
|
for (int i=imin; i<imax; i++) {
|
||||||
|
double yv=datastore->get(static_cast<size_t>(yColumn),static_cast<size_t>(i));
|
||||||
|
double yv2=datastore->get(static_cast<size_t>(yColumn2),static_cast<size_t>(i));
|
||||||
|
if (JKQTPIsOKFloat(yv)) {
|
||||||
|
if (start || yv>maxy) maxy=yv;
|
||||||
|
if (start || yv<miny) miny=yv;
|
||||||
|
double xvsgz;
|
||||||
|
xvsgz=yv; SmallestGreaterZeroCompare_xvsgz();
|
||||||
|
start=false;
|
||||||
|
}
|
||||||
|
if (JKQTPIsOKFloat(yv2)) {
|
||||||
|
if (start || yv2>maxy) maxy=yv2;
|
||||||
|
if (start || yv2<miny) miny=yv2;
|
||||||
|
double xvsgz;
|
||||||
|
xvsgz=yv2; SmallestGreaterZeroCompare_xvsgz();
|
||||||
|
start=false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return !start;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool JKQTPfilledVerticalRangeGraph::usesColumn(int column)
|
||||||
|
{
|
||||||
|
return JKQTPxyGraph::usesColumn(column)||(column==yColumn2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JKQTPfilledVerticalRangeGraph::draw(JKQTPEnhancedPainter &painter)
|
||||||
|
{
|
||||||
|
#ifdef JKQTBP_AUTOTIMER
|
||||||
|
JKQTPAutoOutputTimer jkaaot("JKQTPfilledCurveXGraph::draw");
|
||||||
|
#endif
|
||||||
|
if (parent==nullptr) return;
|
||||||
|
JKQTPdatastore* datastore=parent->getDatastore();
|
||||||
|
if (datastore==nullptr) return;
|
||||||
|
|
||||||
|
drawErrorsBefore(painter);
|
||||||
|
|
||||||
|
painter.save();
|
||||||
|
|
||||||
|
QPen p=painter.pen();
|
||||||
|
p.setColor(color);
|
||||||
|
p.setWidthF(qMax(JKQTPLOTTER_ABS_MIN_LINEWIDTH, parent->pt2px(painter, lineWidth*parent->get_lineWidthMultiplier())));
|
||||||
|
p.setStyle(style);
|
||||||
|
p.setJoinStyle(Qt::RoundJoin);
|
||||||
|
p.setCapStyle(Qt::RoundCap);
|
||||||
|
QPen np(Qt::NoPen);
|
||||||
|
|
||||||
|
QBrush b=painter.brush();
|
||||||
|
b.setColor(fillColor);
|
||||||
|
b.setStyle(fillStyle);
|
||||||
|
|
||||||
|
int imax=qMin(qMin(datastore->getColumn(static_cast<size_t>(xColumn)).getRows(), datastore->getColumn(static_cast<size_t>(yColumn)).getRows()), datastore->getColumn(static_cast<size_t>(yColumn2)).getRows());
|
||||||
|
int imin=0;
|
||||||
|
// interpret data ranges
|
||||||
|
if (datarange_start>-1) {
|
||||||
|
imin=qMin(datarange_start, static_cast<long long>(imax));
|
||||||
|
}
|
||||||
|
if (datarange_end>-1) {
|
||||||
|
imax=qMin(datarange_end, static_cast<long long>(imax));
|
||||||
|
}
|
||||||
|
if (imax<imin) {
|
||||||
|
int h=imin;
|
||||||
|
imin=imax;
|
||||||
|
imax=h;
|
||||||
|
}
|
||||||
|
if (imin<0) imin=0;
|
||||||
|
if (imax<0) imax=0;
|
||||||
|
|
||||||
|
// upper points are added to poly_all, lower points to plow
|
||||||
|
// then plow points are added to poly_all in vewerse order
|
||||||
|
// then the whole thing is drawn
|
||||||
|
QPolygonF poly_all, phigh, plow;
|
||||||
|
|
||||||
|
double xold=-1;
|
||||||
|
|
||||||
|
bool first=true;
|
||||||
|
intSortData();
|
||||||
|
for (int iii=imin; iii<imax; iii++) {
|
||||||
|
int i=qBound(imin, getDataIndex(iii), imax);
|
||||||
|
double xv=datastore->get(static_cast<size_t>(xColumn),static_cast<size_t>(i));
|
||||||
|
double yv=datastore->get(static_cast<size_t>(yColumn),static_cast<size_t>(i));
|
||||||
|
double yv2=datastore->get(static_cast<size_t>(yColumn2),static_cast<size_t>(i));
|
||||||
|
//std::cout<<"(xv, yv) = ( "<<xv<<", "<<yv<<" )\n";
|
||||||
|
if (JKQTPIsOKFloat(xv)) {
|
||||||
|
double x=xAxis->x2p(xv); bool xok=JKQTPIsOKFloat(x);
|
||||||
|
double y=yAxis->x2p(yv); bool yok=JKQTPIsOKFloat(y);
|
||||||
|
double y2=yAxis->x2p(yv2); bool y2ok=JKQTPIsOKFloat(y2);
|
||||||
|
|
||||||
|
if (xok&&yok) phigh.append(QPointF(x,y));
|
||||||
|
if (xok&&yok) poly_all.append(QPointF(x,y));
|
||||||
|
if (xok&&y2ok) plow.append(QPointF(x,y2));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (plow.size()>0) {
|
||||||
|
for (int i=plow.size()-1; i>=0; i--) {
|
||||||
|
poly_all.append(plow[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
painter.setBrush(b);
|
||||||
|
painter.setPen(np);
|
||||||
|
painter.drawPolygon(poly_all);
|
||||||
|
|
||||||
|
painter.restore();
|
||||||
|
if (drawLine) {
|
||||||
|
painter.save();
|
||||||
|
|
||||||
|
if (drawSelectionLine) {
|
||||||
|
QPen penSelection=p; penSelection.setStyle(Qt::SolidLine);
|
||||||
|
QColor selcol=penSelection.color(); selcol.setAlphaF(0.5); penSelection.setColor(selcol);
|
||||||
|
if (selectionLineColor!=Qt::transparent) {
|
||||||
|
penSelection.setColor(selectionLineColor);
|
||||||
|
}
|
||||||
|
penSelection.setWidthF(penSelection.widthF()*3.0);
|
||||||
|
painter.setPen(penSelection);
|
||||||
|
painter.drawPolyline(phigh);
|
||||||
|
painter.drawPolyline(plow);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
painter.setPen(p);
|
||||||
|
painter.drawPolyline(phigh);
|
||||||
|
painter.drawPolyline(plow);
|
||||||
|
painter.restore();
|
||||||
|
}
|
||||||
|
|
||||||
|
drawErrorsAfter(painter);
|
||||||
|
}
|
||||||
|
|
||||||
|
void JKQTPfilledVerticalRangeGraph::drawKeyMarker(JKQTPEnhancedPainter &painter, QRectF &rect)
|
||||||
|
{
|
||||||
|
painter.save();
|
||||||
|
QRectF r=rect;
|
||||||
|
r.setHeight(r.height()/2.0);
|
||||||
|
r.moveTo(r.x(), r.y()+r.height()-1);
|
||||||
|
painter.fillRect(r, getBrush(painter));
|
||||||
|
if (drawLine) {
|
||||||
|
painter.setPen(getLinePen(painter));
|
||||||
|
painter.drawLine(QLineF(r.topLeft(), r.topRight()));
|
||||||
|
}
|
||||||
|
painter.restore();
|
||||||
|
}
|
||||||
|
|
||||||
|
QColor JKQTPfilledVerticalRangeGraph::getKeyLabelColor()
|
||||||
|
{
|
||||||
|
return color;
|
||||||
|
}
|
||||||
|
|
||||||
|
QBrush JKQTPfilledVerticalRangeGraph::getBrush(JKQTPEnhancedPainter &painter) const
|
||||||
|
{
|
||||||
|
QBrush b;
|
||||||
|
b.setColor(fillColor);
|
||||||
|
b.setStyle(fillStyle);
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
QPen JKQTPfilledVerticalRangeGraph::getLinePen(JKQTPEnhancedPainter &painter) const
|
||||||
|
{
|
||||||
|
QPen p;
|
||||||
|
p.setColor(color);
|
||||||
|
p.setWidthF(qMax(JKQTPLOTTER_ABS_MIN_LINEWIDTH, parent->pt2px(painter, lineWidth*parent->get_lineWidthMultiplier())));
|
||||||
|
p.setStyle(style);
|
||||||
|
p.setJoinStyle(Qt::RoundJoin);
|
||||||
|
p.setCapStyle(Qt::RoundCap);
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
@ -605,6 +605,84 @@ class LIB_EXPORT JKQTPfilledCurveYErrorGraph: public JKQTPfilledCurveYGraph, pub
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*! \brief This implements filled curve plots where the area is filled between two data columns for each x-value
|
||||||
|
\ingroup jkqtplotter_plots
|
||||||
|
|
||||||
|
With set_drawlines(false):
|
||||||
|
\image html JKQTPfilledVerticalRangeGraph.png
|
||||||
|
|
||||||
|
With set_drawlines(true):
|
||||||
|
\image html JKQTPfilledVerticalRangeGraph_WithLines.png
|
||||||
|
*/
|
||||||
|
class LIB_EXPORT JKQTPfilledVerticalRangeGraph: public JKQTPxyGraph {
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
/** \brief class constructor */
|
||||||
|
JKQTPfilledVerticalRangeGraph(JKQtBasePlotter* parent=nullptr);
|
||||||
|
/** \brief class constructor */
|
||||||
|
JKQTPfilledVerticalRangeGraph(JKQtPlotter* parent);
|
||||||
|
/** \brief get the maximum and minimum y-value of the graph
|
||||||
|
*
|
||||||
|
* The result is given in the two parameters which are call-by-reference parameters!
|
||||||
|
*/
|
||||||
|
virtual bool getYMinMax(double& miny, double& maxy, double& smallestGreaterZero);
|
||||||
|
|
||||||
|
/** \copydoc JKQTPgraph::usesColumn() */
|
||||||
|
virtual bool usesColumn(int column);
|
||||||
|
|
||||||
|
/** \brief plots the graph to the plotter object specified as parent */
|
||||||
|
virtual void draw(JKQTPEnhancedPainter& painter);
|
||||||
|
/** \brief plots a key marker inside the specified rectangle \a rect */
|
||||||
|
virtual void drawKeyMarker(JKQTPEnhancedPainter& painter, QRectF& rect);
|
||||||
|
/** \brief returns the color to be used for the key label */
|
||||||
|
virtual QColor getKeyLabelColor();
|
||||||
|
|
||||||
|
JKQTPGET_SET_MACRO(int, yColumn2)
|
||||||
|
JKQTPSET_CAST_MACRO(size_t, int, yColumn2)
|
||||||
|
|
||||||
|
JKQTPGET_SET_MACRO(QColor, color)
|
||||||
|
JKQTPGET_SET_MACRO(QColor, fillColor)
|
||||||
|
JKQTPGET_SET_MACRO(Qt::PenStyle, style)
|
||||||
|
JKQTPGET_SET_MACRO(bool, drawLine)
|
||||||
|
JKQTPGET_SET_MACRO(Qt::BrushStyle, fillStyle)
|
||||||
|
|
||||||
|
JKQTPGET_SET_MACRO(bool, drawSelectionLine)
|
||||||
|
JKQTPGET_SET_MACRO(QColor, selectionLineColor)
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
/** \brief the column that contains the second y-component of the range */
|
||||||
|
int yColumn2;
|
||||||
|
/** \brief if \c true, draws a thick shadow around the line*/
|
||||||
|
bool drawSelectionLine;
|
||||||
|
/** \brief color for the shadow, or a lighter version of the line color, if transparent (default) */
|
||||||
|
QColor selectionLineColor;
|
||||||
|
|
||||||
|
/** \brief which plot style to use from the parent plotter (via JKQtPlotterBase::getPlotStyle() and JKQtPlotterBase::getNextStyle() ) */
|
||||||
|
int parentPlotStyle;
|
||||||
|
|
||||||
|
/** \brief color of the graph */
|
||||||
|
QColor color;
|
||||||
|
/** \brief color of the graph fill */
|
||||||
|
QColor fillColor;
|
||||||
|
/** \brief fill styl for the curve */
|
||||||
|
Qt::BrushStyle fillStyle;
|
||||||
|
/** \brief linestyle of the graph lines */
|
||||||
|
Qt::PenStyle style;
|
||||||
|
/** \brief width (pixels) of the graph */
|
||||||
|
double lineWidth;
|
||||||
|
/** \brief indicates whether to draw a line or not */
|
||||||
|
bool drawLine;
|
||||||
|
|
||||||
|
QBrush getBrush(JKQTPEnhancedPainter& painter) const;
|
||||||
|
QPen getLinePen(JKQTPEnhancedPainter& painter) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*! \brief This implements a step plot with values \f$ \left(x, f(x) \right) \f$
|
/*! \brief This implements a step plot with values \f$ \left(x, f(x) \right) \f$
|
||||||
\ingroup jkqtplotter_plots
|
\ingroup jkqtplotter_plots
|
||||||
|
|
||||||
|
BIN
screenshots/jkqtplotter_simpletest_dateaxes.png
Normal file
BIN
screenshots/jkqtplotter_simpletest_dateaxes.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 33 KiB |
BIN
screenshots/jkqtplotter_simpletest_dateaxes_small.png
Normal file
BIN
screenshots/jkqtplotter_simpletest_dateaxes_small.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 16 KiB |
BIN
screenshots/jkqtplotter_simpletest_dateaxes_timeaxis.png
Normal file
BIN
screenshots/jkqtplotter_simpletest_dateaxes_timeaxis.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 32 KiB |
171
test/jkqtplotter_simpletest_dateaxes/README.md
Normal file
171
test/jkqtplotter_simpletest_dateaxes/README.md
Normal file
@ -0,0 +1,171 @@
|
|||||||
|
[Back to JKQTPlotter main page](https://github.com/jkriege2/JKQtPlotter/)
|
||||||
|
|
||||||
|
# JKQtPlotter
|
||||||
|
|
||||||
|
## Date/Time Axes
|
||||||
|
|
||||||
|
### Date Axis
|
||||||
|
This project (see `./test/jkqtplotter_simpletest_dateaxes/`) simply creates a JKQtPlotter widget (as a new window) with the X-axis showing time or date(-time) values, formated as such.
|
||||||
|
|
||||||
|
The source code of the main application can be found in [`jkqtplotter_simpletest_dateaxes.cpp`](https://github.com/jkriege2/JKQtPlotter/blob/master/test/jkqtplotter_simpletest_dateaxes/jkqtplotter_simpletest_dateaxes.cpp).
|
||||||
|
|
||||||
|
First some data is parsed from a CSV-file (added as ressource to the example). Note that the Time/date or Date+Time data is internally stored as milliseconds since epoc (Jan 1st 1970, 00:00:00), therefore data has to be converted accordingly before beeing added to the graph.
|
||||||
|
|
||||||
|
```c++
|
||||||
|
QVector<double> date;
|
||||||
|
QVector<double> temperature, temperature_min, temperature_max;
|
||||||
|
// parse a textfile with comments on the first line and the
|
||||||
|
// semicolon separated data. The first column is a date and time
|
||||||
|
// the second to fourth columns contain a floating-point number
|
||||||
|
// with temperature average, min and max
|
||||||
|
QFile file(":/weatherdata_gelsenkirchen.csv");
|
||||||
|
file.open(QFile::ReadOnly|QFile::Text);
|
||||||
|
file.readLine(); // eat comment
|
||||||
|
while (!file.atEnd()) {
|
||||||
|
QString line=file.readLine();
|
||||||
|
QTextStream in(&line);
|
||||||
|
QStringList items=line.split(";");
|
||||||
|
// date/time values are stored as doubles representing the corresponding number of milliseconds sind epoch
|
||||||
|
date<<QDateTime::fromString(items[0], Qt::ISODate).toUTC().toMSecsSinceEpoch();
|
||||||
|
// store Heidelbergs daily temperature
|
||||||
|
temperature<<items[1].toDouble();
|
||||||
|
temperature_min<<items[2].toDouble();
|
||||||
|
temperature_max<<items[3].toDouble();
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The parsed data looks like this:
|
||||||
|
```
|
||||||
|
ISO-Date+Time;Temp_mean[degC];Temp_min[degC];Temp_max[degC]; data from http://wetter.mpg-ge.de/NOAA/NOAA-2018.txt and http://wetter.mpg-ge.de/NOAA/NOAA-2017.txt
|
||||||
|
2017-01-15T12:00; 1.2; -1.2; 3.7
|
||||||
|
2017-02-15T12:00; 5.6; 3.2; 8.1
|
||||||
|
2017-03-15T12:00; 9.6; 6.2; 13.5
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
Then two graphs are added. One of type `JKQTPfilledVerticalRangeGraph` plots the range of min+max temperature for each month:
|
||||||
|
```c++
|
||||||
|
// 3. add a plot for the data mean line (graphTemperature) and range (graphTemperatureRange)
|
||||||
|
JKQTPfilledVerticalRangeGraph* graphTemperatureRange=new JKQTPfilledVerticalRangeGraph(&plot);
|
||||||
|
|
||||||
|
// 4. copy data into datastore and immediately set the yColumn
|
||||||
|
size_t colDate=ds->addCopiedColumn(date, "date");
|
||||||
|
graphTemperatureRange->set_xColumn(colDate);
|
||||||
|
graphTemperatureRange->set_yColumn(ds->addCopiedColumn(temperature_min, "temperature_min"));
|
||||||
|
graphTemperatureRange->set_yColumn2(ds->addCopiedColumn(temperature_max, "temperature_max"));
|
||||||
|
|
||||||
|
|
||||||
|
// 5. min/max range data
|
||||||
|
// graph fill color is a lighter shade of the average graph
|
||||||
|
graphTemperatureRange->set_fillColor(graphTemperature->get_color().lighter());
|
||||||
|
// don't draw lines of the data
|
||||||
|
graphTemperatureRange->set_drawLine(false);
|
||||||
|
// plot label in key
|
||||||
|
graphTemperatureRange->set_title("Min/Max Temperature");
|
||||||
|
// add the graph to the plot, so it is actually displayed
|
||||||
|
plot.addGraph(graphTemperatureRange);
|
||||||
|
```
|
||||||
|
|
||||||
|
On top of that plot, a second plot is added, which draws the average temperatures of each month as a line:
|
||||||
|
|
||||||
|
```c++
|
||||||
|
// 3. add a plot for the data mean line (graphTemperature) and range (graphTemperatureRange)
|
||||||
|
JKQTPxyLineErrorGraph* graphTemperature=new JKQTPxyLineErrorGraph(&plot);
|
||||||
|
|
||||||
|
// 4. copy data into datastore and immediately set the yColumn
|
||||||
|
size_t colDate=ds->addCopiedColumn(date, "date");
|
||||||
|
graphTemperature->set_xColumn(colDate);
|
||||||
|
graphTemperature->set_yColumn(ds->addCopiedColumn(temperature, "temperature"));
|
||||||
|
|
||||||
|
|
||||||
|
// 5. min/max range data
|
||||||
|
// .... see above
|
||||||
|
|
||||||
|
// 6. average data
|
||||||
|
// don't use symbols
|
||||||
|
graphTemperature->set_symbol(JKQTPnoSymbol);
|
||||||
|
// set the line width
|
||||||
|
graphTemperature->set_lineWidth(1);
|
||||||
|
// draw small symbols
|
||||||
|
graphTemperature->set_symbolSize(6);
|
||||||
|
// graph title
|
||||||
|
graphTemperature->set_title("Average Temperature");
|
||||||
|
// add the graph to the plot, so it is actually displayed
|
||||||
|
plot.addGraph(graphTemperature);
|
||||||
|
```
|
||||||
|
|
||||||
|
Finally the x-axis is formatted to display dates (see [Qt-Documentation of `QDateTime::toString()`](http://doc.qt.io/qt-5/qdatetime.html#toString) for details on the formating strings):
|
||||||
|
```c++
|
||||||
|
// 7. format the plot
|
||||||
|
// set the title above the plot, use LaTeX instructions to make text bold
|
||||||
|
plot.get_plotter()->set_plotLabel("\\textbf{Weather in Gelsenkirchen, 2017-2018}");
|
||||||
|
// set x-axis date-time-axis
|
||||||
|
plot.getXAxis()->set_labelType(JKQTPCALTdatetime);
|
||||||
|
plot.getXAxis()->set_axisLabel("Date");
|
||||||
|
// set format string for date axis (e.g. Jan '18), see Documentation of QDateTime::toString()
|
||||||
|
plot.getXAxis()->set_tickDateTimeFormat("MMM ''yy");
|
||||||
|
// set y-axis temperature axis
|
||||||
|
plot.getYAxis()->set_axisLabel("Average Daily Temperature [{\\degree}C]");
|
||||||
|
```
|
||||||
|
|
||||||
|
The result looks like this:
|
||||||
|
|
||||||
|
![jkqtplotter_simpletest_symbols_and_styles](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_dateaxes.png)
|
||||||
|
|
||||||
|
|
||||||
|
### Time Axis
|
||||||
|
A second variant (see the example CPP-file) displays data with a time-axis:
|
||||||
|
|
||||||
|
![jkqtplotter_simpletest_symbols_and_styles](https://raw.githubusercontent.com/jkriege2/JKQtPlotter/master/screenshots/jkqtplotter_simpletest_dateaxes_timeaxis.png)
|
||||||
|
|
||||||
|
|
||||||
|
For that example data-pasring is a bit different, because the file only contains times and no dates:
|
||||||
|
```c++
|
||||||
|
// 2. now we create data vectors with data parsed from a CSV-file
|
||||||
|
QVector<double> time;
|
||||||
|
QVector<double> temperature;
|
||||||
|
// parse a textfile with comments on the first line and the
|
||||||
|
// semicolon separated data. The first column is a time
|
||||||
|
// the second contain a floating-point number with temperatures
|
||||||
|
QFile file(":/weatherdata_heidelberg_2018-10-14.csv");
|
||||||
|
file.open(QFile::ReadOnly|QFile::Text);
|
||||||
|
file.readLine(); // eat comment
|
||||||
|
while (!file.atEnd()) {
|
||||||
|
QString line=file.readLine();
|
||||||
|
QTextStream in(&line);
|
||||||
|
QStringList items=line.split(";");
|
||||||
|
// date/time values are stored as doubles representing the corresponding
|
||||||
|
// number of milliseconds sind epoch. Since the data is time only, we have to use an arbitrary
|
||||||
|
// date as basis
|
||||||
|
time<<QDateTime::fromString("1970-01-01T"+items[0], Qt::ISODate).toUTC().toMSecsSinceEpoch();
|
||||||
|
// store Heidelbergs daily temperature
|
||||||
|
temperature<<items[1].toDouble();
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The parsed data looks like this:
|
||||||
|
```
|
||||||
|
Time; Temperature [degC]
|
||||||
|
00:00:00; 24.2
|
||||||
|
00:10:00; 24.2
|
||||||
|
00:20:00; 24.1
|
||||||
|
00:30:00; 24.1
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
Axis formating for this example is done like this:
|
||||||
|
```c++
|
||||||
|
// 7. format the plot
|
||||||
|
// set the title above the plot, use LaTeX instructions to make text bold
|
||||||
|
plot.get_plotter()->set_plotLabel("\\textbf{Weather in Heidelberg, 14^{th} Oct 2018}");
|
||||||
|
// set x-axis date-time-axis
|
||||||
|
plot.getXAxis()->set_labelType(JKQTPCALTtime);
|
||||||
|
plot.getXAxis()->set_axisLabel("Time of Day");
|
||||||
|
// set format string for time axis with 24-hour and minute only,
|
||||||
|
// see QDateTime::toString() documentation for details on format strings
|
||||||
|
plot.getXAxis()->set_tickTimeFormat("HH:mm");
|
||||||
|
// set y-axis temperature axis
|
||||||
|
plot.getYAxis()->set_axisLabel("Temperature [{\\degree}C]");
|
||||||
|
```
|
||||||
|
|
||||||
|
[Back to JKQTPlotter main page](https://github.com/jkriege2/JKQtPlotter/)
|
@ -0,0 +1,172 @@
|
|||||||
|
#include <QApplication>
|
||||||
|
#include <QDateTime>
|
||||||
|
#include <QTime>
|
||||||
|
#include <QFile>
|
||||||
|
#include <QTextStream>
|
||||||
|
#include "jkqtplotter/jkqtplotter.h"
|
||||||
|
#include "jkqtplotter/jkqtpgeoelements.h"
|
||||||
|
#include "jkqtplottertools/jkqtptools.h"
|
||||||
|
|
||||||
|
void drawWithDateAxis(JKQtPlotter& plot) {
|
||||||
|
|
||||||
|
// 1. create a plotter window and get a pointer to the internal datastore (for convenience)
|
||||||
|
JKQTPdatastore* ds=plot.getDatastore();
|
||||||
|
|
||||||
|
// 2. now we create data vectors with data parsed from a CSV-file
|
||||||
|
QVector<double> date;
|
||||||
|
QVector<double> temperature, temperature_min, temperature_max;
|
||||||
|
// parse a textfile with comments on the first line and the
|
||||||
|
// semicolon separated data. The first column is a date and time
|
||||||
|
// the second to fourth columns contain a floating-point number
|
||||||
|
// with temperature average, min and max
|
||||||
|
QFile file(":/weatherdata_gelsenkirchen.csv");
|
||||||
|
file.open(QFile::ReadOnly|QFile::Text);
|
||||||
|
file.readLine(); // eat comment
|
||||||
|
while (!file.atEnd()) {
|
||||||
|
QString line=file.readLine();
|
||||||
|
QTextStream in(&line);
|
||||||
|
QStringList items=line.split(";");
|
||||||
|
// date/time values are stored as doubles representing the corresponding number of milliseconds sind epoch
|
||||||
|
date<<QDateTime::fromString(items[0], Qt::ISODate).toUTC().toMSecsSinceEpoch();
|
||||||
|
// store Heidelbergs daily temperature
|
||||||
|
temperature<<items[1].toDouble();
|
||||||
|
temperature_min<<items[2].toDouble();
|
||||||
|
temperature_max<<items[3].toDouble();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. add a plot for the data mean line (graphTemperature) and range (graphTemperatureRange)
|
||||||
|
JKQTPfilledVerticalRangeGraph* graphTemperatureRange=new JKQTPfilledVerticalRangeGraph(&plot);
|
||||||
|
JKQTPxyLineErrorGraph* graphTemperature=new JKQTPxyLineErrorGraph(&plot);
|
||||||
|
|
||||||
|
// 4. copy data into datastore and immediately set the yColumn
|
||||||
|
size_t colDate=ds->addCopiedColumn(date, "date");
|
||||||
|
graphTemperature->set_xColumn(colDate);
|
||||||
|
graphTemperature->set_yColumn(ds->addCopiedColumn(temperature, "temperature"));
|
||||||
|
graphTemperatureRange->set_xColumn(colDate);
|
||||||
|
graphTemperatureRange->set_yColumn(ds->addCopiedColumn(temperature_min, "temperature_min"));
|
||||||
|
graphTemperatureRange->set_yColumn2(ds->addCopiedColumn(temperature_max, "temperature_max"));
|
||||||
|
|
||||||
|
|
||||||
|
// 5. min/max range data
|
||||||
|
// graph fill color is a lighter shade of the average graph
|
||||||
|
graphTemperatureRange->set_fillColor(graphTemperature->get_color().lighter());
|
||||||
|
// don't draw lines of the data
|
||||||
|
graphTemperatureRange->set_drawLine(false);
|
||||||
|
// plot label in key
|
||||||
|
graphTemperatureRange->set_title("Min/Max Temperature");
|
||||||
|
// add the graph to the plot, so it is actually displayed
|
||||||
|
plot.addGraph(graphTemperatureRange);
|
||||||
|
|
||||||
|
// 6. average data
|
||||||
|
// don't use symbols
|
||||||
|
graphTemperature->set_symbol(JKQTPnoSymbol);
|
||||||
|
// set the line width
|
||||||
|
graphTemperature->set_lineWidth(1);
|
||||||
|
// draw small symbols
|
||||||
|
graphTemperature->set_symbolSize(6);
|
||||||
|
// graph title
|
||||||
|
graphTemperature->set_title("Average Temperature");
|
||||||
|
// add the graph to the plot, so it is actually displayed
|
||||||
|
plot.addGraph(graphTemperature);
|
||||||
|
|
||||||
|
|
||||||
|
// 7. format the plot
|
||||||
|
// set the title above the plot, use LaTeX instructions to make text bold
|
||||||
|
plot.get_plotter()->set_plotLabel("\\textbf{Weather in Gelsenkirchen, 2017-2018}");
|
||||||
|
// set x-axis date-time-axis
|
||||||
|
plot.getXAxis()->set_labelType(JKQTPCALTdatetime);
|
||||||
|
plot.getXAxis()->set_axisLabel("Date");
|
||||||
|
// set format string for date axis (e.g. Jan '18), see Documentation of QDateTime::toString()
|
||||||
|
plot.getXAxis()->set_tickDateTimeFormat("MMM ''yy");
|
||||||
|
// set y-axis temperature axis
|
||||||
|
plot.getYAxis()->set_axisLabel("Average Daily Temperature [{\\degree}C]");
|
||||||
|
|
||||||
|
// 8. autoscale the plot so the graph is contained
|
||||||
|
plot.zoomToFit();
|
||||||
|
|
||||||
|
// 9. show plotter and make it a decent size
|
||||||
|
plot.show();
|
||||||
|
plot.resize(600,400);
|
||||||
|
plot.setWindowTitle("Date Axis");
|
||||||
|
}
|
||||||
|
|
||||||
|
void drawWithTimeAxis(JKQtPlotter& plot) {
|
||||||
|
// 1. create a plotter window and get a pointer to the internal datastore (for convenience)
|
||||||
|
JKQTPdatastore* ds=plot.getDatastore();
|
||||||
|
|
||||||
|
// 2. now we create data vectors with data parsed from a CSV-file
|
||||||
|
QVector<double> time;
|
||||||
|
QVector<double> temperature;
|
||||||
|
// parse a textfile with comments on the first line and the
|
||||||
|
// semicolon separated data. The first column is a time
|
||||||
|
// the second contain a floating-point number with temperatures
|
||||||
|
QFile file(":/weatherdata_heidelberg_2018-10-14.csv");
|
||||||
|
file.open(QFile::ReadOnly|QFile::Text);
|
||||||
|
file.readLine(); // eat comment
|
||||||
|
while (!file.atEnd()) {
|
||||||
|
QString line=file.readLine();
|
||||||
|
QTextStream in(&line);
|
||||||
|
QStringList items=line.split(";");
|
||||||
|
// date/time values are stored as doubles representing the corresponding
|
||||||
|
// number of milliseconds sind epoch. Since the data is time only, we have to use an arbitrary
|
||||||
|
// date as basis
|
||||||
|
time<<QDateTime::fromString("1970-01-01T"+items[0], Qt::ISODate).toMSecsSinceEpoch();
|
||||||
|
// store Heidelbergs daily temperature
|
||||||
|
temperature<<items[1].toDouble();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. add a plot for the data mean line (graphTemperature) and range (graphTemperatureRange)
|
||||||
|
JKQTPxyLineErrorGraph* graphTemperature=new JKQTPxyLineErrorGraph(&plot);
|
||||||
|
|
||||||
|
// 4. copy data into datastore and immediately set the yColumn
|
||||||
|
size_t colDate=ds->addCopiedColumn(time, "time");
|
||||||
|
graphTemperature->set_xColumn(colDate);
|
||||||
|
graphTemperature->set_yColumn(ds->addCopiedColumn(temperature, "temperature"));
|
||||||
|
|
||||||
|
|
||||||
|
// 6. average data
|
||||||
|
// don't use symbols
|
||||||
|
graphTemperature->set_symbol(JKQTPcross);
|
||||||
|
// set the line width
|
||||||
|
graphTemperature->set_lineWidth(1);
|
||||||
|
// draw small symbols
|
||||||
|
graphTemperature->set_symbolSize(6);
|
||||||
|
// graph title
|
||||||
|
graphTemperature->set_title("Average Temperature");
|
||||||
|
// add the graph to the plot, so it is actually displayed
|
||||||
|
plot.addGraph(graphTemperature);
|
||||||
|
|
||||||
|
|
||||||
|
// 7. format the plot
|
||||||
|
// set the title above the plot, use LaTeX instructions to make text bold
|
||||||
|
plot.get_plotter()->set_plotLabel("\\textbf{Weather in Heidelberg, 14^{th} Oct 2018}");
|
||||||
|
// set x-axis date-time-axis
|
||||||
|
plot.getXAxis()->set_labelType(JKQTPCALTtime);
|
||||||
|
plot.getXAxis()->set_axisLabel("Time of Day");
|
||||||
|
// set format string for time axis with 24-hour and minute only,
|
||||||
|
// see QDateTime::toString() documentation for details on format strings
|
||||||
|
plot.getXAxis()->set_tickTimeFormat("HH:mm");
|
||||||
|
// set y-axis temperature axis
|
||||||
|
plot.getYAxis()->set_axisLabel("Temperature [{\\degree}C]");
|
||||||
|
|
||||||
|
// 8. autoscale the plot so the graph is contained
|
||||||
|
plot.zoomToFit();
|
||||||
|
|
||||||
|
// 9. show plotter and make it a decent size
|
||||||
|
plot.show();
|
||||||
|
plot.resize(600,400);
|
||||||
|
plot.setWindowTitle("Time Axis");
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
QApplication app(argc, argv);
|
||||||
|
JKQtPlotter plotDate;
|
||||||
|
drawWithDateAxis(plotDate);
|
||||||
|
plotDate.move(100,100);
|
||||||
|
JKQtPlotter plotTime;
|
||||||
|
drawWithTimeAxis(plotTime);
|
||||||
|
plotTime.move(100,550);
|
||||||
|
|
||||||
|
return app.exec();
|
||||||
|
}
|
@ -0,0 +1,20 @@
|
|||||||
|
# source code for this simple demo
|
||||||
|
SOURCES = jkqtplotter_simpletest_dateaxes.cpp
|
||||||
|
|
||||||
|
# configure Qt
|
||||||
|
CONFIG += qt
|
||||||
|
QT += core gui svg
|
||||||
|
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport
|
||||||
|
|
||||||
|
# output executable name
|
||||||
|
TARGET = jkqtplotter_simpletest_dateaxes
|
||||||
|
|
||||||
|
# include JKQtPlotter source code
|
||||||
|
include(../../lib/jkqtplotter.pri)
|
||||||
|
|
||||||
|
# here you can activate some debug options
|
||||||
|
#DEFINES += SHOW_JKQTPLOTTER_DEBUG
|
||||||
|
#DEFINES += JKQTBP_AUTOTIMER
|
||||||
|
|
||||||
|
RESOURCES += \
|
||||||
|
jkqtplotter_simpletest_dateaxes.qrc
|
@ -0,0 +1,7 @@
|
|||||||
|
<RCC>
|
||||||
|
<qresource prefix="/">
|
||||||
|
<file>weatherdata_gelsenkirchen.csv</file>
|
||||||
|
<file>weatherdata_heidelberg_2018-10-14.csv</file>
|
||||||
|
<file>weatherdata_heidelberg.csv</file>
|
||||||
|
</qresource>
|
||||||
|
</RCC>
|
@ -0,0 +1,24 @@
|
|||||||
|
Datum;Zeit;Temp_mean[degC];Temp_min[degC];Temp_max[degC]; data from http://wetter.mpg-ge.de/NOAA/NOAA-2018.txt and http://wetter.mpg-ge.de/NOAA/NOAA-2017.txt
|
||||||
|
2017-01-15T12:00; 1.2; -1.2; 3.7
|
||||||
|
2017-02-15T12:00; 5.6; 3.2; 8.1
|
||||||
|
2017-03-15T12:00; 9.6; 6.2; 13.5
|
||||||
|
2017-04-15T12:00; 8.9; 5.1; 12.9
|
||||||
|
2017-05-15T12:00; 16.0; 11.4; 20.8
|
||||||
|
2017-06-15T12:00; 19.2; 15.0; 23.5
|
||||||
|
2017-07-15T12:00; 19.1; 15.2; 23.4
|
||||||
|
2017-08-15T12:00; 18.5; 14.7; 22.5
|
||||||
|
2017-09-15T12:00; 14.4; 11.4; 18.3
|
||||||
|
2017-10-15T12:00; 13.1; 10.8; 16.0
|
||||||
|
2017-11-15T12:00; 7.5; 5.6; 9.7
|
||||||
|
2017-12-15T12:00; 4.2; 2.6; 5.9
|
||||||
|
2018-01-15T12:00; 5.7; 3.7; 7.8
|
||||||
|
2018-02-15T12:00; 0.4; -1.9; 3.2
|
||||||
|
2018-03-15T12:00; 5.0; 1.5; 8.5
|
||||||
|
2018-04-15T12:00; 14.3; 9.8; 18.9
|
||||||
|
2018-05-15T12:00; 16.7; 12.3; 21.2
|
||||||
|
2018-06-15T12:00; 18.3; 14.5; 22.7
|
||||||
|
2018-07-15T12:00; 22.2; 16.4; 27.9
|
||||||
|
2018-08-15T12:00; 20.5; 15.9; 25.6
|
||||||
|
2018-09-15T12:00; 16.2; 12.1; 20.8
|
||||||
|
2018-10-15T12:00; 13.0; 9.6; 17.0
|
||||||
|
2018-11-15T12:00; 7.2; 4.8; 10.0
|
|
289
test/jkqtplotter_simpletest_dateaxes/weatherdata_heidelberg.csv
Normal file
289
test/jkqtplotter_simpletest_dateaxes/weatherdata_heidelberg.csv
Normal file
@ -0,0 +1,289 @@
|
|||||||
|
2018-10-14T00:00:00; 24.2
|
||||||
|
2018-10-14T00:10:00; 24.2
|
||||||
|
2018-10-14T00:20:00; 24.1
|
||||||
|
2018-10-14T00:30:00; 24.1
|
||||||
|
2018-10-14T00:40:00; 24.1
|
||||||
|
2018-10-14T00:50:00; 24.0
|
||||||
|
2018-10-14T01:00:00; 24.0
|
||||||
|
2018-10-14T01:10:00; 24.0
|
||||||
|
2018-10-14T01:20:00; 24.0
|
||||||
|
2018-10-14T01:30:00; 24.0
|
||||||
|
2018-10-14T01:40:00; 23.9
|
||||||
|
2018-10-14T01:50:00; 23.9
|
||||||
|
2018-10-14T02:00:00; 23.8
|
||||||
|
2018-10-14T02:10:00; 23.8
|
||||||
|
2018-10-14T02:20:00; 23.8
|
||||||
|
2018-10-14T02:30:00; 23.8
|
||||||
|
2018-10-14T02:40:00; 23.8
|
||||||
|
2018-10-14T02:50:00; 23.7
|
||||||
|
2018-10-14T03:00:00; 23.7
|
||||||
|
2018-10-14T03:10:00; 23.7
|
||||||
|
2018-10-14T03:20:00; 23.6
|
||||||
|
2018-10-14T03:30:00; 23.6
|
||||||
|
2018-10-14T03:40:00; 23.6
|
||||||
|
2018-10-14T03:50:00; 23.6
|
||||||
|
2018-10-14T04:00:00; 23.6
|
||||||
|
2018-10-14T04:10:00; 23.6
|
||||||
|
2018-10-14T04:20:00; 23.6
|
||||||
|
2018-10-14T04:30:00; 23.6
|
||||||
|
2018-10-14T04:40:00; 23.6
|
||||||
|
2018-10-14T04:50:00; 23.5
|
||||||
|
2018-10-14T05:00:00; 23.5
|
||||||
|
2018-10-14T05:10:00; 23.5
|
||||||
|
2018-10-14T05:20:00; 23.4
|
||||||
|
2018-10-14T05:30:00; 23.4
|
||||||
|
2018-10-14T05:40:00; 23.4
|
||||||
|
2018-10-14T05:50:00; 23.4
|
||||||
|
2018-10-14T06:00:00; 23.4
|
||||||
|
2018-10-14T06:10:00; 23.4
|
||||||
|
2018-10-14T06:20:00; 23.4
|
||||||
|
2018-10-14T06:30:00; 23.4
|
||||||
|
2018-10-14T06:40:00; 23.4
|
||||||
|
2018-10-14T06:50:00; 23.4
|
||||||
|
2018-10-14T07:00:00; 23.4
|
||||||
|
2018-10-14T07:10:00; 23.4
|
||||||
|
2018-10-14T07:20:00; 23.4
|
||||||
|
2018-10-14T07:30:00; 23.4
|
||||||
|
2018-10-14T07:40:00; 23.4
|
||||||
|
2018-10-14T07:50:00; 23.4
|
||||||
|
2018-10-14T08:00:00; 23.4
|
||||||
|
2018-10-14T08:10:00; 23.3
|
||||||
|
2018-10-14T08:20:00; 23.3
|
||||||
|
2018-10-14T08:30:00; 23.2
|
||||||
|
2018-10-14T08:40:00; 23.2
|
||||||
|
2018-10-14T08:50:00; 23.2
|
||||||
|
2018-10-14T09:00:00; 23.1
|
||||||
|
2018-10-14T09:10:00; 23.1
|
||||||
|
2018-10-14T09:20:00; 23.0
|
||||||
|
2018-10-14T09:30:00; 23.0
|
||||||
|
2018-10-14T09:40:00; 23.0
|
||||||
|
2018-10-14T09:50:00; 23.1
|
||||||
|
2018-10-14T10:00:00; 23.1
|
||||||
|
2018-10-14T10:10:00; 23.2
|
||||||
|
2018-10-14T10:20:00; 23.2
|
||||||
|
2018-10-14T10:30:00; 23.3
|
||||||
|
2018-10-14T10:40:00; 23.4
|
||||||
|
2018-10-14T10:50:00; 23.5
|
||||||
|
2018-10-14T11:00:00; 23.6
|
||||||
|
2018-10-14T11:10:00; 23.8
|
||||||
|
2018-10-14T11:20:00; 24.0
|
||||||
|
2018-10-14T11:30:00; 24.3
|
||||||
|
2018-10-14T11:40:00; 24.6
|
||||||
|
2018-10-14T11:50:00; 24.9
|
||||||
|
2018-10-14T12:00:00; 25.3
|
||||||
|
2018-10-14T12:10:00; 25.6
|
||||||
|
2018-10-14T12:20:00; 25.8
|
||||||
|
2018-10-14T12:30:00; 25.8
|
||||||
|
2018-10-14T12:40:00; 25.8
|
||||||
|
2018-10-14T12:50:00; 25.8
|
||||||
|
2018-10-14T13:00:00; 25.8
|
||||||
|
2018-10-14T13:10:00; 25.9
|
||||||
|
2018-10-14T13:20:00; 26.1
|
||||||
|
2018-10-14T13:30:00; 26.3
|
||||||
|
2018-10-14T13:40:00; 26.5
|
||||||
|
2018-10-14T13:50:00; 26.6
|
||||||
|
2018-10-14T14:00:00; 26.8
|
||||||
|
2018-10-14T14:10:00; 26.9
|
||||||
|
2018-10-14T14:20:00; 27.0
|
||||||
|
2018-10-14T14:30:00; 27.2
|
||||||
|
2018-10-14T14:40:00; 27.2
|
||||||
|
2018-10-14T14:50:00; 27.4
|
||||||
|
2018-10-14T15:00:00; 27.4
|
||||||
|
2018-10-14T15:10:00; 27.4
|
||||||
|
2018-10-14T15:20:00; 27.4
|
||||||
|
2018-10-14T15:30:00; 27.5
|
||||||
|
2018-10-14T15:40:00; 27.5
|
||||||
|
2018-10-14T15:50:00; 27.5
|
||||||
|
2018-10-14T16:00:00; 27.5
|
||||||
|
2018-10-14T16:10:00; 27.4
|
||||||
|
2018-10-14T16:20:00; 27.3
|
||||||
|
2018-10-14T16:30:00; 27.0
|
||||||
|
2018-10-14T16:40:00; 26.8
|
||||||
|
2018-10-14T16:50:00; 26.0
|
||||||
|
2018-10-14T17:00:00; 25.5
|
||||||
|
2018-10-14T17:10:00; 25.3
|
||||||
|
2018-10-14T17:20:00; 25.1
|
||||||
|
2018-10-14T17:30:00; 24.9
|
||||||
|
2018-10-14T17:40:00; 24.7
|
||||||
|
2018-10-14T17:50:00; 24.5
|
||||||
|
2018-10-14T18:00:00; 24.3
|
||||||
|
2018-10-14T18:10:00; 24.2
|
||||||
|
2018-10-14T18:20:00; 24.1
|
||||||
|
2018-10-14T18:30:00; 24.0
|
||||||
|
2018-10-14T18:40:00; 23.8
|
||||||
|
2018-10-14T18:50:00; 23.8
|
||||||
|
2018-10-14T19:00:00; 23.7
|
||||||
|
2018-10-14T19:10:00; 23.6
|
||||||
|
2018-10-14T19:20:00; 23.6
|
||||||
|
2018-10-14T19:30:00; 23.4
|
||||||
|
2018-10-14T19:40:00; 23.2
|
||||||
|
2018-10-14T19:50:00; 23.2
|
||||||
|
2018-10-14T20:00:00; 23.1
|
||||||
|
2018-10-14T20:10:00; 23.0
|
||||||
|
2018-10-14T20:20:00; 23.4
|
||||||
|
2018-10-14T20:30:00; 24.0
|
||||||
|
2018-10-14T20:40:00; 24.5
|
||||||
|
2018-10-14T20:50:00; 24.8
|
||||||
|
2018-10-14T21:00:00; 25.1
|
||||||
|
2018-10-14T21:10:00; 25.4
|
||||||
|
2018-10-14T21:20:00; 25.6
|
||||||
|
2018-10-14T21:30:00; 25.6
|
||||||
|
2018-10-14T21:40:00; 25.8
|
||||||
|
2018-10-14T21:50:00; 25.9
|
||||||
|
2018-10-14T22:00:00; 25.9
|
||||||
|
2018-10-14T22:10:00; 26.0
|
||||||
|
2018-10-14T22:20:00; 26.0
|
||||||
|
2018-10-14T22:30:00; 26.0
|
||||||
|
2018-10-14T22:40:00; 26.0
|
||||||
|
2018-10-14T22:50:00; 26.0
|
||||||
|
2018-10-14T23:00:00; 26.0
|
||||||
|
2018-10-14T23:10:00; 26.0
|
||||||
|
2018-10-14T23:20:00; 26.0
|
||||||
|
2018-10-14T23:30:00; 26.0
|
||||||
|
2018-10-14T23:40:00; 25.8
|
||||||
|
2018-10-14T23:50:00; 25.6
|
||||||
|
2018-10-15T00:00:00; 25.4
|
||||||
|
2018-10-15T00:10:00; 25.2
|
||||||
|
2018-10-15T00:20:00; 25.0
|
||||||
|
2018-10-15T00:30:00; 24.9
|
||||||
|
2018-10-15T00:40:00; 24.8
|
||||||
|
2018-10-15T00:50:00; 24.6
|
||||||
|
2018-10-15T01:00:00; 24.5
|
||||||
|
2018-10-15T01:10:00; 24.4
|
||||||
|
2018-10-15T01:20:00; 24.4
|
||||||
|
2018-10-15T01:30:00; 24.3
|
||||||
|
2018-10-15T01:40:00; 24.2
|
||||||
|
2018-10-15T01:50:00; 24.2
|
||||||
|
2018-10-15T02:00:00; 24.1
|
||||||
|
2018-10-15T02:10:00; 24.0
|
||||||
|
2018-10-15T02:20:00; 24.0
|
||||||
|
2018-10-15T02:30:00; 23.9
|
||||||
|
2018-10-15T02:40:00; 23.8
|
||||||
|
2018-10-15T02:50:00; 23.8
|
||||||
|
2018-10-15T03:00:00; 23.7
|
||||||
|
2018-10-15T03:10:00; 23.7
|
||||||
|
2018-10-15T03:20:00; 23.6
|
||||||
|
2018-10-15T03:30:00; 23.6
|
||||||
|
2018-10-15T03:40:00; 23.5
|
||||||
|
2018-10-15T03:50:00; 23.5
|
||||||
|
2018-10-15T04:00:00; 23.4
|
||||||
|
2018-10-15T04:10:00; 23.4
|
||||||
|
2018-10-15T04:20:00; 23.4
|
||||||
|
2018-10-15T04:30:00; 23.3
|
||||||
|
2018-10-15T04:40:00; 23.2
|
||||||
|
2018-10-15T04:50:00; 23.2
|
||||||
|
2018-10-15T05:00:00; 23.2
|
||||||
|
2018-10-15T05:10:00; 23.1
|
||||||
|
2018-10-15T05:20:00; 23.2
|
||||||
|
2018-10-15T05:30:00; 23.1
|
||||||
|
2018-10-15T05:39:00; 23.1
|
||||||
|
2018-10-15T05:40:00; 23.1
|
||||||
|
2018-10-15T05:50:00; 23.1
|
||||||
|
2018-10-15T06:00:00; 23.1
|
||||||
|
2018-10-15T06:10:00; 23.1
|
||||||
|
2018-10-15T06:20:00; 23.0
|
||||||
|
2018-10-15T06:30:00; 23.0
|
||||||
|
2018-10-15T06:40:00; 23.0
|
||||||
|
2018-10-15T06:50:00; 23.0
|
||||||
|
2018-10-15T07:00:00; 23.0
|
||||||
|
2018-10-15T07:10:00; 23.0
|
||||||
|
2018-10-15T07:20:00; 23.0
|
||||||
|
2018-10-15T07:30:00; 22.9
|
||||||
|
2018-10-15T07:40:00; 22.9
|
||||||
|
2018-10-15T07:50:00; 22.9
|
||||||
|
2018-10-15T08:00:00; 22.9
|
||||||
|
2018-10-15T08:10:00; 22.8
|
||||||
|
2018-10-15T08:20:00; 22.8
|
||||||
|
2018-10-15T08:30:00; 22.8
|
||||||
|
2018-10-15T08:40:00; 22.8
|
||||||
|
2018-10-15T08:50:00; 22.8
|
||||||
|
2018-10-15T09:00:00; 22.8
|
||||||
|
2018-10-15T09:10:00; 22.8
|
||||||
|
2018-10-15T09:20:00; 22.8
|
||||||
|
2018-10-15T09:30:00; 22.8
|
||||||
|
2018-10-15T09:40:00; 22.8
|
||||||
|
2018-10-15T09:50:00; 22.8
|
||||||
|
2018-10-15T10:00:00; 22.6
|
||||||
|
2018-10-15T10:10:00; 22.3
|
||||||
|
2018-10-15T10:20:00; 22.1
|
||||||
|
2018-10-15T10:30:00; 21.9
|
||||||
|
2018-10-15T10:40:00; 21.8
|
||||||
|
2018-10-15T10:50:00; 22.0
|
||||||
|
2018-10-15T11:00:00; 22.4
|
||||||
|
2018-10-15T11:10:00; 22.6
|
||||||
|
2018-10-15T11:20:00; 23.0
|
||||||
|
2018-10-15T11:30:00; 23.4
|
||||||
|
2018-10-15T11:40:00; 23.8
|
||||||
|
2018-10-15T11:50:00; 24.2
|
||||||
|
2018-10-15T12:00:00; 24.4
|
||||||
|
2018-10-15T12:10:00; 24.8
|
||||||
|
2018-10-15T12:20:00; 25.0
|
||||||
|
2018-10-15T12:30:00; 25.2
|
||||||
|
2018-10-15T12:40:00; 25.3
|
||||||
|
2018-10-15T12:50:00; 25.4
|
||||||
|
2018-10-15T13:00:00; 25.5
|
||||||
|
2018-10-15T13:10:00; 25.7
|
||||||
|
2018-10-15T13:20:00; 26.0
|
||||||
|
2018-10-15T13:30:00; 26.4
|
||||||
|
2018-10-15T13:40:00; 26.6
|
||||||
|
2018-10-15T13:50:00; 26.9
|
||||||
|
2018-10-15T14:00:00; 27.1
|
||||||
|
2018-10-15T14:10:00; 27.3
|
||||||
|
2018-10-15T14:20:00; 27.3
|
||||||
|
2018-10-15T14:30:00; 27.5
|
||||||
|
2018-10-15T14:40:00; 27.6
|
||||||
|
2018-10-15T14:50:00; 27.7
|
||||||
|
2018-10-15T15:00:00; 27.8
|
||||||
|
2018-10-15T15:10:00; 27.9
|
||||||
|
2018-10-15T15:20:00; 28.0
|
||||||
|
2018-10-15T15:30:00; 28.0
|
||||||
|
2018-10-15T15:40:00; 28.0
|
||||||
|
2018-10-15T15:50:00; 28.1
|
||||||
|
2018-10-15T16:00:00; 28.2
|
||||||
|
2018-10-15T16:10:00; 28.0
|
||||||
|
2018-10-15T16:20:00; 28.0
|
||||||
|
2018-10-15T16:30:00; 27.8
|
||||||
|
2018-10-15T16:40:00; 27.6
|
||||||
|
2018-10-15T16:50:00; 27.4
|
||||||
|
2018-10-15T17:00:00; 27.2
|
||||||
|
2018-10-15T17:10:00; 27.0
|
||||||
|
2018-10-15T17:20:00; 26.8
|
||||||
|
2018-10-15T17:30:00; 26.7
|
||||||
|
2018-10-15T17:40:00; 26.6
|
||||||
|
2018-10-15T17:50:00; 26.4
|
||||||
|
2018-10-15T18:00:00; 26.3
|
||||||
|
2018-10-15T18:10:00; 26.2
|
||||||
|
2018-10-15T18:20:00; 26.1
|
||||||
|
2018-10-15T18:30:00; 26.0
|
||||||
|
2018-10-15T18:40:00; 25.9
|
||||||
|
2018-10-15T18:50:00; 25.8
|
||||||
|
2018-10-15T19:00:00; 25.7
|
||||||
|
2018-10-15T19:10:00; 25.6
|
||||||
|
2018-10-15T19:20:00; 25.5
|
||||||
|
2018-10-15T19:30:00; 25.4
|
||||||
|
2018-10-15T19:40:00; 25.4
|
||||||
|
2018-10-15T19:50:00; 25.3
|
||||||
|
2018-10-15T20:00:00; 25.2
|
||||||
|
2018-10-15T20:10:00; 25.0
|
||||||
|
2018-10-15T20:20:00; 24.9
|
||||||
|
2018-10-15T20:30:00; 24.8
|
||||||
|
2018-10-15T20:40:00; 24.7
|
||||||
|
2018-10-15T20:50:00; 24.6
|
||||||
|
2018-10-15T21:00:00; 24.5
|
||||||
|
2018-10-15T21:10:00; 24.4
|
||||||
|
2018-10-15T21:20:00; 24.4
|
||||||
|
2018-10-15T21:30:00; 24.3
|
||||||
|
2018-10-15T21:40:00; 24.3
|
||||||
|
2018-10-15T21:50:00; 24.2
|
||||||
|
2018-10-15T22:00:00; 24.2
|
||||||
|
2018-10-15T22:10:00; 24.1
|
||||||
|
2018-10-15T22:20:00; 24.1
|
||||||
|
2018-10-15T22:30:00; 24.0
|
||||||
|
2018-10-15T22:40:00; 24.0
|
||||||
|
2018-10-15T22:50:00; 24.0
|
||||||
|
2018-10-15T23:00:00; 23.9
|
||||||
|
2018-10-15T23:10:00; 23.9
|
||||||
|
2018-10-15T23:20:00; 23.8
|
||||||
|
2018-10-15T23:30:00; 23.8
|
||||||
|
2018-10-15T23:40:00; 23.8
|
||||||
|
2018-10-15T23:50:00; 23.7
|
|
@ -0,0 +1,145 @@
|
|||||||
|
Time; Temperature [degC]
|
||||||
|
00:00:00; 24.2
|
||||||
|
00:10:00; 24.2
|
||||||
|
00:20:00; 24.1
|
||||||
|
00:30:00; 24.1
|
||||||
|
00:40:00; 24.1
|
||||||
|
00:50:00; 24.0
|
||||||
|
01:00:00; 24.0
|
||||||
|
01:10:00; 24.0
|
||||||
|
01:20:00; 24.0
|
||||||
|
01:30:00; 24.0
|
||||||
|
01:40:00; 23.9
|
||||||
|
01:50:00; 23.9
|
||||||
|
02:00:00; 23.8
|
||||||
|
02:10:00; 23.8
|
||||||
|
02:20:00; 23.8
|
||||||
|
02:30:00; 23.8
|
||||||
|
02:40:00; 23.8
|
||||||
|
02:50:00; 23.7
|
||||||
|
03:00:00; 23.7
|
||||||
|
03:10:00; 23.7
|
||||||
|
03:20:00; 23.6
|
||||||
|
03:30:00; 23.6
|
||||||
|
03:40:00; 23.6
|
||||||
|
03:50:00; 23.6
|
||||||
|
04:00:00; 23.6
|
||||||
|
04:10:00; 23.6
|
||||||
|
04:20:00; 23.6
|
||||||
|
04:30:00; 23.6
|
||||||
|
04:40:00; 23.6
|
||||||
|
04:50:00; 23.5
|
||||||
|
05:00:00; 23.5
|
||||||
|
05:10:00; 23.5
|
||||||
|
05:20:00; 23.4
|
||||||
|
05:30:00; 23.4
|
||||||
|
05:40:00; 23.4
|
||||||
|
05:50:00; 23.4
|
||||||
|
06:00:00; 23.4
|
||||||
|
06:10:00; 23.4
|
||||||
|
06:20:00; 23.4
|
||||||
|
06:30:00; 23.4
|
||||||
|
06:40:00; 23.4
|
||||||
|
06:50:00; 23.4
|
||||||
|
07:00:00; 23.4
|
||||||
|
07:10:00; 23.4
|
||||||
|
07:20:00; 23.4
|
||||||
|
07:30:00; 23.4
|
||||||
|
07:40:00; 23.4
|
||||||
|
07:50:00; 23.4
|
||||||
|
08:00:00; 23.4
|
||||||
|
08:10:00; 23.3
|
||||||
|
08:20:00; 23.3
|
||||||
|
08:30:00; 23.2
|
||||||
|
08:40:00; 23.2
|
||||||
|
08:50:00; 23.2
|
||||||
|
09:00:00; 23.1
|
||||||
|
09:10:00; 23.1
|
||||||
|
09:20:00; 23.0
|
||||||
|
09:30:00; 23.0
|
||||||
|
09:40:00; 23.0
|
||||||
|
09:50:00; 23.1
|
||||||
|
10:00:00; 23.1
|
||||||
|
10:10:00; 23.2
|
||||||
|
10:20:00; 23.2
|
||||||
|
10:30:00; 23.3
|
||||||
|
10:40:00; 23.4
|
||||||
|
10:50:00; 23.5
|
||||||
|
11:00:00; 23.6
|
||||||
|
11:10:00; 23.8
|
||||||
|
11:20:00; 24.0
|
||||||
|
11:30:00; 24.3
|
||||||
|
11:40:00; 24.6
|
||||||
|
11:50:00; 24.9
|
||||||
|
12:00:00; 25.3
|
||||||
|
12:10:00; 25.6
|
||||||
|
12:20:00; 25.8
|
||||||
|
12:30:00; 25.8
|
||||||
|
12:40:00; 25.8
|
||||||
|
12:50:00; 25.8
|
||||||
|
13:00:00; 25.8
|
||||||
|
13:10:00; 25.9
|
||||||
|
13:20:00; 26.1
|
||||||
|
13:30:00; 26.3
|
||||||
|
13:40:00; 26.5
|
||||||
|
13:50:00; 26.6
|
||||||
|
14:00:00; 26.8
|
||||||
|
14:10:00; 26.9
|
||||||
|
14:20:00; 27.0
|
||||||
|
14:30:00; 27.2
|
||||||
|
14:40:00; 27.2
|
||||||
|
14:50:00; 27.4
|
||||||
|
15:00:00; 27.4
|
||||||
|
15:10:00; 27.4
|
||||||
|
15:20:00; 27.4
|
||||||
|
15:30:00; 27.5
|
||||||
|
15:40:00; 27.5
|
||||||
|
15:50:00; 27.5
|
||||||
|
16:00:00; 27.5
|
||||||
|
16:10:00; 27.4
|
||||||
|
16:20:00; 27.3
|
||||||
|
16:30:00; 27.0
|
||||||
|
16:40:00; 26.8
|
||||||
|
16:50:00; 26.0
|
||||||
|
17:00:00; 25.5
|
||||||
|
17:10:00; 25.3
|
||||||
|
17:20:00; 25.1
|
||||||
|
17:30:00; 24.9
|
||||||
|
17:40:00; 24.7
|
||||||
|
17:50:00; 24.5
|
||||||
|
18:00:00; 24.3
|
||||||
|
18:10:00; 24.2
|
||||||
|
18:20:00; 24.1
|
||||||
|
18:30:00; 24.0
|
||||||
|
18:40:00; 23.8
|
||||||
|
18:50:00; 23.8
|
||||||
|
19:00:00; 23.7
|
||||||
|
19:10:00; 23.6
|
||||||
|
19:20:00; 23.6
|
||||||
|
19:30:00; 23.4
|
||||||
|
19:40:00; 23.2
|
||||||
|
19:50:00; 23.2
|
||||||
|
20:00:00; 23.1
|
||||||
|
20:10:00; 23.0
|
||||||
|
20:20:00; 23.4
|
||||||
|
20:30:00; 24.0
|
||||||
|
20:40:00; 24.5
|
||||||
|
20:50:00; 24.8
|
||||||
|
21:00:00; 25.1
|
||||||
|
21:10:00; 25.4
|
||||||
|
21:20:00; 25.6
|
||||||
|
21:30:00; 25.6
|
||||||
|
21:40:00; 25.8
|
||||||
|
21:50:00; 25.9
|
||||||
|
22:00:00; 25.9
|
||||||
|
22:10:00; 26.0
|
||||||
|
22:20:00; 26.0
|
||||||
|
22:30:00; 26.0
|
||||||
|
22:40:00; 26.0
|
||||||
|
22:50:00; 26.0
|
||||||
|
23:00:00; 26.0
|
||||||
|
23:10:00; 26.0
|
||||||
|
23:20:00; 26.0
|
||||||
|
23:30:00; 26.0
|
||||||
|
23:40:00; 25.8
|
||||||
|
23:50:00; 25.6
|
|
Loading…
Reference in New Issue
Block a user