[vtkusers] vtkChartXY - need help

Amitesh Kumar amiteshagarwal at gmail.com
Tue Jun 28 15:16:58 EDT 2011


Thank you very much for your reply!  My apology for writing late but it is
only today that I finally gotten around to test my code. I have one final
question regarding vtk charts. If my x-axis labels are string or char* then
how can I display them? In my case my x-axis labels are in the form of
"x1-x2". I first tried using  xLegends (in my code) as vtkStringArray with
actual xAxis labels in there but that didn't work as my guess was that
vtkCharts API tried to sort the points in the table. When that didn't work I
tried using xLegends as vtkIntArray with indices 0 to n-1 for n bars in the
bar plot which correctly created the plot. However 0 to n-1 is clearly not
the right label in my case and I want use the values stored in xLabels
(vtkStringArray) for my x-axis labels. I tried using setindexedLabels method
as shown below but that absolutely didn't seem to have any effect on the
x-axis labels which were all int.

void vtkPlot::SetIndexedLabels(vtkStringArray<http://www.vtk.org/doc/nightly/html/classvtkStringArray.html>
 * *labels*)

My plotting part of the code is as following. Note I am using vtk nightly
5.9 for this. Do you have any idea how to solve this problem.

Thank You

Amitesh

-----------------------------------------------------------------------------------------------------------------------------------------
std::stringstream ss3 (std::stringstream::in | std::stringstream::out);
        vtkSmartPointer<vtkContextView> view =
vtkSmartPointer<vtkContextView>::New();
view->GetRenderer()->SetBackground(1.0, 1.0, 1.0);
view->GetRenderWindow()->SetSize(800, 600);
vtkSmartPointer<vtkChartXY> chart = vtkSmartPointer<vtkChartXY>::New();
view->GetScene()->AddItem(chart);

        vector<int>output = getDistribution(nPartition); //my internal
function
int numTuples = output.size();

vtkSmartPointer<vtkTable> table = vtkSmartPointer<vtkTable>::New();
vtkSmartPointer<vtkIntArray> xLegends = vtkSmartPointer<vtkIntArray>::New();
xLegends->SetName("BarNumber");
std::vector<string> Labels;
vtkSmartPointer<vtkStringArray> xLabels =
vtkSmartPointer<vtkStringArray>::New();

vtkSmartPointer<vtkIntArray>qData = vtkSmartPointer<vtkIntArray>::New();
qData->SetName(ext2);
table->AddColumn(xLegends);
table->AddColumn(qData);
table->SetNumberOfRows(numTuples);
xLabels->SetNumberOfValues(numTuples);
 if(numTuples > nPartition)
{
Labels.push_back(string("Pre"));
xLabels->SetValue(0, "Pre");
table->SetValue(0,0,0);
table->SetValue(0,1,output[nPartition]);
for(int i = 0; i <nPartition; i++)
{
float minR, maxR;
getPartitionRange(i, nPartition, minR, maxR); //my internal function
ss3.str("");
ss3<<setprecision(2)<<minR<<"-"<<setprecision(2)<<maxR;
Labels.push_back(ss3.str());
xLabels->SetValue(i+1, ss3.str().c_str());
table->SetValue(i+1,0,i+1);
table->SetValue(i+1,1,output[i]);
}
Labels.push_back(string("Post"));
xLabels->SetValue(nPartition+1, "Post");
table->SetValue(nPartition+1,0,nPartition+1);
table->SetValue(nPartition+1,1,output[nPartition+1]);
}
else
{
for(int i = 0; i <nPartition; i++)
{
float minR, maxR;
getPartitionRange(i, nPartition, minR, maxR);  //my internal function
ss3.str("");
ss3<<setprecision(2)<<minR<<"-"<<setprecision(2)<<maxR;
xLabels->SetValue(i, ss3.str().c_str());
Labels.push_back(ss3.str());
//table->SetValue(i,0,ss3.str().c_str());
table->SetValue(i,0,i);
table->SetValue(i,1,output[i]);
}
}

vtkPlot *barPlot = 0;
barPlot = chart->AddPlot(vtkChart::BAR);
barPlot->SetInput(table, 0, 1);
barPlot->SetColor(0, 0, 255, 255); //Blue

barPlot->SetIndexedLabels(xLabels); //This doesn't seem to work.
 //barPlot->GetLabels()->SetNumberOfValues(Labels.size());
//for(int i=0; i<Labels.size(); i++)
//barPlot->GetLabels()->SetValue(i, Labels[i].c_str());

chart->SetShowLegend(true);
chart->Update();
view->Update();


On Wed, Jun 22, 2011 at 9:52 AM, Eric E. Monson <emonson at cs.duke.edu> wrote:

