mirror of
https://github.com/jkriege2/JKQtPlotter.git
synced 2024-12-24 09:31:40 +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_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_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_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 |
|
||||
|
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, minorTickLabelFullNumber, "minor_tick_label_full_number", toBool());
|
||||
|
||||
JKQTPPROPERTYload(settings, group+axisPrefix, tickTimeFormat, "tick_time_format", toDouble());
|
||||
JKQTPPROPERTYload(settings, group+axisPrefix, tickDateFormat, "tick_date_format", toDouble());
|
||||
JKQTPPROPERTYload(settings, group+axisPrefix, tickDateTimeFormat, "tick_datetime_format", toDouble());
|
||||
JKQTPPROPERTYload(settings, group+axisPrefix, tickTimeFormat, "tick_time_format", toString());
|
||||
JKQTPPROPERTYload(settings, group+axisPrefix, tickDateFormat, "tick_date_format", toString());
|
||||
JKQTPPROPERTYload(settings, group+axisPrefix, tickDateTimeFormat, "tick_datetime_format", toString());
|
||||
|
||||
|
||||
JKQTPPROPERTYload(settings, group+axisPrefix, minTicks, "min_ticks", toUInt());
|
||||
@ -577,17 +577,17 @@ QString JKQTPcoordinateAxis::floattolabel(double data) {
|
||||
}; break;
|
||||
case JKQTPCALTdate: {
|
||||
QDateTime dt;
|
||||
dt.setMSecsSinceEpoch(uint(data));
|
||||
dt.setMSecsSinceEpoch(uint64_t(data));
|
||||
return dt.toString(tickDateFormat);
|
||||
}; break;
|
||||
case JKQTPCALTtime: {
|
||||
QDateTime dt;
|
||||
dt.setMSecsSinceEpoch(uint(data));
|
||||
dt.setMSecsSinceEpoch(uint64_t(data));
|
||||
return dt.toString(tickTimeFormat);
|
||||
}; break;
|
||||
case JKQTPCALTdatetime: {
|
||||
QDateTime dt;
|
||||
dt.setMSecsSinceEpoch(uint(data));
|
||||
dt.setMSecsSinceEpoch(uint64_t(data));
|
||||
return dt.toString(tickDateTimeFormat);
|
||||
}; break;
|
||||
default:
|
||||
|
@ -650,11 +650,11 @@ class LIB_EXPORT JKQTPcoordinateAxis: public QObject {
|
||||
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)
|
||||
/** \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)
|
||||
/** \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)
|
||||
|
||||
/** \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$
|
||||
\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