So the other day after my fluctuation chart post Jon Peck gently nudged me to make a chart custom dialog (with teasers such as it only takes a few minutes.) Well, he is right, they are quite easy to make. Here I will briefly walk through the process just to highlight how easy it really is.
At first, I was confusing the custom builder dialog with the old VB like scripts. The newer builder dialog (not sure what version it was introduced, but all I note here was produced in V20) is a purely GUI application that one can build dialogs to insert arbitrary code sections based on user input. It is easier to show than say, but in the end the dialog I build here will produce the necessary syntax to make the fluctuation charts I showed in the noted prior post.
So first, to get to the Chart Builder dialog one needs to access the menu via Utilities -> Custom Dialogs -> Custom Dialog Builder.

Then, when the dialog builder is opened, one is presented with an empty dialog canvas.

To start building the dialog, you drag the elements in the tool box onto the canvas. It seems you will pretty much always want to start with a source variable list.

Now, before we finish all of the controls, lets talk about how the dialog builder interacts with the produced syntax. So, for my fluctuation chart, a typical syntax call might look like below, if we want to plot V1
against V2
.
GGRAPH
/GRAPHDATASET NAME="graphdataset" VARIABLES=V1 V2 COUNT()[name="COUNT"]
/GRAPHSPEC SOURCE=INLINE.
BEGIN GPL
SOURCE: s=userSource(id("graphdataset"))
DATA: V1=col(source(s), name("V1"), unit.category())
DATA: V2=col(source(s), name("V2"), unit.category())
DATA: COUNT=col(source(s), name("COUNT"))
GUIDE: axis(dim(1), label("V1"))
GUIDE: axis(dim(2), label("V2"))
SCALE: pow(aesthetic(aesthetic.size), aestheticMinimum(size."8px"), aestheticMaximum(size."45px"))
SCALE: linear(aesthetic(aesthetic.color.interior), aestheticMinimum(color.lightgrey), aestheticMaximum(color.darkred))
ELEMENT: point(position(V1*V2), shape(shape.square), color.interior(COUNT), size(COUNT))
END GPL.
So how exactly will the dialog builder insert arbitrary variables? In our syntax, we want to replace sections of code with %%Identifier%%
, where Identifier refers to a particular name we assign to any particular control in the builder. So, if I wanted to have some arbitrary code to change V1
to whatever the user inputs, I would replace V1
in the original syntax with %%myvar%%
(and name the control myvar
). In the end, the syntax template for this particular dialog looks like below.
GGRAPH
/GRAPHDATASET NAME="graphdataset" VARIABLES=%%x%% %%y%% COUNT()[name="COUNT"]
/GRAPHSPEC SOURCE=INLINE.
BEGIN GPL
SOURCE: s=userSource(id("graphdataset"))
DATA: %%x%%=col(source(s), name("%%x%%"), unit.category())
DATA: %%y%%=col(source(s), name("%%y%%"), unit.category())
DATA: COUNT=col(source(s), name("COUNT"))
GUIDE: axis(dim(1), label("%%x%%"))
GUIDE: axis(dim(2), label("%%y%%"))
%%title%%
SCALE: pow(aesthetic(aesthetic.size) %%minpixel%% %%maxpixel%%)
SCALE: linear(aesthetic(aesthetic.color.interior), aestheticMinimum(color.lightgrey), aestheticMaximum(color.darkred))
ELEMENT: point(position(%%x%%*%%y%%), shape(shape.square), color.interior(COUNT), size(COUNT))
END GPL.
To insert the syntax, there is a button in the dialog builder to open it (the tool tip will say syntax template). You can just copy and paste the code in. Here there are user inputs for both the variables for the fluctuation chart, and the minimum and maximum size of the pixels, and the chart title. Only the variables are required for execution, and if the user inputs for the other arbitrary statements are not filled in they dissapear completely from the syntax generation.

Now, we are set up with all of the arbitrary elements we want to insert into the code. Here I want to have controls for two target lists (the x and y axis variables), two number controls (for the min and max size of the pixels), and one text control (for the chart title). To associate the control with the syntax, after you place a control on the canvas you can select and edit its attributes. The Identifier attribute is what associates it with the %%mypar%%
in the syntax template.
So here for the Y axis variable, I named the Identifier y
.

Also take note of the syntax field, %%ThisValue%%
. Here, you can change the syntax field to either just enter the field name (or user input), or enter in more syntax around that user input. As an example, the Syntax field for the Chart Title control looks like this;
GUIDE: text.title(label("%%ThisValue%%"))
If the title control is omitted, the entire %%title%%
line in the syntax template is not generated. If some text is entered into the title control, the surrounding GUIDE
syntax is inserted with the text replacing %%ThisValue%%
in the above code example. You can see how I used this behavior to make the min and max pixel size for the points arbitrary.
To learn more about all of the different controls and more of the aesthetics and extra niceties you can do with the dialog builder, you should just take a stroll through the help for custom dialogs. Here is the location where I uploaded the FluctuationChart dialog builder to (you can open it up and edit it yourself to see the internals). I hope to see more contributions by other SPSS users in the future, they are really handy for Python and R scripts in addition to GGRAPH code.
Jon Peck
/ May 10, 2013Although the CDB in your example is building a charting dialog, the feature is actually called the Custom Dialog Builder not the Chart Builder. But you are right: it is quick and easy.
apwheele
/ May 10, 2013Whoops! Thanks for pointing out my mistake Jon.
I will update the post to reflect this (unfortunately I repeated my mistake multiple times it appears!)
Sanjay
/ May 6, 2016Hi Mr. Wheeler, I am new to this topic but very interested in developing custom dialogue box in SPSS. I need your guidance.
1. Does the syntax that you have shared is written in python language?
2. Can you share any good reference book or online source that can help in learning to build this from scratch? Currently I have started to refer IBM Help option
apwheele
/ May 6, 2016No python in the example above, but you can call python code.
I don’t remember using any guides besides whats in SPSS help. Best way to learn (after this post) is to go and attempt to build one yourself! Good luck.
Sanjay
/ May 6, 2016Thanks Mr. Wheeler!
Then the code that you have shared is written in which language?
And by calling python code do you mean Can I directly start writing python code in Syntax Template and run it?
Say for example I just want to calculate mean for a scale variable then can I write the code for calculating mean in python directly in Syntax Template and run it
Or
I have to write python code in the Python Software and integrate it in someway in Syntax Template?
apwheele
/ May 6, 2016It is just SPSS syntax (specifically GGRAPH code to make a graph). You can call python code in SPSS by placing it in between BEGIN PROGRAM….END PROGRAM block. See ftp://public.dhe.ibm.com/software/analytics/spss/documentation/statistics/24.0/en/client/Manuals/Python_Reference_Guide_for_IBM_SPSS_Statistics.pdf
Sanjay
/ May 6, 2016Thank you for sharing the link Mr. Wheeler, and explanation. Regards