added y-range-plot JKQTPfilledVerticalRangeGraph and example for it + date/time axes

This commit is contained in:
jkriege2 2018-12-01 16:02:04 +01:00
parent 2724b007aa
commit 18a3a9857a
18 changed files with 1154 additions and 9 deletions

View File

@ -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 |

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

View File

@ -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:

View File

@ -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

View File

@ -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;
}

View File

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

View 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/)

View File

@ -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();
}

View File

@ -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

View File

@ -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>

View File

@ -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
1 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
2 2017-01-15T12:00; 1.2; -1.2; 3.7
3 2017-02-15T12:00; 5.6; 3.2; 8.1
4 2017-03-15T12:00; 9.6; 6.2; 13.5
5 2017-04-15T12:00; 8.9; 5.1; 12.9
6 2017-05-15T12:00; 16.0; 11.4; 20.8
7 2017-06-15T12:00; 19.2; 15.0; 23.5
8 2017-07-15T12:00; 19.1; 15.2; 23.4
9 2017-08-15T12:00; 18.5; 14.7; 22.5
10 2017-09-15T12:00; 14.4; 11.4; 18.3
11 2017-10-15T12:00; 13.1; 10.8; 16.0
12 2017-11-15T12:00; 7.5; 5.6; 9.7
13 2017-12-15T12:00; 4.2; 2.6; 5.9
14 2018-01-15T12:00; 5.7; 3.7; 7.8
15 2018-02-15T12:00; 0.4; -1.9; 3.2
16 2018-03-15T12:00; 5.0; 1.5; 8.5
17 2018-04-15T12:00; 14.3; 9.8; 18.9
18 2018-05-15T12:00; 16.7; 12.3; 21.2
19 2018-06-15T12:00; 18.3; 14.5; 22.7
20 2018-07-15T12:00; 22.2; 16.4; 27.9
21 2018-08-15T12:00; 20.5; 15.9; 25.6
22 2018-09-15T12:00; 16.2; 12.1; 20.8
23 2018-10-15T12:00; 13.0; 9.6; 17.0
24 2018-11-15T12:00; 7.2; 4.8; 10.0

