This silly package, ggChernoff
, introduces a geom_chernoff
geom for ggplot2
. This works a bit like geom_point
, but draws little smiley faces (emoticons) instead of dots.
The Chernoff geom has some unique aesthetics, including smile
, which makes your faces smile or frown according to the relative magnitude of your continuous variable. By default, the mean value will generate a straight face 😑 while higher values will make smiles 😊 and lower values will draw frowns 😢. You can customise this using scale_smile
. If smile
is unmapped to a variable, all faces will be happy by default.
Eyebrows are hidden by default, but you can activate them by mapping something to the brow
aesthetic. High values make your faces angry :angry: and low values the opposite :anguished:.
Install the package using
devtools::install_github('Selbosh/ggChernoff')
and then load it using
Firstly, let’s create a scatter plot of smiley faces out of Fisher’s iris data set, each one coloured according to species.
library(ggplot2) ggplot(iris) + aes(Petal.Width, Petal.Length, fill = Species) + geom_chernoff()
Here is an example using Immer’s barley data. We are happy about larger yields!
ggplot(lattice::barley) + aes(year, variety, smile = yield, brow = yield) + geom_chernoff(fill = 'goldenrod1') + scale_x_discrete(limits = c('1931', '1932')) + facet_wrap(~ site)
Basic legends are now supported. We can customise breaks and titles in the usual ggplot2
way, via scale_smile_continuous
.
g <- ggplot(data.frame(x = rnorm(20), y = rexp(20), z = runif(20))) + aes(x, y, smile = z) + geom_chernoff(fill = 'steelblue1') g
g + scale_smile_continuous('Smilez', breaks = 0:10/10, midpoint = .5)
You can also use this command to adjust the range of possible happiness/sadness in your plot. In the following example, everybody is somewhere between sad and straight-faced.
g + scale_smile_continuous(range = c(-1, 0))
New feature as of 0.3.0: eye separation.
ggplot(iris) + aes(Petal.Width, Petal.Length, fill = Species, eyes = Sepal.Length) + geom_chernoff() + scale_eyes_continuous(range = c(0, 2))
cannon <- data.frame(x = 0, y = 0, colour = 'white', size = 20) bunkers <- data.frame(x = seq(-4, 4, l = 4), y = 2, colour = 'green', size = 1) ufos <- data.frame(x = rep(seq(-6, 6, length.out = 12), 5), y = rep(6:10, each = 12), size = 10, colour = c('cyan', 'yellow', 'magenta')[ c(rep(1:3,4), rep(c(2,3,1),4), rep(c(3,1,2),4), rep(1:3,4), rep(c(2,3,1),4)) ], brow = rnorm(60)) ggplot(ufos) + aes(x, y, fill = colour, size = size) + geom_chernoff(smile = -1, aes(brow = brow), eyes = .5) + geom_chernoff(data = cannon) + geom_tile(data = bunkers, width = 1) + geom_tile(data = data.frame(x = 0, y = 3, colour = 'white', size = 2), width = .1) + scale_fill_identity() + scale_size_identity() + theme_void() + theme(plot.background = element_rect(fill = 'black'), legend.position = 'none') #> Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0. #> ℹ Please use `linewidth` instead.
Hermann Chernoff (1973). The use of faces to represent points in k-dimensional space graphically. Journal of the American Statistical Association, 68(342), 361–368.
Leland Wilkinson (2006). The Grammar of Graphics (2nd edition). Springer.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4