ChartMatrix
VTKExamples/Cxx/Plotting/ChartMatrix
Description¶
This example illustrates the use vtkChartMatrix, a container that holds a matrix of charts. The example creates a 2 x 2 matrix of plots. The matrix elements are:
(0,0): a vtkPlotPoints (0,1): a vtkPlotPoints (1,0): a vtkPlotLine (1,1): a vtkPlotBar and a vtkPlotPoints
The example also illustrates how to use vtkNamedColors to set the colors for the plots.###Code ChartMatrix.cxx
#include <vtkNew.h> #include <vtkChartMatrix.h> #include <vtkChartXY.h> #include <vtkNamedColors.h> #include <vtkRenderWindow.h> #include <vtkRenderer.h> #include <vtkPlot.h> #include <vtkPlotPoints.h> #include <vtkAxis.h> #include <vtkPen.h> #include <vtkTable.h> #include <vtkFloatArray.h> #include <vtkContextView.h> #include <vtkContextScene.h> #include <vtkRenderWindowInteractor.h> //---------------------------------------------------------------------------- int main( int, char * [] ) { vtkNew<vtkNamedColors> colors; // Set up a 2D scene, add an XY chart to it vtkNew<vtkContextView> view; view->GetRenderWindow()->SetSize(1280, 1024); vtkNew<vtkChartMatrix> matrix; view->GetScene()->AddItem(matrix); matrix->SetSize(vtkVector2i(2, 2)); matrix->SetGutter(vtkVector2f(30.0, 30.0)); // Create a table with some points in it... vtkNew<vtkTable> table; vtkNew<vtkFloatArray> arrX; arrX->SetName("X Axis"); table->AddColumn(arrX); vtkNew<vtkFloatArray> arrC; arrC->SetName("Cosine"); table->AddColumn(arrC); vtkNew<vtkFloatArray> arrS; arrS->SetName("Sine"); table->AddColumn(arrS); vtkNew<vtkFloatArray> arrS2; arrS2->SetName("Sine2"); table->AddColumn(arrS2); vtkNew<vtkFloatArray> tangent; tangent->SetName("Tangent"); table->AddColumn(tangent); int numPoints = 42; float inc = 7.5 / (numPoints-1); table->SetNumberOfRows(numPoints); for (int i = 0; i < numPoints; ++i) { table->SetValue(i, 0, i * inc); table->SetValue(i, 1, cos(i * inc)); table->SetValue(i, 2, sin(i * inc)); table->SetValue(i, 3, sin(i * inc) + 0.5); table->SetValue(i, 4, tan(i * inc)); } // Add multiple line plots, setting the colors etc // lower left plot, a point chart vtkChart *chart = matrix->GetChart(vtkVector2i(0, 0)); vtkPlot *plot = chart->AddPlot(vtkChart::POINTS); plot->SetInputData(table, 0, 1); dynamic_cast<vtkPlotPoints*>(plot)->SetMarkerStyle(vtkPlotPoints::DIAMOND); plot->GetXAxis()->GetGridPen()->SetColorF(colors->GetColor3d("warm_grey").GetData()); plot->GetYAxis()->GetGridPen()->SetColorF(colors->GetColor3d("warm_grey").GetData()); plot->SetColor( colors->GetColor3ub("sea_green").GetRed(), colors->GetColor3ub("sea_green").GetGreen(), colors->GetColor3ub("sea_green").GetBlue(), 255); // upper left plot, a point chart chart = matrix->GetChart(vtkVector2i(0, 1)); plot = chart->AddPlot(vtkChart::POINTS); plot->SetInputData(table, 0, 2); plot->GetXAxis()->GetGridPen()->SetColorF(colors->GetColor3d("warm_grey").GetData()); plot->GetYAxis()->GetGridPen()->SetColorF(colors->GetColor3d("warm_grey").GetData()); plot->SetColor( colors->GetColor3ub("rose_madder").GetRed(), colors->GetColor3ub("rose_madder").GetGreen(), colors->GetColor3ub("rose_madder").GetBlue(), 255); // chart = matrix->GetChart(vtkVector2i(1, 0)); plot = chart->AddPlot(vtkChart::LINE); plot->SetInputData(table, 0, 3); plot->GetXAxis()->GetGridPen()->SetColorF(colors->GetColor3d("warm_grey").GetData()); plot->GetYAxis()->GetGridPen()->SetColorF(colors->GetColor3d("warm_grey").GetData()); plot->SetColor( colors->GetColor3ub("dark_orange").GetRed(), colors->GetColor3ub("dark_orange").GetGreen(), colors->GetColor3ub("dark_orange").GetBlue(), 255); // upper right plot, a bar and point chart chart = matrix->GetChart(vtkVector2i(1, 1)); plot = chart->AddPlot(vtkChart::BAR); plot->SetInputData(table, 0, 4); plot->GetXAxis()->GetGridPen()->SetColorF(colors->GetColor3d("warm_grey").GetData()); plot->GetYAxis()->GetGridPen()->SetColorF(colors->GetColor3d("warm_grey").GetData()); plot->SetColor( colors->GetColor3ub("burnt_sienna").GetRed(), colors->GetColor3ub("burnt_sienna").GetGreen(), colors->GetColor3ub("burnt_sienna").GetBlue(), 255); plot = chart->AddPlot(vtkChart::POINTS); plot->SetInputData(table, 0, 1); dynamic_cast<vtkPlotPoints*>(plot)->SetMarkerStyle(vtkPlotPoints::CROSS); plot->GetXAxis()->GetGridPen()->SetColorF(colors->GetColor3d("warm_grey").GetData()); plot->GetYAxis()->GetGridPen()->SetColorF(colors->GetColor3d("warm_grey").GetData()); plot->SetColor( colors->GetColor3ub("rose_madder").GetRed(), colors->GetColor3ub("rose_madder").GetGreen(), colors->GetColor3ub("rose_madder").GetBlue(), 255); // Lower right plot, a line chart chart = matrix->GetChart(vtkVector2i(1, 0)); plot = chart->AddPlot(vtkChart::LINE); plot->SetInputData(table, 0, 3); plot->GetXAxis()->GetGridPen()->SetColorF(colors->GetColor3d("warm_grey").GetData()); plot->GetYAxis()->GetGridPen()->SetColorF(colors->GetColor3d("warm_grey").GetData()); plot->SetColor( colors->GetColor3ub("dark_orange").GetRed(), colors->GetColor3ub("dark_orange").GetGreen(), colors->GetColor3ub("dark_orange").GetBlue(), 255); plot = chart->AddPlot(vtkChart::LINE); plot->SetInputData(table, 0, 3); plot->GetXAxis()->GetGridPen()->SetColorF(colors->GetColor3d("warm_grey").GetData()); plot->GetYAxis()->GetGridPen()->SetColorF(colors->GetColor3d("warm_grey").GetData()); plot->SetColor( colors->GetColor3ub("royal_blue").GetRed(), colors->GetColor3ub("royal_blue").GetGreen(), colors->GetColor3ub("royal_blue").GetBlue(), 255); // Finally render the scene and compare the image to a reference image view->GetRenderer()->SetBackground(colors->GetColor3d("navajo_white").GetData()); view->GetRenderWindow()->Render(); view->GetInteractor()->Initialize(); view->GetInteractor()->Start(); return EXIT_SUCCESS; }
CMakeLists.txt¶
cmake_minimum_required(VERSION 3.3 FATAL_ERROR) project(ChartMatrix) find_package(VTK COMPONENTS vtkChartsCore vtkCommonColor vtkCommonCore vtkCommonDataModel vtkInteractionStyle vtkRenderingContext2D vtkRenderingContextOpenGL2 vtkRenderingCore vtkRenderingFreeType vtkRenderingGL2PSOpenGL2 vtkRenderingOpenGL2 vtkViewsContext2D QUIET) if (NOT VTK_FOUND) message("Skipping ChartMatrix: ${VTK_NOT_FOUND_MESSAGE}") return () endif() message (STATUS "VTK_VERSION: ${VTK_VERSION}") if (VTK_VERSION VERSION_LESS "8.90.0") # old system include(${VTK_USE_FILE}) add_executable(ChartMatrix MACOSX_BUNDLE ChartMatrix.cxx ) target_link_libraries(ChartMatrix PRIVATE ${VTK_LIBRARIES}) else () # include all components add_executable(ChartMatrix MACOSX_BUNDLE ChartMatrix.cxx ) target_link_libraries(ChartMatrix PRIVATE ${VTK_LIBRARIES}) # vtk_module_autoinit is needed vtk_module_autoinit( TARGETS ChartMatrix MODULES ${VTK_LIBRARIES} ) endif ()
Download and Build ChartMatrix¶
Click here to download ChartMatrix and its CMakeLists.txt file. Once the tarball ChartMatrix.tar has been downloaded and extracted,
cd ChartMatrix/build
If VTK is installed:
cmake ..
If VTK is not installed but compiled on your system, you will need to specify the path to your VTK build:
cmake -DVTK_DIR:PATH=/home/me/vtk_build ..
Build the project:
make
and run it:
./ChartMatrix
WINDOWS USERS
Be sure to add the VTK bin directory to your path. This will resolve the VTK dll's at run time.