View 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
1 2018-10-14T00:00:00 24.2
2 2018-10-14T00:10:00 24.2
3 2018-10-14T00:20:00 24.1
4 2018-10-14T00:30:00 24.1
5 2018-10-14T00:40:00 24.1
6 2018-10-14T00:50:00 24.0
7 2018-10-14T01:00:00 24.0
8 2018-10-14T01:10:00 24.0
9 2018-10-14T01:20:00 24.0
10 2018-10-14T01:30:00 24.0
11 2018-10-14T01:40:00 23.9
12 2018-10-14T01:50:00 23.9
13 2018-10-14T02:00:00 23.8
14 2018-10-14T02:10:00 23.8
15 2018-10-14T02:20:00 23.8
16 2018-10-14T02:30:00 23.8
17 2018-10-14T02:40:00 23.8
18 2018-10-14T02:50:00 23.7
19 2018-10-14T03:00:00 23.7
20 2018-10-14T03:10:00 23.7
21 2018-10-14T03:20:00 23.6
22 2018-10-14T03:30:00 23.6
23 2018-10-14T03:40:00 23.6
24 2018-10-14T03:50:00 23.6
25 2018-10-14T04:00:00 23.6
26 2018-10-14T04:10:00 23.6
27 2018-10-14T04:20:00 23.6
28 2018-10-14T04:30:00 23.6
29 2018-10-14T04:40:00 23.6
30 2018-10-14T04:50:00 23.5
31 2018-10-14T05:00:00 23.5
32 2018-10-14T05:10:00 23.5
33 2018-10-14T05:20:00 23.4
34 2018-10-14T05:30:00 23.4
35 2018-10-14T05:40:00 23.4
36 2018-10-14T05:50:00 23.4
37 2018-10-14T06:00:00 23.4
38 2018-10-14T06:10:00 23.4
39 2018-10-14T06:20:00 23.4
40 2018-10-14T06:30:00 23.4
41 2018-10-14T06:40:00 23.4
42 2018-10-14T06:50:00 23.4
43 2018-10-14T07:00:00 23.4
44 2018-10-14T07:10:00 23.4
45 2018-10-14T07:20:00 23.4
46 2018-10-14T07:30:00 23.4
47 2018-10-14T07:40:00 23.4
48 2018-10-14T07:50:00 23.4
49 2018-10-14T08:00:00 23.4
50 2018-10-14T08:10:00 23.3
51 2018-10-14T08:20:00 23.3
52 2018-10-14T08:30:00 23.2
53 2018-10-14T08:40:00 23.2
54 2018-10-14T08:50:00 23.2
55 2018-10-14T09:00:00 23.1
56 2018-10-14T09:10:00 23.1
57 2018-10-14T09:20:00 23.0
58 2018-10-14T09:30:00 23.0
59 2018-10-14T09:40:00 23.0
60 2018-10-14T09:50:00 23.1
61 2018-10-14T10:00:00 23.1
62 2018-10-14T10:10:00 23.2
63 2018-10-14T10:20:00 23.2
64 2018-10-14T10:30:00 23.3
65 2018-10-14T10:40:00 23.4
66 2018-10-14T10:50:00 23.5
67 2018-10-14T11:00:00 23.6
68 2018-10-14T11:10:00 23.8
69 2018-10-14T11:20:00 24.0
70 2018-10-14T11:30:00 24.3
71 2018-10-14T11:40:00 24.6
72 2018-10-14T11:50:00 24.9
73 2018-10-14T12:00:00 25.3
74 2018-10-14T12:10:00 25.6
75 2018-10-14T12:20:00 25.8
76 2018-10-14T12:30:00 25.8
77 2018-10-14T12:40:00 25.8
78 2018-10-14T12:50:00 25.8
79 2018-10-14T13:00:00 25.8
80 2018-10-14T13:10:00 25.9
81 2018-10-14T13:20:00 26.1
82 2018-10-14T13:30:00 26.3
83 2018-10-14T13:40:00 26.5
84 2018-10-14T13:50:00 26.6
85 2018-10-14T14:00:00 26.8
86 2018-10-14T14:10:00 26.9
87 2018-10-14T14:20:00 27.0
88 2018-10-14T14:30:00 27.2
89 2018-10-14T14:40:00 27.2
90 2018-10-14T14:50:00 27.4
91 2018-10-14T15:00:00 27.4
92 2018-10-14T15:10:00 27.4
93 2018-10-14T15:20:00 27.4
94 2018-10-14T15:30:00 27.5
95 2018-10-14T15:40:00 27.5
96 2018-10-14T15:50:00 27.5
97 2018-10-14T16:00:00 27.5
98 2018-10-14T16:10:00 27.4
99 2018-10-14T16:20:00 27.3
100 2018-10-14T16:30:00 27.0
101 2018-10-14T16:40:00 26.8
102 2018-10-14T16:50:00 26.0
103 2018-10-14T17:00:00 25.5
104 2018-10-14T17:10:00 25.3
105 2018-10-14T17:20:00 25.1
106 2018-10-14T17:30:00 24.9
107 2018-10-14T17:40:00 24.7
108 2018-10-14T17:50:00 24.5
109 2018-10-14T18:00:00 24.3
110 2018-10-14T18:10:00 24.2
111 2018-10-14T18:20:00 24.1
112 2018-10-14T18:30:00 24.0
113 2018-10-14T18:40:00 23.8
114 2018-10-14T18:50:00 23.8
115 2018-10-14T19:00:00 23.7
116 2018-10-14T19:10:00 23.6
117 2018-10-14T19:20:00 23.6
118 2018-10-14T19:30:00 23.4
119 2018-10-14T19:40:00 23.2
120 2018-10-14T19:50:00 23.2
121 2018-10-14T20:00:00 23.1
122 2018-10-14T20:10:00 23.0
123 2018-10-14T20:20:00 23.4
124 2018-10-14T20:30:00 24.0
125 2018-10-14T20:40:00 24.5
126 2018-10-14T20:50:00 24.8
127 2018-10-14T21:00:00 25.1
128 2018-10-14T21:10:00 25.4
129 2018-10-14T21:20:00 25.6
130 2018-10-14T21:30:00 25.6
131 2018-10-14T21:40:00 25.8
132 2018-10-14T21:50:00 25.9
133 2018-10-14T22:00:00 25.9
134 2018-10-14T22:10:00 26.0
135 2018-10-14T22:20:00 26.0
136 2018-10-14T22:30:00 26.0
137 2018-10-14T22:40:00 26.0
138 2018-10-14T22:50:00 26.0
139 2018-10-14T23:00:00 26.0
140 2018-10-14T23:10:00 26.0
141 2018-10-14T23:20:00 26.0
142 2018-10-14T23:30:00 26.0
143 2018-10-14T23:40:00 25.8
144 2018-10-14T23:50:00 25.6
145 2018-10-15T00:00:00 25.4
146 2018-10-15T00:10:00 25.2
147 2018-10-15T00:20:00 25.0
148 2018-10-15T00:30:00 24.9
149 2018-10-15T00:40:00 24.8
150 2018-10-15T00:50:00 24.6
151 2018-10-15T01:00:00 24.5
152 2018-10-15T01:10:00 24.4
153 2018-10-15T01:20:00 24.4
154 2018-10-15T01:30:00 24.3
155 2018-10-15T01:40:00 24.2
156 2018-10-15T01:50:00 24.2
157 2018-10-15T02:00:00 24.1
158 2018-10-15T02:10:00 24.0
159 2018-10-15T02:20:00 24.0
160 2018-10-15T02:30:00 23.9
161 2018-10-15T02:40:00 23.8
162 2018-10-15T02:50:00 23.8
163 2018-10-15T03:00:00 23.7
164 2018-10-15T03:10:00 23.7
165 2018-10-15T03:20:00 23.6
166 2018-10-15T03:30:00 23.6
167 2018-10-15T03:40:00 23.5
168 2018-10-15T03:50:00 23.5
169 2018-10-15T04:00:00 23.4
170 2018-10-15T04:10:00 23.4
171 2018-10-15T04:20:00 23.4
172 2018-10-15T04:30:00 23.3
173 2018-10-15T04:40:00 23.2
174 2018-10-15T04:50:00 23.2
175 2018-10-15T05:00:00 23.2
176 2018-10-15T05:10:00 23.1
177 2018-10-15T05:20:00 23.2
178 2018-10-15T05:30:00 23.1
179 2018-10-15T05:39:00 23.1
180 2018-10-15T05:40:00 23.1
181 2018-10-15T05:50:00 23.1
182 2018-10-15T06:00:00 23.1
183 2018-10-15T06:10:00 23.1
184 2018-10-15T06:20:00 23.0
185 2018-10-15T06:30:00 23.0
186 2018-10-15T06:40:00 23.0
187 2018-10-15T06:50:00 23.0
188 2018-10-15T07:00:00 23.0
189 2018-10-15T07:10:00 23.0
190 2018-10-15T07:20:00 23.0
191 2018-10-15T07:30:00 22.9
192 2018-10-15T07:40:00 22.9
193 2018-10-15T07:50:00 22.9
194 2018-10-15T08:00:00 22.9
195 2018-10-15T08:10:00 22.8
196 2018-10-15T08:20:00 22.8
197 2018-10-15T08:30:00 22.8
198 2018-10-15T08:40:00 22.8
199 2018-10-15T08:50:00 22.8
200 2018-10-15T09:00:00 22.8
201 2018-10-15T09:10:00 22.8
202 2018-10-15T09:20:00 22.8
203 2018-10-15T09:30:00 22.8
204 2018-10-15T09:40:00 22.8
205 2018-10-15T09:50:00 22.8
206 2018-10-15T10:00:00 22.6
207 2018-10-15T10:10:00 22.3
208 2018-10-15T10:20:00 22.1
209 2018-10-15T10:30:00 21.9
210 2018-10-15T10:40:00 21.8
211 2018-10-15T10:50:00 22.0
212 2018-10-15T11:00:00 22.4
213 2018-10-15T11:10:00 22.6
214 2018-10-15T11:20:00 23.0
215 2018-10-15T11:30:00 23.4
216 2018-10-15T11:40:00 23.8
217 2018-10-15T11:50:00 24.2
218 2018-10-15T12:00:00 24.4
219 2018-10-15T12:10:00 24.8
220 2018-10-15T12:20:00 25.0
221 2018-10-15T12:30:00 25.2
222 2018-10-15T12:40:00 25.3
223 2018-10-15T12:50:00 25.4
224 2018-10-15T13:00:00 25.5
225 2018-10-15T13:10:00 25.7
226 2018-10-15T13:20:00 26.0
227 2018-10-15T13:30:00 26.4
228 2018-10-15T13:40:00 26.6
229 2018-10-15T13:50:00 26.9
230 2018-10-15T14:00:00 27.1
231 2018-10-15T14:10:00 27.3
232 2018-10-15T14:20:00 27.3
233 2018-10-15T14:30:00 27.5
234 2018-10-15T14:40:00 27.6
235 2018-10-15T14:50:00 27.7
236 2018-10-15T15:00:00 27.8
237 2018-10-15T15:10:00 27.9
238 2018-10-15T15:20:00 28.0
239 2018-10-15T15:30:00 28.0
240 2018-10-15T15:40:00 28.0
241 2018-10-15T15:50:00 28.1
242 2018-10-15T16:00:00 28.2
243 2018-10-15T16:10:00 28.0
244 2018-10-15T16:20:00 28.0
245 2018-10-15T16:30:00 27.8
246 2018-10-15T16:40:00 27.6
247 2018-10-15T16:50:00 27.4
248 2018-10-15T17:00:00 27.2
249 2018-10-15T17:10:00 27.0
250 2018-10-15T17:20:00 26.8
251 2018-10-15T17:30:00 26.7
252 2018-10-15T17:40:00 26.6
253 2018-10-15T17:50:00 26.4
254 2018-10-15T18:00:00 26.3
255 2018-10-15T18:10:00 26.2
256 2018-10-15T18:20:00 26.1
257 2018-10-15T18:30:00 26.0
258 2018-10-15T18:40:00 25.9
259 2018-10-15T18:50:00 25.8
260 2018-10-15T19:00:00 25.7
261 2018-10-15T19:10:00 25.6
262 2018-10-15T19:20:00 25.5
263 2018-10-15T19:30:00 25.4
264 2018-10-15T19:40:00 25.4
265 2018-10-15T19:50:00 25.3
266 2018-10-15T20:00:00 25.2
267 2018-10-15T20:10:00 25.0
268 2018-10-15T20:20:00 24.9
269 2018-10-15T20:30:00 24.8
270 2018-10-15T20:40:00 24.7
271 2018-10-15T20:50:00 24.6
272 2018-10-15T21:00:00 24.5
273 2018-10-15T21:10:00 24.4
274 2018-10-15T21:20:00 24.4
275 2018-10-15T21:30:00 24.3
276 2018-10-15T21:40:00 24.3
277 2018-10-15T21:50:00 24.2
278 2018-10-15T22:00:00 24.2
279 2018-10-15T22:10:00 24.1
280 2018-10-15T22:20:00 24.1
281 2018-10-15T22:30:00 24.0
282 2018-10-15T22:40:00 24.0
283 2018-10-15T22:50:00 24.0
284 2018-10-15T23:00:00 23.9
285 2018-10-15T23:10:00 23.9
286 2018-10-15T23:20:00 23.8
287 2018-10-15T23:30:00 23.8
288 2018-10-15T23:40:00 23.8
289 2018-10-15T23:50:00 23.7