> Hey Amitesh,
>
> You can just build the second table you mentioned and then add a plot to
> the chart which uses that second table as its input. The chart should take
> care of it just fine.
>
> I'll append a modified version of that example you quoted, which I think
> does what you're wanting. (The orange dotted line is the new data series and
> it has many fewer points and a different X range than the first two lines.)
>
> Hope this helps,
> -Eric
>
> · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·
> Eric E Monson
> Duke Visualization Technology Group
>
>
>
>
> #include <vtkRenderer.h>
> #include <vtkRenderWindowInteractor.h>
> #include <vtkRenderWindow.h>
> #include <vtkSmartPointer.h>
> #include <vtkChartXY.h>
> #include <vtkPen.h>
> #include <vtkPlot.h>
> #include <vtkTable.h>
> #include <vtkFloatArray.h>
> #include <vtkContextView.h>
> #include <vtkContextScene.h>
>
> int main(int, char *[])
> {
>   // Create a table with some points in it
>   vtkSmartPointer<vtkTable> table =
>     vtkSmartPointer<vtkTable>::New();
>
>   vtkSmartPointer<vtkFloatArray> arrX =
>     vtkSmartPointer<vtkFloatArray>::New();
>   arrX->SetName("X Axis");
>   table->AddColumn(arrX);
>
>   vtkSmartPointer<vtkFloatArray> arrC =
>     vtkSmartPointer<vtkFloatArray>::New();
>   arrC->SetName("Cosine");
>   table->AddColumn(arrC);
>
>   vtkSmartPointer<vtkFloatArray> arrS =
>     vtkSmartPointer<vtkFloatArray>::New();
>   arrS->SetName("Sine");
>   table->AddColumn(arrS);
>
>   // Fill in the table with some example values
>   int numPoints = 69;
>   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));
>   }
>
>   // Create a second table with some points in it
>   vtkSmartPointer<vtkTable> table2 =
>     vtkSmartPointer<vtkTable>::New();
>
>   vtkSmartPointer<vtkFloatArray> arrX2 =
>     vtkSmartPointer<vtkFloatArray>::New();
>   arrX2->SetName("X Axis 2");
>   table2->AddColumn(arrX2);
>
>   vtkSmartPointer<vtkFloatArray> arrC2 =
>     vtkSmartPointer<vtkFloatArray>::New();
>   arrC2->SetName("Cosine 2");
>   table2->AddColumn(arrC2);
>
>   // Fill in the second table with some example values
>   numPoints = 8;
>   inc = 10.5 / (numPoints-1);
>   table2->SetNumberOfRows(numPoints);
>   for (int i = 0; i < numPoints; ++i)
>   {
>     table2->SetValue(i, 0, i * inc + 5);
>     table2->SetValue(i, 1, cos(i * inc));
>   }
>
>   // Set up the view
>   vtkSmartPointer<vtkContextView> view =
>     vtkSmartPointer<vtkContextView>::New();
>   view->GetRenderer()->SetBackground(1.0, 1.0, 1.0);
>
>   // Add multiple line plots, setting the colors etc
>   vtkSmartPointer<vtkChartXY> chart =
>     vtkSmartPointer<vtkChartXY>::New();
>   view->GetScene()->AddItem(chart);
>   vtkPlot *line = chart->AddPlot(vtkChart::LINE);
>   line->SetInput(table, 0, 1);
>   line->SetColor(0, 255, 0, 255);
>   line->SetWidth(1.0);
>   line = chart->AddPlot(vtkChart::LINE);
>   line->SetInput(table, 0, 2);
>   line->SetColor(255, 0, 0, 255);
>   line->SetWidth(5.0);
>
>   // Add a plot using the second table
>   line = chart->AddPlot(vtkChart::LINE);
>   line->SetInput(table2, 0, 1);
>   line->SetColor(255, 128, 0, 255);
>   line->SetWidth(3.0);
>   line->GetPen()->SetLineType(vtkPen::DASH_LINE);
>
>   // Set up an interactor and start
>   vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor =
>     vtkSmartPointer<vtkRenderWindowInteractor>::New();
>   renderWindowInteractor->SetRenderWindow(view->GetRenderWindow());
>   renderWindowInteractor->Initialize();
>   renderWindowInteractor->Start();
>
>   return EXIT_SUCCESS;
> }
>
> On Jun 21, 2011, at 3:17 PM, Amitesh Kumar wrote:
>
> I have a question about vtkChartXY and wonder if anybody would be willing
> to answer it?
> Currently as in the example shown in
> http://www.vtk.org/Wiki/VTK/Examples/Cxx/Plotting/LinePlot the x-axis is
> defined as
>
> table->SetValue(i, 0, i * inc);
>
> while the datasets are defined as
>
> table->SetValue(i, 1, cos(i * inc));
> table->SetValue(i, 2, sin(i * inc));
>
> Which means that both plot 1 and plot 2 need to have exact same
> correspondence with x-axis with same number of rows and x-axis values. Lets
> say I have two sets of data, one in which x-axis starts from 1-10 and and
>  another in which the x-axis starts from 5-20 and the number of points
> (rows) on first set is different compared with that of the second set. I
> clearly would need to have two tables in the current scheme of things. How
> can this be plotted using vtkChartXY or any other methods in VTK. Is there
> any chart which would support it? Are there any examples of the same? I am
> using version 5.9  of VTK. I really need some help on this!
>
> Thank You
>
> Amitesh
>
>
>
>
> _______________________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Please keep messages on-topic and check the VTK FAQ at:
> http://www.vtk.org/Wiki/VTK_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.vtk.org/mailman/listinfo/vtkusers
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20110628/48ac41e4/attachment.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: image/png
Size: 3187 bytes
Desc: not available
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20110628/48ac41e4/attachment.png>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: TriangleMetrics.Area.jpg
Type: image/jpeg
Size: 46962 bytes
Desc: not available
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20110628/48ac41e4/attachment.jpg>


More information about the vtkusers mailing list