The size aesthetic is typically used to scale points and text. The default scale for size aesthetics is
scale_size() in which a linear increase in the variable is mapped onto a linear increase in the area (not the radius) of the geom. Scaling as a function of area is a sensible default as human perception of size is more closely mimicked by area scaling than by radius scaling. By default the smallest value in the data (more precisely in the scale limits) is mapped to a size of 1 and the largest is mapped to a size of 6. The
range argument allows you to scale the size of the geoms:
base <- ggplot(mpg, aes(displ, hwy, size = cyl)) + geom_point() base base + scale_size(range = c(1, 2))
There are situations where area scaling is undesirable, and for such situations the
scale_radius() function is provided. To illustrate when
scale_radius() is appropriate consider a data set containing astronomical data that includes the radius of different planets:
planets #> name type position radius orbit #> 1 Mercury Inner 1 2440 5.79e+07 #> 2 Venus Inner 2 6052 1.08e+08 #> 3 Earth Inner 3 6378 1.50e+08 #> 4 Mars Inner 4 3390 2.28e+08 #> 5 Jupiter Outer 5 71400 7.78e+08 #> 6 Saturn Outer 6 60330 1.43e+09 #> 7 Uranus Outer 7 25559 2.87e+09 #> 8 Neptune Outer 8 24764 4.50e+09
In this instance a plot that uses the size aesthetic to represent the radius of the planets should use
scale_radius() rather than the default
scale_size(). It is also important in this case to set the scale limits so that a planet with radius 0 would be drawn with a disc with radius 0.
base <- ggplot(planets, aes(1, name, size = radius)) + geom_point() + scale_x_continuous(breaks = NULL) + labs(x = NULL, y = NULL, size = NULL) base + ggtitle("not to scale") base + scale_radius(limits = c(0, NA), range = c(0, 10)) + ggtitle("to scale")
On the left it is difficult to distinguish Jupiter from Saturn, despite the fact that the difference between the two should be double the size of Earth; compare this to the plot on the right where the radius of Jupiter is visibly larger.
Other size scales exist and are worth noting briefly:
These scales are just a list of valid values that are mapped to the unique discrete values. If you want to customise these scales, you need to create your own new scale with the “manual” version of each:
The manual scale has one important argument,
values, where you specify the values that the scale should produce: see Section 10.3 for an example using manual colour scales. If this vector is named, it will match the values of the output to the values of the input; otherwise it will match in order of the levels of the discrete variable. You will need some knowledge of the valid aesthetic values, which are described in
Identity scales — such as
scale_shape_identity() — are used when your data is already scaled such that the data and aesthetic spaces are the same. The code below shows an example where the identity scale is useful.
luv_colours contains the locations of all R’s built-in colours in the LUV colour space (the space that HCL is based on). A legend is unnecessary, because the point colour represents itself: the data and aesthetic spaces are the same.
head(luv_colours) #> L u v col #> 1 9342 -3.37e-12 0 white #> 2 9101 -4.75e+02 -635 aliceblue #> 3 8810 1.01e+03 1668 antiquewhite #> 4 8935 1.07e+03 1675 antiquewhite1 #> 5 8452 1.01e+03 1610 antiquewhite2 #> 6 7498 9.03e+02 1402 antiquewhite3 ggplot(luv_colours, aes(u, v)) + geom_point(aes(colour = col), size = 3) + scale_color_identity() + coord_equal()