View File

@ -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
1 Time Temperature [degC]
2 00:00:00 24.2
3 00:10:00 24.2
4 00:20:00 24.1
5 00:30:00 24.1
6 00:40:00 24.1
7 00:50:00 24.0
8 01:00:00 24.0
9 01:10:00 24.0
10 01:20:00 24.0
11 01:30:00 24.0
12 01:40:00 23.9
13 01:50:00 23.9
14 02:00:00 23.8
15 02:10:00 23.8
16 02:20:00 23.8
17 02:30:00 23.8
18 02:40:00 23.8
19 02:50:00 23.7
20 03:00:00 23.7
21 03:10:00 23.7
22 03:20:00 23.6
23 03:30:00 23.6
24 03:40:00 23.6
25 03:50:00 23.6
26 04:00:00 23.6
27 04:10:00 23.6
28 04:20:00 23.6
29 04:30:00 23.6
30 04:40:00 23.6
31 04:50:00 23.5
32 05:00:00 23.5
33 05:10:00 23.5
34 05:20:00 23.4
35 05:30:00 23.4
36 05:40:00 23.4
37 05:50:00 23.4
38 06:00:00 23.4
39 06:10:00 23.4
40 06:20:00 23.4
41 06:30:00 23.4
42 06:40:00 23.4
43 06:50:00 23.4
44 07:00:00 23.4
45 07:10:00 23.4
46 07:20:00 23.4
47 07:30:00 23.4
48 07:40:00 23.4
49 07:50:00 23.4
50 08:00:00 23.4
51 08:10:00 23.3
52 08:20:00 23.3
53 08:30:00 23.2
54 08:40:00 23.2
55 08:50:00 23.2
56 09:00:00 23.1
57 09:10:00 23.1
58 09:20:00 23.0
59 09:30:00 23.0
60 09:40:00 23.0
61 09:50:00 23.1
62 10:00:00 23.1
63 10:10:00 23.2
64 10:20:00 23.2
65 10:30:00 23.3
66 10:40:00 23.4
67 10:50:00 23.5
68 11:00:00 23.6
69 11:10:00 23.8
70 11:20:00 24.0
71 11:30:00 24.3
72 11:40:00 24.6
73 11:50:00 24.9
74 12:00:00 25.3
75 12:10:00 25.6
76 12:20:00 25.8
77 12:30:00 25.8
78 12:40:00 25.8
79 12:50:00 25.8
80 13:00:00 25.8
81 13:10:00 25.9
82 13:20:00 26.1
83 13:30:00 26.3
84 13:40:00 26.5
85 13:50:00 26.6
86 14:00:00 26.8
87 14:10:00 26.9
88 14:20:00 27.0
89 14:30:00 27.2
90 14:40:00 27.2
91 14:50:00 27.4
92 15:00:00 27.4
93 15:10:00 27.4
94 15:20:00 27.4
95 15:30:00 27.5
96 15:40:00 27.5
97 15:50:00 27.5
98 16:00:00 27.5
99 16:10:00 27.4
100 16:20:00 27.3
101 16:30:00 27.0
102 16:40:00 26.8
103 16:50:00 26.0
104 17:00:00 25.5
105 17:10:00 25.3
106 17:20:00 25.1
107 17:30:00 24.9
108 17:40:00 24.7
109 17:50:00 24.5
110 18:00:00 24.3
111 18:10:00 24.2
112 18:20:00 24.1
113 18:30:00 24.0
114 18:40:00 23.8
115 18:50:00 23.8
116 19:00:00 23.7
117 19:10:00 23.6
118 19:20:00 23.6
119 19:30:00 23.4
120 19:40:00 23.2
121 19:50:00 23.2
122 20:00:00 23.1
123 20:10:00 23.0
124 20:20:00 23.4
125 20:30:00 24.0
126 20:40:00 24.5
127 20:50:00 24.8
128 21:00:00 25.1
129 21:10:00 25.4
130 21:20:00 25.6
131 21:30:00 25.6
132 21:40:00 25.8
133 21:50:00 25.9
134 22:00:00 25.9
135 22:10:00 26.0
136 22:20:00 26.0
137 22:30:00 26.0
138 22:40:00 26.0
139 22:50:00 26.0
140 23:00:00 26.0
141 23:10:00 26.0
142 23:20:00 26.0
143 23:30:00 26.0
144 23:40:00 25.8
145 23:50:00 25.6