From $ROOTSYS/tutorials/gl/parallelcoordtrans.C

// Script illustrating the use of transparency with ||-Coord.
// It displays the same data set twice. The first time without transparency and
// the second time with transparency. On the second plot, several clusters
// appear.

//Authors: by Timur Pocheptsov, based on macro by Olivier Couet.


//All these includes are (only) to make the macro
//ACLiCable.
#include <cassert>

#include "TParallelCoordVar.h"
#include "TParallelCoord.h"
#include "TNtuple.h"
#include "TCanvas.h"
#include "TRandom.h"
#include "TColor.h"
#include "TStyle.h"
#include "TError.h"
#include "TList.h"
#include "TROOT.h"

namespace ROOT {
namespace GLTutorials {

Double_t r1, r2, r3, r4, r5, r6, r7, r8, r9;
TRandom r;

//______________________________________________________________________
void generate_random(Int_t i)
{
   const Double_t dr = 3.5;

   r.Rannor(r1, r4);
   r.Rannor(r7, r9);

   r2 = (2 * dr * r.Rndm(i)) - dr;
   r3 = (2 * dr * r.Rndm(i)) - dr;
   r5 = (2 * dr * r.Rndm(i)) - dr;
   r6 = (2 * dr * r.Rndm(i)) - dr;
   r8 = (2 * dr * r.Rndm(i)) - dr;
}

}//GLTutorials
}//ROOT

