## How to change line color in CDF or Quantile plot?

Highlighted

Community Trekker

Joined:

May 18, 2017

Hi,

I am generating cummulative plots like the example below.

However, I want to color of the lines not to be determined by col2 but by col3.

Adding Color ( :col3 ) didn't do the trick...

Thx, Phil

Oneway(
Y( :col1), X( :col2),
All Graphs( 0 ), Plot Quantile by Actual( 1 ), Line of Fit( 0 ), X Axis Proportional( 0 ), Grand Mean( 0 ), Color ( :col3 )
)

6 REPLIES

Super User

Joined:

Jun 22, 2012

I can understand how you could color data points by a different column

Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA\big class.jmp" ); dt << Oneway( Y( :weight ), X( :sex ), All Graphs( 0 ), Plot Quantile by Actual( 1 ), Line of Fit( 0(1) ), X Axis Proportional( 0 ), Grand Mean( 0 ) ); dt << color by( :age ); but I don't see how you directly do it with the line segments, since each segment is linked between 2 values that may have 2 different values of the 3rd color. Could you provide a mockup of what you are thinking? Jim Community Trekker Joined: May 18, 2017 Thx a lot for the swift response. Attached is an example with several classes M/F. Each class has its line but colors defined by sex. Icing on the cake would be color by sex and dash type by class :) Philipp Oneway( Y( :Weight ), X( :Sex_Class), All Graphs( 0 ), Plot Quantile by Actual( 1 ), Line of Fit( 0 ), X Axis Proportional( 0 ), Grand Mean( 0 ), Color ( :sex ), SendToReport( Dispatch( {"Normal Quantile Plot"}, "Oneway QuantilePlot", FrameBox, {Line Width Scale( 3 ), Transparency( 0 )} ), ) ) Super User Joined: Jun 22, 2012 You can achieve what you want by setting the Value Colors you want for the :Sex_Class column you are working with. Here is the JSL to do it, but it can easily be done interactively Names Default To Here( 1 ); dt = Open( "$SAMPLE_DATA\big class.jmp" );
// Create a new column
dt << new column("Sex_Class", character,
formula(:Sex || "_" || char(:Age))
);

// Determine how many groups in the :Sex_Class
summarize(dt,groups=by(:Sex_Class));

// Create the value colors list
colorlist={};
For(i=1,i<=n items(groups),i++,
If(substr(groups[i],1,1)=="F",
color=19,
color=21
);
Eval(
Substitute(
Expr(
insert into(colorlist, __group__  )),
expr( __group__ ), parse("{\!""||groups[i]||"\!""||"="||char(color)||"}")
)
)
);

// Set the Value Colors property for the Sex_Class column
dt:sex_CLASS<<set property("value colors",eval(colorlist));

dt << Oneway(
Y( :weight ),
X( :sex_class ),
All Graphs( 0 ),
Plot Quantile by Actual( 1 ),
Line of Fit( 0(1) ),
X Axis Proportional( 0 ),
Grand Mean( 0 )
);

Jim

Community Trekker

Joined:

May 18, 2017

Wow! I'm impressed! It works! I have modified the script to accommodate for
the case of more than 2 colors:

// Determine colors for lots
summarize(dt,groups=by(:sex_class));
colorlist={}; color=3; Sxcnt=Word(1,groups[1],"_");
For(j=1,j<=n items(groups),j++,
If(Not(Word(1,groups[j],"_")==Sxcnt),color=color+1;Sxcnt=Word(1,groups[j],"_"));
Eval(Substitute(Expr(insert into(colorlist, __group__ )), expr( __group__
), parse("{\!""||groups[j]||"\!""||"="||char(color)||"}") ) );
);
dt:sex_class<
Thanks a lot, but now I got greedy. What about changing dash style by class?

Thanks, Philipp

Super User

Joined:

Jun 22, 2012

Try this on for size

Names Default To Here( 1 );
dt = Open( "\$SAMPLE_DATA\big class.jmp" );
// Create a new column
dt << New Column( "Sex_Class", character, formula( :Sex || "_" || Char( :Age ) ) );

// Determine how many groups in the :Sex_Class
Summarize( dt, groups = by( :Sex_Class ) );

// Create the value colors list
colorlist = {};
For( i = 1, i <= N Items( groups ), i++,
If( Substr( groups[i], 1, 1 ) == "F",
color = 19,
color = 21
);
Eval(
Substitute(
Expr(
Insert Into( colorlist, __group__ )
),
Expr( __group__ ), Parse( "{\!"" || groups[i] || "\!"" || "=" || Char( color ) || "}" )
)
);
);

// Set the Value Colors property for the Sex_Class column
dt:sex_CLASS << set property( "value colors", Eval( colorlist ) );

linetype = {"Solid", "Dotted", "DashDot", "DashDotDot", "Dashed"};

TheExpr =
"Oneway(
Y( :weight ),
X( :Sex_Class ),
All Graphs( 0 ),
Plot Quantile by Actual( 1 ),
Line of Fit( 0 ),
X Axis Proportional( 0 ),
Grand Mean( 0 ),
SendToReport(
Dispatch(
{},
\!"222\!",
ScaleBox,
{Legend Model(
1,";
For( i = 1, i <= N Items( groups ), i++,
If( i > 1,
TheExpr = TheExpr || ","
);
TheExpr = TheExpr || "Properties(" || Char( i ) || ", {Line Style(\!"" || linetype[Mod( i, 5 ) + 1] || "\!" )} )";
);
TheExpr = TheExpr || "),
)}

)";

Eval( Parse( theexpr ) );


There are only 5 line styles available

Jim

Community Trekker

Joined:

May 18, 2017

I believe there were a few syntax errors in your script suggestion, which I
fixed. See below. However, I keep getting error messages like "Cannot find
ScaleBox[ "400" ] at {}", even if I go with "222" as you suggested. (BTW,
never understood what that number means) And the line styles are not
adjusted. Colors work ok as before.

thanks, Philipp

Expr =
"Oneway(
Y( :weight ),
X( :Sex_Class ),
All Graphs( 0 ),
Plot Quantile by Actual( 1 ),
Line of Fit( 0 ),
X Axis Proportional( 0 ),
Grand Mean( 0 ),
SendToReport(
Dispatch({},\!"400\!",
ScaleBox,
{Legend Model(1";
For( i = 1, i <= N Items( groups ), i++,
Expr = Expr || ",Properties(" || Char( i ) || ", {Line Style(\!"" ||
linetype[Mod( i, 5 ) + 1] || "\!" )} )";
);
Expr = Expr || ")})))";

Eval( Parse( Expr ) );