Skip to content

Commit

Permalink
Work on #81 and #18: Added Area type in prominence distribution chart…
Browse files Browse the repository at this point in the history
…. The user selects it from the new Settings menu Chart Type. Our default still is lines. Also added tooltip and whatsthis in distribution widget. Scatter type can be added later!
  • Loading branch information
oxy86 committed Feb 28, 2019
1 parent 3895f2f commit 244ea6e
Show file tree
Hide file tree
Showing 5 changed files with 128 additions and 31 deletions.
4 changes: 2 additions & 2 deletions src/forms/dialogsettings.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ DialogSettings::DialogSettings(QMap<QString, QString> &appSettings,


QStringList chartTypesList;
chartTypesList << "None" << "Lines" << "Bars" ;
chartTypesList << "None" << "Lines" << "Area" << "Bars" ;
ui->reportsChartTypeSelect->addItems(chartTypesList);

switch (appSettings["initReportsChartType"].toInt()) {
Expand Down Expand Up @@ -558,7 +558,7 @@ void DialogSettings::getReportsLabelsLength( const int &length) {
void DialogSettings::getReportsChartType(const int &type){
//if (!type.isEmpty() ) {
qDebug() << "DialogSettings::getReportsChartType() - type: " << type;
m_appSettings["initReportsChartType"] = type-1;
m_appSettings["initReportsChartType"] = QString::number(type-1);
emit setReportsChartType(type-1);
//}
}
Expand Down
84 changes: 76 additions & 8 deletions src/graph.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7107,6 +7107,7 @@ void Graph::prominenceDistribution(const int &index, const ChartType &type) {
break;
case ChartType::Area:
emit statusMessage(tr("Creating prominence index distribution area chart..."));
prominenceDistributionArea(discreteClasses, seriesName);
break;
case ChartType::Bars:
emit statusMessage(tr("Creating prominence index distribution bar chart..."));
Expand All @@ -7126,12 +7127,13 @@ void Graph::prominenceDistribution(const int &index, const ChartType &type) {

/**
* @brief Computes the distribution of a centrality index scores.
* The result is returned as QSplineSeries series
* The distribution data are returned as QSplineSeries series to MW
* which in turn displays them on a Spline Chart
* @param index
* @param series
*/
void Graph::prominenceDistributionSpline(const H_StrToInt &discreteClasses,
const QString &name) {
const QString &name) {

qDebug() << "Graph::prominenceDistributionSpline()";

Expand Down Expand Up @@ -7182,15 +7184,81 @@ void Graph::prominenceDistributionSpline(const H_StrToInt &discreteClasses,
axisX->setMin(min);
axisX->setMax(max);

emit signalPromininenceDistributionChartUpdate(series, axisX);
emit signalPromininenceDistributionChartUpdate(series, axisX, min, max);
}



/**
* @brief Computes the distribution of a centrality index scores.
* The result is returned as QBarSet set and QStringList strX for axisX
* They are then used in QBarSeries series
* The distribution data are returned as QAreaSeries series to MW
* which in turn displays them on a Area Chart
* @param index
* @param series
*/
void Graph::prominenceDistributionArea(const H_StrToInt &discreteClasses,
const QString &name) {

qDebug() << "Graph::prominenceDistributionArea()";

QAreaSeries *series = new QAreaSeries ();
QLineSeries *upperSeries = new QLineSeries();
QValueAxis *axisX = new QValueAxis ();

series->setName (name);

priority_queue<PairVF, vector<PairVF>, PairVFCompare> seriesPQ;

QHash<QString, int>::const_iterator i;

for (i = discreteClasses.constBegin(); i != discreteClasses.constEnd(); ++i) {

qDebug() << "discreteClasses: " << i.key() << ": " << i.value() << endl;

seriesPQ.push(PairVF(i.key().toDouble(), i.value()));

}

unsigned int initialSize = seriesPQ.size();
qreal min = 0;
qreal max = 0;
qreal value = 0;
qreal frequency = 0;

while (!seriesPQ.empty()) {

qDebug() << seriesPQ.top().value << " : "
<< seriesPQ.top().frequency << endl;

value = seriesPQ.top().value;
frequency = seriesPQ.top().frequency;

upperSeries->append( value, frequency );

if ( initialSize == seriesPQ.size() ) {
min = value;
}
if ( seriesPQ.size() == 1 ) {
max = value;
}


seriesPQ.pop();
}

axisX->setMin(min);
axisX->setMax(max);

series->setUpperSeries(upperSeries);
emit signalPromininenceDistributionChartUpdate(series, axisX, min, max);
}



/**
* @brief Computes the distribution of a centrality index scores.
* The distribution data are returned as QBarSeries series (with a QBarSet attached)
* to MW which in turn displays them on a Bar Chart
* @param index
* @param series
* @param set
Expand Down Expand Up @@ -7235,10 +7303,10 @@ void Graph::prominenceDistributionBars(const H_StrToInt &discreteClasses,
qDebug() << "value:"<< value << " : "
<< "frequency:"<< frequency << endl;

barSet->append( frequency );

axisX->append( value );

barSet->append( frequency );

if ( initialSize == seriesPQ.size() ) {
min = value;
}
Expand All @@ -7257,7 +7325,7 @@ void Graph::prominenceDistributionBars(const H_StrToInt &discreteClasses,

series->append( barSet );

emit signalPromininenceDistributionChartUpdate(series, axisX);
emit signalPromininenceDistributionChartUpdate(series, axisX, min.toDouble(), max.toDouble());
}


Expand Down
7 changes: 6 additions & 1 deletion src/graph.h
Original file line number Diff line number Diff line change
Expand Up @@ -307,7 +307,9 @@ public slots:


void signalPromininenceDistributionChartUpdate(QAbstractSeries *series,
QAbstractAxis *axisX=Q_NULLPTR);
QAbstractAxis *axisX=Q_NULLPTR,
const qreal &min=0,
const qreal &max=0);

/** Signals to GraphicsWidget */
void signalDrawNode( const QPointF &p,
Expand Down Expand Up @@ -921,6 +923,9 @@ public slots:
void prominenceDistributionBars(const H_StrToInt &discreteClasses,
const QString &name);

void prominenceDistributionArea(const H_StrToInt &discreteClasses,
const QString &name);

void prominenceDistributionSpline(const H_StrToInt &discreteClasses,
const QString &name);

Expand Down
60 changes: 41 additions & 19 deletions src/mainwindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
#include <QtCharts/QChart>
#include <QtCharts/QChartView>
#include <QSplineSeries>
#include <QAreaSeries>
#include <QBarSeries>
#include <QBarCategoryAxis>
#include <QValueAxis>
Expand Down Expand Up @@ -5456,9 +5457,10 @@ void MainWindow::initSignalSlots() {
connect ( activeGraph, &Graph::signalProgressBoxKill,
this, &MainWindow::slotProgressBoxDestroy);


connect ( activeGraph, &Graph::signalPromininenceDistributionChartUpdate,
this, &MainWindow::slotAnalyzeProminenceDistributionChartUpdate);


//
//signals and slots inside MainWindow
//
Expand Down Expand Up @@ -5575,6 +5577,7 @@ void MainWindow::initApp(){
activeGraph->setReportsRealNumberPrecision(appSettings["initReportsRealNumberPrecision"].toInt());

activeGraph->setReportsLabelLength(appSettings["initReportsLabelsLength"].toInt());
activeGraph->setReportsChartType(appSettings["initReportsChartType"].toInt());

/** Clear graphicsWidget scene and reset settings and transformations **/
graphicsWidget->clear();
Expand Down Expand Up @@ -13094,61 +13097,78 @@ void MainWindow::slotAnalyzeCentralityEccentricity(){


void MainWindow::slotAnalyzeProminenceDistributionChartUpdate(QAbstractSeries *series,
QAbstractAxis *axisX
) {
QAbstractAxis *axisX,
const qreal &min,
const qreal &max) {


qDebug() << "slotAnalyzeProminenceDistributionChartUpdate()";

if (series == Q_NULLPTR) {
chart->resetToTrivial();
chart->removeAllSeries();
return;

}

QPen sPen;
QBrush sBrush;

// Set the style of the lines and bars
switch (series->type()) {
case QAbstractSeries::SeriesTypeBar :
//;
(static_cast <QBarSeries> (series)).setBarWidth(0.5);
break;
case QAbstractSeries::SeriesTypeArea :
sPen.setColor( QColor( 0,0,0 ) );
sPen.setWidthF(1.0);
sBrush.setColor( QColor( 255,0,0) );
(static_cast <QAreaSeries> (series)).setPen( sPen );
(static_cast <QAreaSeries> (series)).setBrush(sBrush);

break;
default:
break;
}



qDebug() << "slotAnalyzeProminenceDistributionChartUpdate()";

// Clear chart from old series.
chart->removeAllSeries();
// Remove all axes
chart->removeAllAxes();

// Add series to chart
//chart->addSeries(series);
chart->addSeries(series);

// Set Chart title and remove legend
chart->setTitle(series->name() + QString(" distribution"), QFont("Times",7));

chart->toggleLegend(false);

chart->setToolTip( tr("Distribution of ") +
series->name() + ":\n"
);
// " Min value: " + axisX->min() + "\n"
// " Max value: " + axisX->max()
// );

// Set the style of the lines and bars
//series->setBrush(QBrush(QColor(0,0,0)));
//series->setPen(QPen(QColor(0,0,0)));
QString chartHelpMsg = tr("Distribution of %1 values:\n"
"Min value: %2 \n"
"Max value: %3 \n"
"Please note that, due to the small size of this widget, \n"
"if you display a distribution in Bar Chart where there are \n"
"more than 10 values, the widget will not show all bars. \n"
"In this case, use Line or Area Chart (from Settings). \n"
"In any case, the large chart in the HTML report \n"
"is better than this widget..."
)
.arg(series->name() )
.arg(min, 0,'g',appSettings["initReportsRealNumberPrecision"].toInt(0, 10))
.arg(max, 0,'g',appSettings["initReportsRealNumberPrecision"].toInt(0, 10));

chart->setToolTip( chartHelpMsg );

chart->setWhatsThis( chartHelpMsg );

// NOT USED: Attach axes to the Chart.
// chart->createDefaultAxes();

// Instead of calling createDefaultAxes()
// we use our own axes
axisX->setLabelsAngle(-80);
axisX->setLabelsAngle(-90);
axisX->setShadesVisible(false);
chart->setAxisX(axisX, series);

Expand All @@ -13157,6 +13177,8 @@ void MainWindow::slotAnalyzeProminenceDistributionChartUpdate(QAbstractSeries *s

// Apply our theme to axes:
chart->setAxesThemeDefault();


}


Expand Down
4 changes: 3 additions & 1 deletion src/mainwindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -437,7 +437,9 @@ public slots:
void slotAnalyzePrestigeProximity();

void slotAnalyzeProminenceDistributionChartUpdate(QAbstractSeries *series,
QAbstractAxis *axisX
QAbstractAxis *axisX,
const qreal &min,
const qreal &max
);

void slotAnalyzeCommunitiesCliqueCensus();
Expand Down

0 comments on commit 244ea6e

Please sign in to comment.