TICKVALUELIST and TICKVALUEFORMAT can be worked to get the left axis values formatted appropriately (you remove the paramn trtsdf. from the format statement and use that as value for tickvalueformat). The issue is that if you do this, the scatterplot no longer alligns with the barchart as the barchart MUST have a category variable as X axis and thus there's no concept of distance between .8 and 1.2 Since the first graph you've defined needs category variables, the left axis gets defined as a discrete axis and because of formats pointing to the same values, you create 8 charts. The most simple fix is to change your format trtsdf to make all of the labels distinct. You might be able to play with truncation of labels on the graph to create a long format like 0.2="pos 1" and truncate the end to mimic your desired output. Otherwise, you can change the data and the tick values so that you can line up a numeric left Y axis perfectly with a categorical (spread evenly) right Y axis. This can be seen by the code example below : Alternatively, I assume you could've added a data point of missing values for 1 and formated it as "" to create a space inside your graph retaining the .2/.4/.6/.8 patterns. I put to bold the changes I made. proc sql; create table uni_api (paramn num(8), paramn1 num(8), estimate num(8),standard num(8)); insert into uni_api values (0.25, 0.25, -3.0, 0.3) values (0.5, 0.5, -2.8, 0.4) values (0.75, 0.75, -3.1, 0.2) values (1, 1, -3.4, 0.4) values (1.25, 1.25, -2.7, 0.6) values (1.5, 1.5, -2.9, 0.3) values (1.75, 1.75, -3.3, 0.2) values (2.0, 2.0, -3.1, 0.1); quit; PROC FORMAT; VALUE trtsdf 0.25="pos" 0.5="unc" 0.75="neg" 1.0="x 200 mg" 1.25="pos" 1.5="unc" 1.75="neg" 2.0="x 400 mg" ; VALUE trtpf 0.25=" 12 (4.67%)" 0.5=" 11 (8.03%)" 0.75=" 13 (23.31%)" 1.0=" 61 ( 100%)" 1.25=" 8 (5.69%)" 1.5=" 10 (26.61%)" 1.75=" 8 (76.69%)" 2.0=" 51 ( 100%)" ; QUIT; PROC template; DEFINE STATGRAPH gtplot; BEGINGRAPH; LAYOUT OVERLAY / XAXISOPTS=(label=" " linearopts=(tickvaluesequence=(start=-5 end=0 increment=1))) YAXISOPTS=(type=linear label="Treatment / Dose" linearopts=(tickvaluelist=(0.25 0.5 0.75 1.0 1.25 1.5 1.75 2.0) tickvalueformat=trtsdf.) ) Y2AXISOPTS=(label="N(%)"); BARCHART y=estimate x=paramn1 / GROUP=paramn BARWIDTH=0.4 NAME="bar" ORIENT=horizontal FILLATTRS=(COLOR = LIGHTGREY) DATATRANSPARENCY=0.7 YAXIS=y2; SCATTERPLOT x=estimate y=paramn / GROUP=paramn XERRORLOWER=eval(estimate-standard) ERRORBARATTRS=(thickness=1) LEGENDLABEL="Results" NAME="SCATTER" MARKERATTRS=(color=black size=0); BARCHART y=estimate x=paramn1 / GROUP=paramn BARWIDTH=0.4 PRIMARY=no NAME="bar1" ORIENT=horizontal YAXIS=y2 FILLATTRS=(COLOR = LIGHTGREY) DATATRANSPARENCY=0.7 ; ENDLAYOUT; ENDGRAPH; END; RUN; PROC SGRENDER DATA=uni_api TEMPLATE="gtplot"; format /* paramn trtsdf. */ paramn1 trtpf.; RUN; Hope this was useful, I've learned a lot myself trying to solve this puzzle -_-. Sadly, I lost the help page that clearly states that if you attempt to overlay graphs for which the axis' are not compatible, you can get unexpected results. If there exists a bar-making plot that can use numeric points and a width instead of categorical data, you could then get more generic in terms of how you set our paramn value ticks but I couldn't find any in the documentation.(maybe its achiveable with histogramparm with very painful handling of negative values). Vince
... View more