mirror of
				https://github.com/subsurface/subsurface.git
				synced 2025-02-19 22:16:15 +00:00 
			
		
		
		
	statistics: convert HistogramMarkers to QSGNodes
This is in analogy to the quartile markers. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
This commit is contained in:
		
							parent
							
								
									790d2b2ddb
								
							
						
					
					
						commit
						218c844ad4
					
				
					 6 changed files with 65 additions and 46 deletions
				
			
		| 
						 | 
				
			
			@ -133,6 +133,7 @@ SOURCES += subsurface-mobile-main.cpp \
 | 
			
		|||
	stats/boxseries.cpp \
 | 
			
		||||
	stats/chartitem.cpp \
 | 
			
		||||
	stats/chartlistmodel.cpp \
 | 
			
		||||
	stats/histogrammarker.cpp \
 | 
			
		||||
	stats/informationbox.cpp \
 | 
			
		||||
	stats/legend.cpp \
 | 
			
		||||
	stats/pieseries.cpp \
 | 
			
		||||
| 
						 | 
				
			
			@ -283,6 +284,7 @@ HEADERS += \
 | 
			
		|||
	stats/boxseries.h \
 | 
			
		||||
	stats/chartitem.h \
 | 
			
		||||
	stats/chartlistmodel.h \
 | 
			
		||||
	stats/histogrammarker.h \
 | 
			
		||||
	stats/informationbox.h \
 | 
			
		||||
	stats/legend.h \
 | 
			
		||||
	stats/pieseries.h \
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,6 +13,9 @@ set(SUBSURFACE_STATS_SRCS
 | 
			
		|||
	chartitem.cpp
 | 
			
		||||
	chartlistmodel.h
 | 
			
		||||
	chartlistmodel.cpp
 | 
			
		||||
	histogrammarker.h
 | 
			
		||||
	histogrammarker.cpp
 | 
			
		||||
	chartlistmodel.cpp
 | 
			
		||||
	informationbox.h
 | 
			
		||||
	informationbox.cpp
 | 
			
		||||
	legend.h
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										29
									
								
								stats/histogrammarker.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								stats/histogrammarker.cpp
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,29 @@
 | 
			
		|||
// SPDX-License-Identifier: GPL-2.0
 | 
			
		||||
#include "histogrammarker.h"
 | 
			
		||||
#include "statsaxis.h"
 | 
			
		||||
#include "zvalues.h"
 | 
			
		||||
 | 
			
		||||
static const double histogramMarkerWidth = 2.0;
 | 
			
		||||
 | 
			
		||||
HistogramMarker::HistogramMarker(StatsView &view, double val, bool horizontal,
 | 
			
		||||
				 QColor color, StatsAxis *xAxis, StatsAxis *yAxis) :
 | 
			
		||||
	ChartLineItem(view, ChartZValue::ChartFeatures, color, histogramMarkerWidth),
 | 
			
		||||
	xAxis(xAxis), yAxis(yAxis),
 | 
			
		||||
	val(val), horizontal(horizontal)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void HistogramMarker::updatePosition()
 | 
			
		||||
{
 | 
			
		||||
	if (!xAxis || !yAxis)
 | 
			
		||||
		return;
 | 
			
		||||
	if (horizontal) {
 | 
			
		||||
		double y = yAxis->toScreen(val);
 | 
			
		||||
		auto [x1, x2] = xAxis->minMaxScreen();
 | 
			
		||||
		setLine(QPointF(x1, y), QPointF(x2, y));
 | 
			
		||||
	} else {
 | 
			
		||||
		double x = xAxis->toScreen(val);
 | 
			
		||||
		auto [y1, y2] = yAxis->minMaxScreen();
 | 
			
		||||
		setLine(QPointF(x, y1), QPointF(x, y2));
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										21
									
								
								stats/histogrammarker.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								stats/histogrammarker.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,21 @@
 | 
			
		|||
// A line to show median an mean in histograms
 | 
			
		||||
#ifndef HISTOGRAM_MARKER_H
 | 
			
		||||
#define HISTOGRAM_MARKER_H
 | 
			
		||||
 | 
			
		||||
#include "chartitem.h"
 | 
			
		||||
 | 
			
		||||
class StatsAxis;
 | 
			
		||||
class StatsView;
 | 
			
		||||
 | 
			
		||||
// A line marking median or mean in histograms
 | 
			
		||||
class HistogramMarker : public ChartLineItem {
 | 
			
		||||
public:
 | 
			
		||||
	HistogramMarker(StatsView &view, double val, bool horizontal, QColor color, StatsAxis *xAxis, StatsAxis *yAxis);
 | 
			
		||||
	void updatePosition();
 | 
			
		||||
private:
 | 
			
		||||
	StatsAxis *xAxis, *yAxis;
 | 
			
		||||
	double val;
 | 
			
		||||
	bool horizontal;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
| 
						 | 
				
			
			@ -2,6 +2,7 @@
 | 
			
		|||
#include "statsview.h"
 | 
			
		||||
#include "barseries.h"
 | 
			
		||||
#include "boxseries.h"
 | 
			
		||||
#include "histogrammarker.h"
 | 
			
		||||
#include "legend.h"
 | 
			
		||||
#include "pieseries.h"
 | 
			
		||||
#include "quartilemarker.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -214,8 +215,8 @@ void StatsView::plotAreaChanged(const QSizeF &s)
 | 
			
		|||
		marker->updatePosition();
 | 
			
		||||
	for (RegressionLine &line: regressionLines)
 | 
			
		||||
		line.updatePosition();
 | 
			
		||||
	for (HistogramMarker &marker: histogramMarkers)
 | 
			
		||||
		marker.updatePosition();
 | 
			
		||||
	for (auto &marker: histogramMarkers)
 | 
			
		||||
		marker->updatePosition();
 | 
			
		||||
	if (legend)
 | 
			
		||||
		legend->resize();
 | 
			
		||||
	updateTitlePos();
 | 
			
		||||
| 
						 | 
				
			
			@ -849,33 +850,9 @@ void StatsView::RegressionLine::updatePosition()
 | 
			
		|||
	central->setPolygon(line.intersected(box));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
StatsView::HistogramMarker::HistogramMarker(double val, bool horizontal, QPen pen, QGraphicsScene *scene, StatsAxis *xAxis, StatsAxis *yAxis) :
 | 
			
		||||
	item(createItemPtr<QGraphicsLineItem>(scene)),
 | 
			
		||||
	xAxis(xAxis), yAxis(yAxis),
 | 
			
		||||
	val(val), horizontal(horizontal)
 | 
			
		||||
void StatsView::addHistogramMarker(double pos, QColor color, bool isHorizontal, StatsAxis *xAxis, StatsAxis *yAxis)
 | 
			
		||||
{
 | 
			
		||||
	item->setZValue(ZValues::chartFeatures);
 | 
			
		||||
	item->setPen(pen);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void StatsView::HistogramMarker::updatePosition()
 | 
			
		||||
{
 | 
			
		||||
	if (!xAxis || !yAxis)
 | 
			
		||||
		return;
 | 
			
		||||
	if (horizontal) {
 | 
			
		||||
		double y = yAxis->toScreen(val);
 | 
			
		||||
		auto [x1, x2] = xAxis->minMaxScreen();
 | 
			
		||||
		item->setLine(x1, y, x2, y);
 | 
			
		||||
	} else {
 | 
			
		||||
		double x = xAxis->toScreen(val);
 | 
			
		||||
		auto [y1, y2] = yAxis->minMaxScreen();
 | 
			
		||||
		item->setLine(x, y1, x, y2);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void StatsView::addHistogramMarker(double pos, const QPen &pen, bool isHorizontal, StatsAxis *xAxis, StatsAxis *yAxis)
 | 
			
		||||
{
 | 
			
		||||
	histogramMarkers.emplace_back(pos, isHorizontal, pen, &scene, xAxis, yAxis);
 | 
			
		||||
	histogramMarkers.push_back(createChartItem<HistogramMarker>(pos, isHorizontal, color, xAxis, yAxis));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void StatsView::addLinearRegression(const struct regression_data reg, StatsAxis *xAxis, StatsAxis *yAxis)
 | 
			
		||||
| 
						 | 
				
			
			@ -959,17 +936,13 @@ void StatsView::plotHistogramCountChart(const std::vector<dive *> &dives,
 | 
			
		|||
	if (categoryVariable->type() == StatsVariable::Type::Numeric) {
 | 
			
		||||
		if (showMean) {
 | 
			
		||||
			double mean = categoryVariable->mean(dives);
 | 
			
		||||
			QPen meanPen(Qt::green);
 | 
			
		||||
			meanPen.setWidth(2);
 | 
			
		||||
			if (!std::isnan(mean))
 | 
			
		||||
				addHistogramMarker(mean, meanPen, isHorizontal, xAxis, yAxis);
 | 
			
		||||
				addHistogramMarker(mean, Qt::green, isHorizontal, xAxis, yAxis);
 | 
			
		||||
		}
 | 
			
		||||
		if (showMedian) {
 | 
			
		||||
			double median = categoryVariable->quartiles(dives).q2;
 | 
			
		||||
			QPen medianPen(Qt::red);
 | 
			
		||||
			medianPen.setWidth(2);
 | 
			
		||||
			if (!std::isnan(median))
 | 
			
		||||
				addHistogramMarker(median, medianPen, isHorizontal, xAxis, yAxis);
 | 
			
		||||
				addHistogramMarker(median, Qt::red, isHorizontal, xAxis, yAxis);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -24,6 +24,7 @@ class CategoryAxis;
 | 
			
		|||
class ChartItem;
 | 
			
		||||
class CountAxis;
 | 
			
		||||
class HistogramAxis;
 | 
			
		||||
class HistogramMarker;
 | 
			
		||||
class QuartileMarker;
 | 
			
		||||
class StatsAxis;
 | 
			
		||||
class StatsGrid;
 | 
			
		||||
| 
						 | 
				
			
			@ -136,18 +137,8 @@ private:
 | 
			
		|||
		RegressionLine(const struct regression_data reg, QBrush brush, QGraphicsScene *scene, StatsAxis *xAxis, StatsAxis *yAxis);
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	// A line marking median or mean in histograms
 | 
			
		||||
	struct HistogramMarker {
 | 
			
		||||
		std::unique_ptr<QGraphicsLineItem> item;
 | 
			
		||||
		StatsAxis *xAxis, *yAxis;
 | 
			
		||||
		double val;
 | 
			
		||||
		bool horizontal;
 | 
			
		||||
		void updatePosition();
 | 
			
		||||
		HistogramMarker(double val, bool horizontal, QPen pen, QGraphicsScene *scene, StatsAxis *xAxis, StatsAxis *yAxis);
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	void addLinearRegression(const struct regression_data reg, StatsAxis *xAxis, StatsAxis *yAxis);
 | 
			
		||||
	void addHistogramMarker(double pos, const QPen &pen, bool isHorizontal, StatsAxis *xAxis, StatsAxis *yAxis);
 | 
			
		||||
	void addHistogramMarker(double pos, QColor color, bool isHorizontal, StatsAxis *xAxis, StatsAxis *yAxis);
 | 
			
		||||
 | 
			
		||||
	StatsState state;
 | 
			
		||||
	QFont titleFont;
 | 
			
		||||
| 
						 | 
				
			
			@ -157,7 +148,7 @@ private:
 | 
			
		|||
	std::unique_ptr<Legend> legend;
 | 
			
		||||
	std::vector<std::unique_ptr<QuartileMarker>> quartileMarkers;
 | 
			
		||||
	std::vector<RegressionLine> regressionLines;
 | 
			
		||||
	std::vector<HistogramMarker> histogramMarkers;
 | 
			
		||||
	std::vector<std::unique_ptr<HistogramMarker>> histogramMarkers;
 | 
			
		||||
	std::unique_ptr<QGraphicsSimpleTextItem> title;
 | 
			
		||||
	StatsSeries *highlightedSeries;
 | 
			
		||||
	StatsAxis *xAxis, *yAxis;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue