Gadfly is an implementation of a "grammar of graphics" style statistical graphics system for Julia. This tutorial will outline general usage patterns and will give you a feel for the overall system.
To begin, we need some data. Gadfly can work with data supplied as either a DataFrame or as plain AbstractArrays. In this tutorial, we'll pick and choose some examples from the RDatasets package.
Let us use Fisher's iris dataset as a starting point.
using Gadfly, RDatasets
iris = dataset("datasets", "iris")
Row SepalLength SepalWidth PetalLength PetalWidth Species 1 5.1 3.5 1.4 0.2 setosa 2 4.9 3.0 1.4 0.2 setosa 3 4.7 3.2 1.3 0.2 setosa 4 4.6 3.1 1.5 0.2 setosa 5 5.0 3.6 1.4 0.2 setosa 6 5.4 3.9 1.7 0.4 setosa ... ... ... ... ... ...
When used with a DataFrame, the plot
function in Gadfly is of the form:
plot(data::AbstractDataFrame, elements::Element...; mapping...)
The first argument is the data to be plotted and the keyword arguments at the end map "aesthetics" to columns in the data frame. All input arguments between data
and mapping
are some number of "elements", which are the nouns and verbs, so to speak, that form the grammar.
Let's get to it.
p = plot(iris, x=:SepalLength, y=:SepalWidth, Geom.point);
First note that we've taken advantage of the flexibility of Julia's handling of function signatures and put the keyword arguments in the midst of the positional arguments. This is purely for ease of reading.
The example above produces a Plot
object. It can be saved to a file by drawing to one or more backends using draw
.
img = SVG("iris_plot.svg", 14cm, 8cm)
draw(img, p)
Now we have the following charming little SVG image.
SepalLength
4
5
6
7
8
4.0
4.2
4.4
4.6
4.8
5.0
5.2
5.4
5.6
5.8
6.0
6.2
6.4
6.6
6.8
7.0
7.2
7.4
7.6
7.8
8.0
3.98
4.00
4.02
4.04
4.06
4.08
4.10
4.12
4.14
4.16
4.18
4.20
4.22
4.24
4.26
4.28
4.30
4.32
4.34
4.36
4.38
4.40
4.42
4.44
4.46
4.48
4.50
4.52
4.54
4.56
4.58
4.60
4.62
4.64
4.66
4.68
4.70
4.72
4.74
4.76
4.78
4.80
4.82
4.84
4.86
4.88
4.90
4.92
4.94
4.96
4.98
5.00
5.02
5.04
5.06
5.08
5.10
5.12
5.14
5.16
5.18
5.20
5.22
5.24
5.26
5.28
5.30
5.32
5.34
5.36
5.38
5.40
5.42
5.44
5.46
5.48
5.50
5.52
5.54
5.56
5.58
5.60
5.62
5.64
5.66
5.68
5.70
5.72
5.74
5.76
5.78
5.80
5.82
5.84
5.86
5.88
5.90
5.92
5.94
5.96
5.98
6.00
6.02
6.04
6.06
6.08
6.10
6.12
6.14
6.16
6.18
6.20
6.22
6.24
6.26
6.28
6.30
6.32
6.34
6.36
6.38
6.40
6.42
6.44
6.46
6.48
6.50
6.52
6.54
6.56
6.58
6.60
6.62
6.64
6.66
6.68
6.70
6.72
6.74
6.76
6.78
6.80
6.82
6.84
6.86
6.88
6.90
6.92
6.94
6.96
6.98
7.00
7.02
7.04
7.06
7.08
7.10
7.12
7.14
7.16
7.18
7.20
7.22
7.24
7.26
7.28
7.30
7.32
7.34
7.36
7.38
7.40
7.42
7.44
7.46
7.48
7.50
7.52
7.54
7.56
7.58
7.60
7.62
7.64
7.66
7.68
7.70
7.72
7.74
7.76
7.78
7.80
7.82
7.84
7.86
7.88
7.90
7.92
7.94
7.96
7.98
8.00
4
6
8
5.9,3.0
6.2,3.4
6.5,3.0
6.3,2.5
6.7,3.0
6.7,3.3
6.8,3.2
5.8,2.7
6.9,3.1
6.7,3.1
6.9,3.1
6.0,3.0
6.4,3.1
6.3,3.4
7.7,3.0
6.1,2.6
6.3,2.8
6.4,2.8
7.9,3.8
7.4,2.8
7.2,3.0
6.4,2.8
6.1,3.0
6.2,2.8
7.2,3.2
6.7,3.3
6.3,2.7
7.7,2.8
5.6,2.8
6.9,3.2
6.0,2.2
7.7,2.6
7.7,3.8
6.5,3.0
6.4,3.2
5.8,2.8
5.7,2.5
6.8,3.0
6.4,2.7
6.5,3.2
7.2,3.6
6.7,2.5
7.3,2.9
4.9,2.5
7.6,3.0
6.5,3.0
6.3,2.9
7.1,3.0
5.8,2.7
6.3,3.3
5.7,2.8
5.1,2.5
6.2,2.9
5.7,2.9
5.7,3.0
5.6,2.7
5.0,2.3
5.8,2.6
6.1,3.0
5.5,2.6
5.5,2.5
5.6,3.0
6.3,2.3
6.7,3.1
6.0,3.4
5.4,3.0
6.0,2.7
5.8,2.7
5.5,2.4
5.5,2.4
5.7,2.6
6.0,2.9
6.7,3.0
6.8,2.8
6.6,3.0
6.4,2.9
6.1,2.8
6.3,2.5
6.1,2.8
5.9,3.2
5.6,2.5
6.2,2.2
5.8,2.7
5.6,3.0
6.7,3.1
5.6,2.9
6.1,2.9
6.0,2.2
5.9,3.0
5.0,2.0
5.2,2.7
6.6,2.9
4.9,2.4
6.3,3.3
5.7,2.8
6.5,2.8
5.5,2.3
6.9,3.1
6.4,3.2
7.0,3.2
5.0,3.3
5.3,3.7
4.6,3.2
5.1,3.8
4.8,3.0
5.1,3.8
5.0,3.5
4.4,3.2
4.5,2.3
5.0,3.5
5.1,3.4
4.4,3.0
4.9,3.6
5.5,3.5
5.0,3.2
4.9,3.1
5.5,4.2
5.2,4.1
5.4,3.4
4.8,3.1
4.7,3.2
5.2,3.4
5.2,3.5
5.0,3.4
5.0,3.0
4.8,3.4
5.1,3.3
4.6,3.6
5.1,3.7
5.4,3.4
5.1,3.8
5.7,3.8
5.1,3.5
5.4,3.9
5.7,4.4
5.8,4.0
4.3,3.0
4.8,3.0
4.8,3.4
5.4,3.7
4.9,3.1
4.4,2.9
5.0,3.4
4.6,3.4
5.4,3.9
5.0,3.6
4.6,3.1
4.7,3.2
4.9,3.0
5.1,3.5
h,j,k,l,arrows,drag to pan
i,o,+,-,scroll,shift-drag to zoom
r,dbl-click to reset
c for coordinates
? for help
?
2.0
2.5
3.0
3.5
4.0
4.5
2.0
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.9
3.0
3.1
3.2
3.3
3.4
3.5
3.6
3.7
3.8
3.9
4.0
4.1
4.2
4.3
4.4
4.5
1.99
2.00
2.01
2.02
2.03
2.04
2.05
2.06
2.07
2.08
2.09
2.10
2.11
2.12
2.13
2.14
2.15
2.16
2.17
2.18
2.19
2.20
2.21
2.22
2.23
2.24
2.25
2.26
2.27
2.28
2.29
2.30
2.31
2.32
2.33
2.34
2.35
2.36
2.37
2.38
2.39
2.40
2.41
2.42
2.43
2.44
2.45
2.46
2.47
2.48
2.49
2.50
2.51
2.52
2.53
2.54
2.55
2.56
2.57
2.58
2.59
2.60
2.61
2.62
2.63
2.64
2.65
2.66
2.67
2.68
2.69
2.70
2.71
2.72
2.73
2.74
2.75
2.76
2.77
2.78
2.79
2.80
2.81
2.82
2.83
2.84
2.85
2.86
2.87
2.88
2.89
2.90
2.91
2.92
2.93
2.94
2.95
2.96
2.97
2.98
2.99
3.00
3.01
3.02
3.03
3.04
3.05
3.06
3.07
3.08
3.09
3.10
3.11
3.12
3.13
3.14
3.15
3.16
3.17
3.18
3.19
3.20
3.21
3.22
3.23
3.24
3.25
3.26
3.27
3.28
3.29
3.30
3.31
3.32
3.33
3.34
3.35
3.36
3.37
3.38
3.39
3.40
3.41
3.42
3.43
3.44
3.45
3.46
3.47
3.48
3.49
3.50
3.51
3.52
3.53
3.54
3.55
3.56
3.57
3.58
3.59
3.60
3.61
3.62
3.63
3.64
3.65
3.66
3.67
3.68
3.69
3.70
3.71
3.72
3.73
3.74
3.75
3.76
3.77
3.78
3.79
3.80
3.81
3.82
3.83
3.84
3.85
3.86
3.87
3.88
3.89
3.90
3.91
3.92
3.93
3.94
3.95
3.96
3.97
3.98
3.99
4.00
4.01
4.02
4.03
4.04
4.05
4.06
4.07
4.08
4.09
4.10
4.11
4.12
4.13
4.14
4.15
4.16
4.17
4.18
4.19
4.20
4.21
4.22
4.23
4.24
4.25
4.26
4.27
4.28
4.29
4.30
4.31
4.32
4.33
4.34
4.35
4.36
4.37
4.38
4.39
4.40
4.41
4.42
4.43
4.44
4.45
4.46
4.47
4.48
4.49
4.50
2
3
4
5
SepalWidth
If some of the text in this image is overlapping other text, your browser likely has a minimum font size set. You will need to unset this option for the plots to render correctly in your web browser.
If you are working at the REPL, a quicker way to see the image is to omit the semi-colon trailing plot
. This automatically renders the image to your default multimedia display, typically an internet browser. No need to capture the output argument in this case.
plot(iris, x=:SepalLength, y=:SepalWidth)
Note that Geom.point
will be automatically supplied if no other geometries are given.
Alternatively one can manually call display
on a Plot
object. This workflow is necessary when display
would not otherwise be called automatically.
function get_to_it(d)
ppoint = plot(d, x=:SepalLength, y=:SepalWidth, Geom.point)
pline = plot(d, x=:SepalLength, y=:SepalWidth, Geom.line)
ppoint, pline
end
ps = get_to_it(iris)
map(display, ps)
For the rest of the demonstrations, we'll simply omit the trailing semi-colon for brevity.
In this plot we've mapped the x aesthetic to the SepalLength
column and the y aesthetic to the SepalWidth
. The last argument, Geom.point
, is a geometry element which takes bound aesthetics and renders delightful figures. Adding other geometries produces layers, which may or may not result in a coherent plot.
plot(iris, x=:SepalLength, y=:SepalWidth, Geom.point, Geom.line)
SepalLength
4
5
6
7
8
4.0
4.2
4.4
4.6
4.8
5.0
5.2
5.4
5.6
5.8
6.0
6.2
6.4
6.6
6.8
7.0
7.2
7.4
7.6
7.8
8.0
3.98
4.00
4.02
4.04
4.06
4.08
4.10
4.12
4.14
4.16
4.18
4.20
4.22
4.24
4.26
4.28
4.30
4.32
4.34
4.36
4.38
4.40
4.42
4.44
4.46
4.48
4.50
4.52
4.54
4.56
4.58
4.60
4.62
4.64
4.66
4.68
4.70
4.72
4.74
4.76
4.78
4.80
4.82
4.84
4.86
4.88
4.90
4.92
4.94
4.96
4.98
5.00
5.02
5.04
5.06
5.08
5.10
5.12
5.14
5.16
5.18
5.20
5.22
5.24
5.26
5.28
5.30
5.32
5.34
5.36
5.38
5.40
5.42
5.44
5.46
5.48
5.50
5.52
5.54
5.56
5.58
5.60
5.62
5.64
5.66
5.68
5.70
5.72
5.74
5.76
5.78
5.80
5.82
5.84
5.86
5.88
5.90
5.92
5.94
5.96
5.98
6.00
6.02
6.04
6.06
6.08
6.10
6.12
6.14
6.16
6.18
6.20
6.22
6.24
6.26
6.28
6.30
6.32
6.34
6.36
6.38
6.40
6.42
6.44
6.46
6.48
6.50
6.52
6.54
6.56
6.58
6.60
6.62
6.64
6.66
6.68
6.70
6.72
6.74
6.76
6.78
6.80
6.82
6.84
6.86
6.88
6.90
6.92
6.94
6.96
6.98
7.00
7.02
7.04
7.06
7.08
7.10
7.12
7.14
7.16
7.18
7.20
7.22
7.24
7.26
7.28
7.30
7.32
7.34
7.36
7.38
7.40
7.42
7.44
7.46
7.48
7.50
7.52
7.54
7.56
7.58
7.60
7.62
7.64
7.66
7.68
7.70
7.72
7.74
7.76
7.78
7.80
7.82
7.84
7.86
7.88
7.90
7.92
7.94
7.96
7.98
8.00
4
6
8
5.9,3.0
6.2,3.4
6.5,3.0
6.3,2.5
6.7,3.0
6.7,3.3
6.8,3.2
5.8,2.7
6.9,3.1
6.7,3.1
6.9,3.1
6.0,3.0
6.4,3.1
6.3,3.4
7.7,3.0
6.1,2.6
6.3,2.8
6.4,2.8
7.9,3.8
7.4,2.8
7.2,3.0
6.4,2.8
6.1,3.0
6.2,2.8
7.2,3.2
6.7,3.3
6.3,2.7
7.7,2.8
5.6,2.8
6.9,3.2
6.0,2.2
7.7,2.6
7.7,3.8
6.5,3.0
6.4,3.2
5.8,2.8
5.7,2.5
6.8,3.0
6.4,2.7
6.5,3.2
7.2,3.6
6.7,2.5
7.3,2.9
4.9,2.5
7.6,3.0
6.5,3.0
6.3,2.9
7.1,3.0
5.8,2.7
6.3,3.3
5.7,2.8
5.1,2.5
6.2,2.9
5.7,2.9
5.7,3.0
5.6,2.7
5.0,2.3
5.8,2.6
6.1,3.0
5.5,2.6
5.5,2.5
5.6,3.0
6.3,2.3
6.7,3.1
6.0,3.4
5.4,3.0
6.0,2.7
5.8,2.7
5.5,2.4
5.5,2.4
5.7,2.6
6.0,2.9
6.7,3.0
6.8,2.8
6.6,3.0
6.4,2.9
6.1,2.8
6.3,2.5
6.1,2.8
5.9,3.2
5.6,2.5
6.2,2.2
5.8,2.7
5.6,3.0
6.7,3.1
5.6,2.9
6.1,2.9
6.0,2.2
5.9,3.0
5.0,2.0
5.2,2.7
6.6,2.9
4.9,2.4
6.3,3.3
5.7,2.8
6.5,2.8
5.5,2.3
6.9,3.1
6.4,3.2
7.0,3.2
5.0,3.3
5.3,3.7
4.6,3.2
5.1,3.8
4.8,3.0
5.1,3.8
5.0,3.5
4.4,3.2
4.5,2.3
5.0,3.5
5.1,3.4
4.4,3.0
4.9,3.6
5.5,3.5
5.0,3.2
4.9,3.1
5.5,4.2
5.2,4.1
5.4,3.4
4.8,3.1
4.7,3.2
5.2,3.4
5.2,3.5
5.0,3.4
5.0,3.0
4.8,3.4
5.1,3.3
4.6,3.6
5.1,3.7
5.4,3.4
5.1,3.8
5.7,3.8
5.1,3.5
5.4,3.9
5.7,4.4
5.8,4.0
4.3,3.0
4.8,3.0
4.8,3.4
5.4,3.7
4.9,3.1
4.4,2.9
5.0,3.4
4.6,3.4
5.4,3.9
5.0,3.6
4.6,3.1
4.7,3.2
4.9,3.0
5.1,3.5
h,j,k,l,arrows,drag to pan
i,o,+,-,scroll,shift-drag to zoom
r,dbl-click to reset
c for coordinates
? for help
?
2.0
2.5
3.0
3.5
4.0
4.5
2.0
2.1
2.2
2.3
2.4
2.5
2.6
2.7
2.8
2.9
3.0
3.1
3.2
3.3
3.4
3.5
3.6
3.7
3.8
3.9
4.0
4.1
4.2
4.3
4.4
4.5
1.99
2.00
2.01
2.02
2.03
2.04
2.05
2.06
2.07
2.08
2.09
2.10
2.11
2.12
2.13
2.14
2.15
2.16
2.17
2.18
2.19
2.20
2.21
2.22
2.23
2.24
2.25
2.26
2.27
2.28
2.29
2.30
2.31
2.32
2.33
2.34
2.35
2.36
2.37
2.38
2.39
2.40
2.41
2.42
2.43
2.44
2.45
2.46
2.47
2.48
2.49
2.50
2.51
2.52
2.53
2.54
2.55
2.56
2.57
2.58
2.59
2.60
2.61
2.62
2.63
2.64
2.65
2.66
2.67
2.68
2.69
2.70
2.71
2.72
2.73
2.74
2.75
2.76
2.77
2.78
2.79
2.80
2.81
2.82
2.83
2.84
2.85
2.86
2.87
2.88
2.89
2.90
2.91
2.92
2.93
2.94
2.95
2.96
2.97
2.98
2.99
3.00
3.01
3.02
3.03
3.04
3.05
3.06
3.07
3.08
3.09
3.10
3.11
3.12
3.13
3.14
3.15
3.16
3.17
3.18
3.19
3.20
3.21
3.22
3.23
3.24
3.25
3.26
3.27
3.28
3.29
3.30
3.31
3.32
3.33
3.34
3.35
3.36
3.37
3.38
3.39
3.40
3.41
3.42
3.43
3.44
3.45
3.46
3.47
3.48
3.49
3.50
3.51
3.52
3.53
3.54
3.55
3.56
3.57
3.58
3.59
3.60
3.61
3.62
3.63
3.64
3.65
3.66
3.67
3.68
3.69
3.70
3.71
3.72
3.73
3.74
3.75
3.76
3.77
3.78
3.79
3.80
3.81
3.82
3.83
3.84
3.85
3.86
3.87
3.88
3.89
3.90
3.91
3.92
3.93
3.94
3.95
3.96
3.97
3.98
3.99
4.00
4.01
4.02
4.03
4.04
4.05
4.06
4.07
4.08
4.09
4.10
4.11
4.12
4.13
4.14
4.15
4.16
4.17
4.18
4.19
4.20
4.21
4.22
4.23
4.24
4.25
4.26
4.27
4.28
4.29
4.30
4.31
4.32
4.33
4.34
4.35
4.36
4.37
4.38
4.39
4.40
4.41
4.42
4.43
4.44
4.45
4.46
4.47
4.48
4.49
4.50
2
3
4
5
SepalWidth
This is the grammar of graphics equivalent of "colorless green ideas sleep furiously". It is valid grammar, but not particularly meaningful.
If by chance your data are stored in Arrays instead of a DataFrame, fear not, identical plots can be created using an alternate plot
signature:
plot(elements::Element...; aesthetics...)
Here, the keyword arguments directly supply the data to be plotted, instead of using them to indicate which columns of a DataFrame to use.
SepalLength = iris.SepalLength
SepalWidth = iris.SepalWidth
plot(x=SepalLength, y=SepalWidth, Geom.point,
Guide.xlabel("SepalLength"), Guide.ylabel("SepalWidth"))
Note that with the Array interface, extra elements must be included to specify the axis labels, whereas with a DataFrame they default to the column names.
Let's do add something meaningful by mapping the color aesthetic.
plot(iris, x=:SepalLength, y=:SepalWidth, color=:Species, Geom.point);
# or equivalently for Arrays:
Color = iris.Species
plot(x=SepalLength, y=SepalWidth, color=Color, Geom.point,
Guide.xlabel("SepalLength"), Guide.ylabel("SepalWidth"),
Guide.colorkey(title="Species"))
SepalLength
4
5
6
7
8
4.0
4.2
4.4
4.6
4.8
5.0
5.2
5.4
5.6
5.8
6.0
6.2
6.4
6.6
6.8
7.0
7.2
7.4
7.6
7.8
8.0
3.98
4.00
4.02
4.04
4.06
4.08
4.10
4.12
4.14
4.16
4.18
4.20
4.22
4.24
4.26
4.28
4.30
4.32
4.34
4.36
4.38
4.40
4.42
4.44
4.46
4.48
4.50
4.52
4.54
4.56
4.58
4.60
4.62
4.64
4.66
4.68
4.70
4.72
4.74
4.76
4.78
4.80
4.82
4.84
4.86
4.88
4.90
4.92
4.94
4.96
4.98
5.00
5.02
5.04
5.06
5.08
5.10
5.12
5.14
5.16
5.18
5.20
5.22
5.24
5.26
5.28
5.30
5.32
5.34
5.36
5.38
5.40
5.42
5.44
5.46
5.48
5.50
5.52
5.54
5.56
5.58
5.60
5.62
5.64
5.66
5.68
5.70
5.72
5.74
5.76
5.78
5.80
5.82
5.84
5.86
5.88
5.90
5.92
5.94
5.96
5.98
6.00
6.02
6.04
6.06
6.08
6.10
6.12
6.14
6.16
6.18
6.20
6.22
6.24
6.26
6.28
6.30
6.32
6.34
6.36
6.38
6.40
6.42
6.44
6.46
6.48
6.50
6.52
6.54
6.56
6.58
6.60
6.62
6.64
6.66
6.68
6.70
6.72
6.74
6.76
6.78
6.80
6.82
6.84
6.86
6.88
6.90
6.92
6.94
6.96
6.98
7.00
7.02
7.04
7.06
7.08
7.10
7.12
7.14
7.16
7.18
7.20
7.22
7.24
7.26
7.28
7.30
7.32
7.34
7.36
7.38
7.40
7.42
7.44
7.46
7.48
7.50
7.52
7.54
7.56
7.58
7.60
7.62
7.64
7.66
7.68
7.70
7.72
7.74
7.76
7.78
7.80
7.82
7.84
7.86
7.88
7.90
7.92
7.94
7.96
7.98
8.00
4
6
8
setosa
versicolor
virginica
Species