void parallelcoordtrans()
{
   //This macro shows how to use parallel coords and semi-transparent lines
   //(the system color is updated with alpha == 0.01 (1% opaque).

   using namespace ROOT::GLTutorials;

   Double_t s1x = 0., s1y = 0., s1z = 0.;
   Double_t s2x = 0., s2y = 0., s2z = 0.;
   Double_t s3x = 0., s3y = 0., s3z = 0.;

   gStyle->SetCanvasPreferGL(kTRUE);
   TCanvas *c1 = new TCanvas("parallel coors", "parallel coords", 0, 0, 900, 1000);

   TNtuple * const nt = new TNtuple("nt", "Demo ntuple", "x:y:z:u:v:w:a:b:c");

   for (Int_t i = 0; i < 1500; ++i) {
      r.Sphere(s1x, s1y, s1z, 0.1);
      r.Sphere(s2x, s2y, s2z, 0.2);
      r.Sphere(s3x, s3y, s3z, 0.05);

      generate_random(i);
      nt->Fill(r1, r2, r3, r4, r5, r6, r7, r8, r9);

      generate_random(i);
      nt->Fill(s1x, s1y, s1z, s2x, s2y, s2z, r7, r8, r9);

      generate_random(i);
      nt->Fill(r1, r2, r3, r4, r5, r6, r7, s3y, r9);

      generate_random(i);
      nt->Fill(s2x - 1, s2y - 1, s2z, s1x + .5, s1y + .5, s1z + .5, r7, r8, r9);

      generate_random(i);
      nt->Fill(r1, r2, r3, r4, r5, r6, r7, r8, r9);

      generate_random(i);
      nt->Fill(s1x + 1, s1y + 1, s1z + 1, s3x - 2, s3y - 2, s3z - 2, r7, r8, r9);

      generate_random(i);
      nt->Fill(r1, r2, r3, r4, r5, r6, s3x, r8, s3z);
   }

   c1->Divide(1, 2);
   c1->cd(1);

   // ||-Coord plot without transparency
   nt->Draw("x:y:z:u:v:w:a:b:c", "", "para");
   TParallelCoord * const para1 = (TParallelCoord*)gPad->GetListOfPrimitives()->FindObject("ParaCoord");
   assert(para1 != 0 && "parallelcoordtrans, 'ParaCoord' is null");

   para1->SetLineColor(25);
   TParallelCoordVar *pcv = (TParallelCoordVar*)para1->GetVarList()->FindObject("x");
   pcv->SetHistogramHeight(0.);

   pcv = (TParallelCoordVar*)para1->GetVarList()->FindObject("y");
   pcv->SetHistogramHeight(0.);

   pcv = (TParallelCoordVar*)para1->GetVarList()->FindObject("z");
   pcv->SetHistogramHeight(0.);

   pcv = (TParallelCoordVar*)para1->GetVarList()->FindObject("a");
   pcv->SetHistogramHeight(0.);

   pcv = (TParallelCoordVar*)para1->GetVarList()->FindObject("b");
   pcv->SetHistogramHeight(0.);

   pcv = (TParallelCoordVar*)para1->GetVarList()->FindObject("c");
   pcv->SetHistogramHeight(0.);

   pcv = (TParallelCoordVar*)para1->GetVarList()->FindObject("u");
   pcv->SetHistogramHeight(0.);

   pcv = (TParallelCoordVar*)para1->GetVarList()->FindObject("v");
   pcv->SetHistogramHeight(0.);

   pcv = (TParallelCoordVar*)para1->GetVarList()->FindObject("w");
   pcv->SetHistogramHeight(0.);

   // ||-Coord plot with transparency
   // We modify a 'system' color! You'll probably
   // have to restart ROOT or reset this color later.
   TColor * const col26 = gROOT->GetColor(26);
   assert(col26 != 0 && "parallelcoordtrans, color with index 26 not found");

   col26->SetAlpha(0.01);

   c1->cd(2);
   nt->Draw("x:y:z:u:v:w:a:b:c","","para");
   TParallelCoord * const para2 = (TParallelCoord*)gPad->GetListOfPrimitives()->FindObject("ParaCoord");
   assert(para2 != 0 && "parallelcoordtrans, 'ParaCoord' is null");

   para2->SetLineColor(26);

   pcv = (TParallelCoordVar*)para2->GetVarList()->FindObject("x");
   pcv->SetHistogramHeight(0.);

   pcv = (TParallelCoordVar*)para2->GetVarList()->FindObject("y");
   pcv->SetHistogramHeight(0.);

   pcv = (TParallelCoordVar*)para2->GetVarList()->FindObject("z");
   pcv->SetHistogramHeight(0.);

   pcv = (TParallelCoordVar*)para2->GetVarList()->FindObject("a");
   pcv->SetHistogramHeight(0.);

   pcv = (TParallelCoordVar*)para2->GetVarList()->FindObject("b");
   pcv->SetHistogramHeight(0.);

   pcv = (TParallelCoordVar*)para2->GetVarList()->FindObject("c");
   pcv->SetHistogramHeight(0.);

   pcv = (TParallelCoordVar*)para2->GetVarList()->FindObject("u");
   pcv->SetHistogramHeight(0.);

   pcv = (TParallelCoordVar*)para2->GetVarList()->FindObject("v");
   pcv->SetHistogramHeight(0.);

   pcv = (TParallelCoordVar*)para2->GetVarList()->FindObject("w");
   pcv->SetHistogramHeight(0.);
}
 parallelcoordtrans.C:1
 parallelcoordtrans.C:2
 parallelcoordtrans.C:3
 parallelcoordtrans.C:4
 parallelcoordtrans.C:5
 parallelcoordtrans.C:6
 parallelcoordtrans.C:7
 parallelcoordtrans.C:8
 parallelcoordtrans.C:9
 parallelcoordtrans.C:10
 parallelcoordtrans.C:11
 parallelcoordtrans.C:12
 parallelcoordtrans.C:13
 parallelcoordtrans.C:14
 parallelcoordtrans.C:15
 parallelcoordtrans.C:16
 parallelcoordtrans.C:17
 parallelcoordtrans.C:18
 parallelcoordtrans.C:19
 parallelcoordtrans.C:20
 parallelcoordtrans.C:21
 parallelcoordtrans.C:22
 parallelcoordtrans.C:23
 parallelcoordtrans.C:24
 parallelcoordtrans.C:25
 parallelcoordtrans.C:26
 parallelcoordtrans.C:27
 parallelcoordtrans.C:28
 parallelcoordtrans.C:29
 parallelcoordtrans.C:30
 parallelcoordtrans.C:31
 parallelcoordtrans.C:32
 parallelcoordtrans.C:33
 parallelcoordtrans.C:34
 parallelcoordtrans.C:35
 parallelcoordtrans.C:36
 parallelcoordtrans.C:37
 parallelcoordtrans.C:38
 parallelcoordtrans.C:39
 parallelcoordtrans.C:40
 parallelcoordtrans.C:41
 parallelcoordtrans.C:42
 parallelcoordtrans.C:43
 parallelcoordtrans.C:44
 parallelcoordtrans.C:45
 parallelcoordtrans.C:46
 parallelcoordtrans.C:47
 parallelcoordtrans.C:48
 parallelcoordtrans.C:49
 parallelcoordtrans.C:50
 parallelcoordtrans.C:51
 parallelcoordtrans.C:52
 parallelcoordtrans.C:53
 parallelcoordtrans.C:54
 parallelcoordtrans.C:55
 parallelcoordtrans.C:56
 parallelcoordtrans.C:57
 parallelcoordtrans.C:58
 parallelcoordtrans.C:59
 parallelcoordtrans.C:60
 parallelcoordtrans.C:61
 parallelcoordtrans.C:62
 parallelcoordtrans.C:63
 parallelcoordtrans.C:64
 parallelcoordtrans.C:65
 parallelcoordtrans.C:66
 parallelcoordtrans.C:67
 parallelcoordtrans.C:68
 parallelcoordtrans.C:69
 parallelcoordtrans.C:70
 parallelcoordtrans.C:71
 parallelcoordtrans.C:72
 parallelcoordtrans.C:73
 parallelcoordtrans.C:74
 parallelcoordtrans.C:75
 parallelcoordtrans.C:76
 parallelcoordtrans.C:77
 parallelcoordtrans.C:78
 parallelcoordtrans.C:79
 parallelcoordtrans.C:80
 parallelcoordtrans.C:81
 parallelcoordtrans.C:82
 parallelcoordtrans.C:83
 parallelcoordtrans.C:84
 parallelcoordtrans.C:85
 parallelcoordtrans.C:86
 parallelcoordtrans.C:87
 parallelcoordtrans.C:88
 parallelcoordtrans.C:89
 parallelcoordtrans.C:90
 parallelcoordtrans.C:91
 parallelcoordtrans.C:92
 parallelcoordtrans.C:93
 parallelcoordtrans.C:94
 parallelcoordtrans.C:95
 parallelcoordtrans.C:96
 parallelcoordtrans.C:97
 parallelcoordtrans.C:98
 parallelcoordtrans.C:99
 parallelcoordtrans.C:100
 parallelcoordtrans.C:101
 parallelcoordtrans.C:102
 parallelcoordtrans.C:103
 parallelcoordtrans.C:104
 parallelcoordtrans.C:105
 parallelcoordtrans.C:106
 parallelcoordtrans.C:107
 parallelcoordtrans.C:108
 parallelcoordtrans.C:109
 parallelcoordtrans.C:110
 parallelcoordtrans.C:111
 parallelcoordtrans.C:112
 parallelcoordtrans.C:113
 parallelcoordtrans.C:114
 parallelcoordtrans.C:115
 parallelcoordtrans.C:116
 parallelcoordtrans.C:117
 parallelcoordtrans.C:118
 parallelcoordtrans.C:119
 parallelcoordtrans.C:120
 parallelcoordtrans.C:121
 parallelcoordtrans.C:122
 parallelcoordtrans.C:123
 parallelcoordtrans.C:124
 parallelcoordtrans.C:125
 parallelcoordtrans.C:126
 parallelcoordtrans.C:127
 parallelcoordtrans.C:128
 parallelcoordtrans.C:129
 parallelcoordtrans.C:130
 parallelcoordtrans.C:131
 parallelcoordtrans.C:132
 parallelcoordtrans.C:133
 parallelcoordtrans.C:134
 parallelcoordtrans.C:135
 parallelcoordtrans.C:136
 parallelcoordtrans.C:137
 parallelcoordtrans.C:138
 parallelcoordtrans.C:139
 parallelcoordtrans.C:140
 parallelcoordtrans.C:141
 parallelcoordtrans.C:142
 parallelcoordtrans.C:143
 parallelcoordtrans.C:144
 parallelcoordtrans.C:145
 parallelcoordtrans.C:146
 parallelcoordtrans.C:147
 parallelcoordtrans.C:148
 parallelcoordtrans.C:149
 parallelcoordtrans.C:150
 parallelcoordtrans.C:151
 parallelcoordtrans.C:152
 parallelcoordtrans.C:153
 parallelcoordtrans.C:154
 parallelcoordtrans.C:155
 parallelcoordtrans.C:156
 parallelcoordtrans.C:157
 parallelcoordtrans.C:158
 parallelcoordtrans.C:159
 parallelcoordtrans.C:160
 parallelcoordtrans.C:161
 parallelcoordtrans.C:162
 parallelcoordtrans.C:163
 parallelcoordtrans.C:164
 parallelcoordtrans.C:165
 parallelcoordtrans.C:166
 parallelcoordtrans.C:167
 parallelcoordtrans.C:168
 parallelcoordtrans.C:169