*Examples of using polygon to place label directly over point. DATASET CLOSE ALL. OUTPUT CLOSE ALL. FILE HANDLE save /NAME = "C:\Users\andrew.wheeler\Dropbox\Documents\BLOG\Trick_LabelsScatter". *Data obtained from http://vizwiz.blogspot.com/2013/01/alberto-cairo-three-steps-to-become.html *Data was originally from VizWiz blog https://dl.dropbox.com/u/14050515/VizWiz/obesity_education.xls. *That link does not work anymore though, see https://www.dropbox.com/s/lfwx7agkraci21y/obesity_education.xls?dl=0. *For my own dropbox link to the data. GET DATA /TYPE=XLS /FILE='save\obesity_education.xls' /SHEET=name 'Sheet1' /CELLRANGE=full /READNAMES=on /ASSUMEDSTRWIDTH=32767. DATASET NAME Obs. MATCH FILES FILE = * /DROP V5. FORMATS BAORHIGHER OBESITY (F2.0). *Scatterplot with States and labels. GGRAPH /GRAPHDATASET NAME="graphdataset" VARIABLES=BAORHIGHER OBESITY StateAbbr /GRAPHSPEC SOURCE=INLINE. BEGIN GPL SOURCE: s=userSource(id("graphdataset")) DATA: BAORHIGHER=col(source(s), name("BAORHIGHER")) DATA: OBESITY=col(source(s), name("OBESITY")) DATA: StateAbbr=col(source(s), name("StateAbbr"), unit.category()) GUIDE: axis(dim(1), label("% BA or Higher")) GUIDE: axis(dim(2), label("% Obese")) ELEMENT: point(position(BAORHIGHER*OBESITY), label(StateAbbr)) END GPL. *Problem remains even if labels are invisible. GGRAPH /GRAPHDATASET NAME="graphdataset" VARIABLES=BAORHIGHER OBESITY StateAbbr /GRAPHSPEC SOURCE=INLINE. BEGIN GPL SOURCE: s=userSource(id("graphdataset")) DATA: BAORHIGHER=col(source(s), name("BAORHIGHER")) DATA: OBESITY=col(source(s), name("OBESITY")) DATA: StateAbbr=col(source(s), name("StateAbbr"), unit.category()) GUIDE: axis(dim(1), label("% BA or Higher")) GUIDE: axis(dim(2), label("% Obese")) ELEMENT: point(position(BAORHIGHER*OBESITY), label(StateAbbr), transparency.exterior(transparency."1")) END GPL. *Scatterplot with only labels. GGRAPH /GRAPHDATASET NAME="graphdataset" VARIABLES=BAORHIGHER OBESITY StateAbbr /GRAPHSPEC SOURCE=INLINE. BEGIN GPL SOURCE: s=userSource(id("graphdataset")) DATA: BAORHIGHER=col(source(s), name("BAORHIGHER")) DATA: OBESITY=col(source(s), name("OBESITY")) DATA: StateAbbr=col(source(s), name("StateAbbr"), unit.category()) GUIDE: axis(dim(1), label("% BA or Higher")) GUIDE: axis(dim(2), label("% Obese")) ELEMENT: polygon(position(BAORHIGHER*OBESITY), label(StateAbbr), transparency.exterior(transparency."1")) END GPL. *Superimposed points to show they are at the center. GGRAPH /GRAPHDATASET NAME="graphdataset" VARIABLES=BAORHIGHER OBESITY StateAbbr /GRAPHSPEC SOURCE=INLINE. BEGIN GPL SOURCE: s=userSource(id("graphdataset")) DATA: BAORHIGHER=col(source(s), name("BAORHIGHER")) DATA: OBESITY=col(source(s), name("OBESITY")) DATA: StateAbbr=col(source(s), name("StateAbbr"), unit.category()) GUIDE: axis(dim(1), label("% BA or Higher")) GUIDE: axis(dim(2), label("% Obese")) ELEMENT: polygon(position(BAORHIGHER*OBESITY), label(StateAbbr), transparency.exterior(transparency."1")) ELEMENT: point(position(BAORHIGHER*OBESITY), color.interior(color.red)) END GPL. *Example of dot plot with categories. DATASET CLOSE ALL. DATA LIST FREE / Test Cat (2A1) Val (F1.0). BEGIN DATA 1 A 1 1 B 2 1 C 3 2 A 3 2 B 2 2 C 1 3 A 5 3 B 4 3 C 1 END DATA. DATASET NAME TestData. *Using legend. GGRAPH /GRAPHDATASET NAME="graphdataset" VARIABLES=Val[LEVEL=SCALE] Test Cat MISSING=LISTWISE REPORTMISSING=NO /GRAPHSPEC SOURCE=INLINE. BEGIN GPL SOURCE: s=userSource(id("graphdataset")) DATA: Val=col(source(s), name("Val")) DATA: Test=col(source(s), name("Test"), unit.category()) DATA: Cat=col(source(s), name("Cat"), unit.category()) GUIDE: axis(dim(1), label("Value")) GUIDE: axis(dim(2), label("Test")) GUIDE: legend(aesthetic(aesthetic.color.exterior), label("Cat")) SCALE: cat(aesthetic(aesthetic.shape), map(("A",shape.square),("B",shape.triangle),("C",shape.circle))) ELEMENT: point(position(Val*Test), color.exterior(Cat), color.interior(Cat), shape(Cat), transparency.interior(transparency."0.4"), size(size."14")) END GPL. *Using labels directly. GGRAPH /GRAPHDATASET NAME="graphdataset" VARIABLES=Val[LEVEL=SCALE] Test Cat MISSING=LISTWISE REPORTMISSING=NO /GRAPHSPEC SOURCE=INLINE. BEGIN GPL SOURCE: s=userSource(id("graphdataset")) DATA: Val=col(source(s), name("Val")) DATA: Test=col(source(s), name("Test"), unit.category()) DATA: Cat=col(source(s), name("Cat"), unit.category()) GUIDE: axis(dim(1), label("Value")) GUIDE: axis(dim(2), label("Test")) ELEMENT: polygon(position(Val*Test), transparency.exterior(transparency."1"), label(Cat)) END GPL. *Useful for time series and exact placement of text. DATASET CLOSE ALL. SET SEED 10. INPUT PROGRAM. LOOP #M = 1 TO 5. LOOP T = 1 TO 10. COMPUTE ID = #M. COMPUTE Y = RV.NORMAL(#M*5,1). END CASE. END LOOP. END LOOP. END FILE. END INPUT PROGRAM. DATASET NAME TimeSeries. FORMATS T ID Y (F3.0). ALTER TYPE ID (A1). STRING Lab (A1). IF T = 10 Lab = ID. EXECUTE. *Labelled at end of line. GGRAPH /GRAPHDATASET NAME="graphdataset" VARIABLES=T Y ID Lab MISSING=VARIABLEWISE /GRAPHSPEC SOURCE=INLINE. BEGIN GPL SOURCE: s=userSource(id("graphdataset")) DATA: T=col(source(s), name("T")) DATA: Y=col(source(s), name("Y")) DATA: ID=col(source(s), name("ID"), unit.category()) DATA: Lab=col(source(s), name("Lab"), unit.category()) TRANS: P= eval(T + 0.2) GUIDE: axis(dim(1), label("T")) GUIDE: axis(dim(2), label("Y")) SCALE: linear(dim(1), min(1), max(10.2)) ELEMENT: line(position(T*Y), split(ID)) ELEMENT: polygon(position(P*Y), label(Lab), transparency.exterior(transparency."1")) END GPL. *Random annotation at specified location. IF $casenum = 1 On1 = 1. GGRAPH /GRAPHDATASET NAME="graphdataset" VARIABLES=T Y ID Lab On1 MISSING=VARIABLEWISE /GRAPHSPEC SOURCE=INLINE. BEGIN GPL SOURCE: s=userSource(id("graphdataset")) DATA: T=col(source(s), name("T")) DATA: Y=col(source(s), name("Y")) DATA: On1=col(source(s), name("On1")) DATA: ID=col(source(s), name("ID"), unit.category()) DATA: Lab=col(source(s), name("Lab"), unit.category()) TRANS: P= eval(T + 0.2) TRANS: xLab = eval(2*On1) TRANS: yLab = eval(27*On1) TRANS: str = eval("Random Annotation Here") GUIDE: axis(dim(1), label("T")) GUIDE: axis(dim(2), label("Y")) ELEMENT: line(position(T*Y), split(ID)) ELEMENT: polygon(position(P*Y), label(Lab), transparency.exterior(transparency."1")) ELEMENT: polygon(position(xLab*yLab), label(str), transparency.exterior(transparency."1")) END GPL. *Example with dot plot histogram?. DATASET CLOSE ALL. INPUT PROGRAM. STRING Str (A1). LOOP #i = 1 TO 24. COMPUTE X = RV.UNIFORM(0,1). COMPUTE Str = STRING(#i + 64,PIB). END CASE. END LOOP. END FILE. END INPUT PROGRAM. DATASET NAME DotPlotHist. EXECUTE. GGRAPH /GRAPHDATASET NAME="graphdataset" VARIABLES=X Str /GRAPHSPEC SOURCE=INLINE. BEGIN GPL SOURCE: s=userSource(id("graphdataset")) DATA: X=col(source(s), name("X")) DATA: Str=col(source(s), name("Str"), unit.category()) COORD: rect(dim(1)) GUIDE: axis(dim(1), label("X")) ELEMENT: point.dodge.asymmetric(position(bin.dot(X)), label(Str), transparency.exterior(transparency."1")) END GPL. *Here you can manually edit the chart to have the labels inside of the point. OUTPUT EXPORT /PNG IMAGEROOT='save\Labels.png'.