// -------------------------------------------------------------------------- void voHeatMapView::setDataObjectInternal(const voDataObject& dataObject) { Q_D(voHeatMapView); vtkTable * table = vtkTable::SafeDownCast(dataObject.dataAsVTKDataObject()); if (!table) { qCritical() << "voHeatMapView - Failed to setDataObject - vtkTable data is expected !"; return; } vtkNew<vtkStringArray> verticalLabels; { // Flip vertical labels vtkSmartPointer<vtkStringArray> verticalLabelsRaw = vtkStringArray::SafeDownCast(table->GetColumn(0)); if (!verticalLabelsRaw) { qCritical() << "voHeatMapView - Failed to setDataObject - first column of vtkTable data could not be converted to string !"; return; } vtkIdType numVertLabels = verticalLabelsRaw->GetNumberOfValues(); verticalLabels->SetNumberOfValues(numVertLabels); for (vtkIdType i = 0; i < numVertLabels; i++) { verticalLabels->SetValue(i, verticalLabelsRaw->GetValue(numVertLabels-i-1)); } } vtkSmartPointer<vtkStringArray> horizontalLabels = vtkSmartPointer<vtkStringArray>::Take(voUtils::tableColumnNames(table, 1)); vtkNew<vtkDoubleArray> verticalTicks; for(double i = 0.0; i < table->GetNumberOfRows(); i++) { verticalTicks->InsertNextValue(i + 0.5); } vtkNew<vtkDoubleArray> horizontalTicks; for(double i = 0.0; i < table->GetNumberOfColumns()-1; i++) { horizontalTicks->InsertNextValue(i + 0.5); } // Generate image of the correlation table vtkSmartPointer<vtkImageData> imageData = vtkSmartPointer<vtkImageData>::New(); vtkIdType corrMatrixNumberOfCols = table->GetNumberOfColumns(); vtkIdType corrMatrixNumberOfRows = table->GetNumberOfRows(); imageData->SetExtent(0, corrMatrixNumberOfCols-2, 0, corrMatrixNumberOfRows-1, 0, 0); imageData->AllocateScalars(VTK_DOUBLE, 1); imageData->SetOrigin(0.0, 0.0, 0.0); imageData->SetSpacing(1.0, 1.0, 1.0); double *dPtr = static_cast<double *>(imageData->GetScalarPointer(0, 0, 0)); //double *dPtr = static_cast<double *>(imageData->GetScalarPointer()); for (vtkIdType i = 0; i < corrMatrixNumberOfRows; ++i) { for (vtkIdType j = 1 ; j < corrMatrixNumberOfCols; ++j) // Skip first column (header labels) { double cellValue = table->GetValue(i,j).ToDouble(); // Flip vertically for table -> image mapping dPtr[((corrMatrixNumberOfRows - i -1) * (corrMatrixNumberOfCols - 1)) + (j - 1) ] = cellValue; } } d->Chart->SetInputData( imageData ); d->Chart->GetAxis(vtkAxis::LEFT)->SetTitle(""); d->Chart->GetAxis(vtkAxis::LEFT)->SetBehavior(vtkAxis::FIXED); d->Chart->GetAxis(vtkAxis::LEFT)->SetRange(0.0, static_cast<double>(table->GetNumberOfRows())); d->Chart->GetAxis(vtkAxis::LEFT)->SetCustomTickPositions(verticalTicks.GetPointer(),verticalLabels.GetPointer()); d->Chart->GetAxis(vtkAxis::BOTTOM)->SetTitle(""); d->Chart->GetAxis(vtkAxis::BOTTOM)->SetBehavior(vtkAxis::FIXED); d->Chart->GetAxis(vtkAxis::BOTTOM)->SetRange(0.0, static_cast<double>(table->GetNumberOfColumns()-1)); d->Chart->GetAxis(vtkAxis::BOTTOM)->SetCustomTickPositions(horizontalTicks.GetPointer(),horizontalLabels.GetPointer()); d->Chart->GetAxis(vtkAxis::BOTTOM)->GetLabelProperties()->SetOrientation(270.0); d->Chart->GetAxis(vtkAxis::BOTTOM)->GetLabelProperties()->SetJustificationToRight(); // This actually justifies to the left d->Chart->GetAxis(vtkAxis::BOTTOM)->GetLabelProperties()->SetVerticalJustificationToCentered(); vtkPlotHistogram2D* plotHistogram = vtkPlotHistogram2D::SafeDownCast(d->Chart->GetPlot(0)); plotHistogram->SetTooltipPrecision(2); plotHistogram->SetTooltipNotation(vtkAxis::FIXED_NOTATION); plotHistogram->SetTooltipLabelFormat("%j / %i : %v"); double minValue = -1.0; if (dataObject.property("min_value").isValid()) { minValue = dataObject.property("min_value").toDouble(); } double maxValue = 1.0; if (dataObject.property("max_value").isValid()) { maxValue = dataObject.property("max_value").toDouble(); } double midValue = 0.0; if (minValue != -1.0 && maxValue != 1.0) { midValue = (maxValue-minValue)/2.0; } double hsvScalars[3] = {minValue, midValue, maxValue}; double hsvHues[3] = {0.3, 0.15, 0.0}; // green - red double hsvSats[3] = {1.0, 0.3, 1.0}; double hsvValues[3] = {1.0, 0.3, 1.0}; vtkNew<vtkColorTransferFunction> transferFunction; for(int i = 0; i < 3 - 1; ++i) { transferFunction->AddHSVSegment(hsvScalars[i], hsvHues[i], hsvSats[i], hsvValues[i], hsvScalars[i+1], hsvHues[i+1], hsvSats[i+1], hsvValues[i+1]); } transferFunction->Build(); d->Chart->SetTransferFunction(transferFunction.GetPointer()); d->ChartView->Render(); }