BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
AncaTilea
Pyrite | Level 9

Hi.

I have a working code that manifests differently for what seems to me very similar conditions. PLease see below:

I have a data set that has estimates from a couple of models (one assessing within the other one between subjects...)

I  initially had a chart that plotted the estimates from both models in one plot:

data have;

    input measure $ 1-19 model $ Estimate ;

cards;

First, Measure     b_gfr         3.48

First, Measure     d_gfr_10      3.56

Second, Measure    b_gfr         1.38

Second, Measure    d_gfr_10      2.22

Third, Measure     b_gfr         1.40

Third, Measure     d_gfr_10      2.03

Fourth, Measure    b_gfr         1.38

Fourth, Measure    d_gfr_10      3.28

Fifth, Measure     b_gfr         0.85

Fifth, Measure     d_gfr_10      1.51

Sixth, Measure     b_gfr         0.07

Sixth, Measure     d_gfr_10      0.38

Seventh, Measure   b_gfr         0.63

Seventh, Measure   d_gfr_10      0.93

Eighth, Measure    b_gfr         2.99

Eighth, Measure    d_gfr_10      5.17

;

filename models "&plot_path.\models_both.jpeg";

goptions reset = all device = jpeg gsfname = models gsfmode = replace ;

options orientation=landscape  nodate nonumber ;

pattern1 color = graycc;

pattern2 color = gray;

    axis1 label = none minor = none order = (0.0 to 7.0 by 1) value = none major = none c = white;

    axis2 label = none  value = none;

    axis3 split = "," label = none value = (f = "Arial/Bold" h = 1.2 ) c = black;

legend label = none position = (inside top left) mode = protect across = 1

                value = (h = 1.7 f = "Arial" "Between-Patient Models" "Within-Patient Models");

proc gchart data = have ;

    vbar model/

        sumvar = estimate NoZero space = 0

        group = measure subgroup = model legend = legend

        type = mean iframe = black

        raxis = axis1  maxis = axis2 gaxis = axis3

        coutline = black

     ;

run;quit;

It turns out the request is now for separate plots. Very easy to do, I just split the code and restrict the data to one mode at the time, using a where statement.

filename models "&plot_path.\models_cross.jpeg";

goptions device = jpeg gsfname = models gsfmode = replace ;

options orientation=landscape  nodate nonumber ;

    axis1 label = none minor = none order = (0 to 7 by 1)

    value = none major = none c = white;

    axis2 label = none  value = none;

    axis3 split = "," label = none value = (f = "Arial/Bold" h = 1.2 ) c = black;

pattern color = grayee;

legend label = none position = (inside top left) mode = protect across = 1

                value = (h = 1.7 f = "Arial" "Between-Patient Models");

proc gchart data = have ;where model = 'b_gfr';

    vbar model/

        sumvar = estimate NoZero space = 0

        group = measure legend = legend

        type = mean iframe = black

        raxis = axis1  maxis = axis2 gaxis = axis3

        coutline = black

     ;

run;quit;

filename models "&plot_path.\models_within.jpeg";

goptions device = jpeg gsfname = models gsfmode = replace ;

options orientation=landscape  nodate nonumber ;

    axis1 label = none minor = none order = (0 to 7 by 1)

    value = none major = none c = white;

    axis2 label = none  value = none;

    axis3 split = "," label = none value = (f = "Arial/Bold" h = 1.2 ) c = black;

pattern color = gray;

legend label = none position = (inside top left) mode = protect across = 1

                value = (h = 1.7 f = "Arial" "Within-Patient Models");

proc gchart data = have ;where model = 'd_gfr_10';

    vbar model/

        sumvar = estimate NoZero space = 0

        group = measure legend = legend

        type = mean iframe = black

        raxis = axis1  maxis = axis2 gaxis = axis3

        coutline = black

     ;

run;quit;

OK, so my problem is that one plot 'fills' the graphic area, the other one seems to be smaller and I can't figure out why.



Any help would be highly appreciated.


Thank you!


Anca.


1 ACCEPTED SOLUTION

Accepted Solutions
GraphGuy
Meteorite | Level 14

Your code seems a bit overly-tricky, using the group= option for what is visually not a grouped bar chart.

I would use the following simplified code instead:

axis1 label=none minor=none order=(0 to 7 by 1) value=none major=none c=white;

axis2 split="," label=none;

pattern color=grayee;

proc gchart data=have; where model='b_gfr';

    vbar measure /

        sumvar=estimate NoZero

        legend=legend

        type=mean iframe=black

        raxis=axis1 maxis=axis2

        coutline=black;

run;

pattern color=gray;

proc gchart data=have; where model = 'd_gfr_10';

    vbar measure /

        sumvar=estimate NoZero

         legend=legend

        type=mean iframe=black

        raxis=axis1 maxis=axis2

        coutline=black;

run;

View solution in original post

6 REPLIES 6
GraphGuy
Meteorite | Level 14

Your code seems a bit overly-tricky, using the group= option for what is visually not a grouped bar chart.

I would use the following simplified code instead:

axis1 label=none minor=none order=(0 to 7 by 1) value=none major=none c=white;

axis2 split="," label=none;

pattern color=grayee;

proc gchart data=have; where model='b_gfr';

    vbar measure /

        sumvar=estimate NoZero

        legend=legend

        type=mean iframe=black

        raxis=axis1 maxis=axis2

        coutline=black;

run;

pattern color=gray;

proc gchart data=have; where model = 'd_gfr_10';

    vbar measure /

        sumvar=estimate NoZero

         legend=legend

        type=mean iframe=black

        raxis=axis1 maxis=axis2

        coutline=black;

run;

AncaTilea
Pyrite | Level 9

Thank you!

:smileygrin:

GraphGuy
Meteorite | Level 14

I would also recommend using device=png (or device=gif), rather than device=jpeg.

AncaTilea
Pyrite | Level 9

I was wondering why users prefer the .png to .jpeg?

is there any reason for that?

My graphs tend to look acceptable in jpeg, and eventually when time gets to publish I make .eps or .tiff...

If you have more thoughts on this, I would appreciate your opinion.

Thank you in advance.

GraphGuy
Meteorite | Level 14

The jpeg format is more geared towards photographs, and can produce "blurry" looking graphs & charts (or at least that's been my experience).

The png or gif formats are better for creating "crisp" looking graphs & charts.   Also, png supports anti-aliasing (of text & lines) and supports millions of colors.  I recommend using png.

GraphGuy
Meteorite | Level 14

Or, in the words of our developer who works on the SAS jpeg driver ...

"The JPEG format is by nature more suited to reproducing photographic images than

business graphics due to the lossy compression method used.  PNG, TIFF, and GIF

are better format choices for plots, charts, and other business graphic

drawings.  It is possible to clean up JPEG images a little by increasing the image

quality setting to 100 per cent (using the new jpegquality system option)."

sas-innovate-2024.png

Don't miss out on SAS Innovate - Register now for the FREE Livestream!

Can't make it to Vegas? No problem! Watch our general sessions LIVE or on-demand starting April 17th. Hear from SAS execs, best-selling author Adam Grant, Hot Ones host Sean Evans, top tech journalist Kara Swisher, AI expert Cassie Kozyrkov, and the mind-blowing dance crew iLuminate! Plus, get access to over 20 breakout sessions.

 

Register now!

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 6 replies
  • 1036 views
  • 6 likes
  • 2 in conversation