emoji on cups next to the laptop

Using emojis and .png as icons in your ggplot

Jakob Gepp Blog

Nearly one year ago, I analyzed how we use emojis in our Slack messages. Since then, STATWORX grew, and we are a lot more people now! So, I just wanted to check if something changed.

Last time, I did not show our custom emojis, since they are, of course, not available in the fonts I used. This time, I will incorporate them with geom_image(). It is part of the ggimage package from Guangchuang Yu, which you can find here on his Github. With geom_image() you can include images like .png files to your ggplot.

What changed since last year?

Let’s first have a look at the amount of emojis we are using. In the plot below, you can see that since my last analysis in October 2018 (red line) the amount of emojis is rising. Not as much as I thought it would, but compared to the previous period, we now have more days with a usage of over 100 emojis per day!

Like last time, our top emoji is 👍, followed by 😂 and 😄. But sneaking in at number ten is one of our custom emojis: party_hat_parrot!


How to include custom images?

In my previous blogpost, I hid all our custom emojis behind❓since they were not part of the font. It did not occur to me to use their images, even though the package is from the same creator! So, to make up for my ignorance, I grabbed the top 30 custom emojis and downloaded their images from our Slack servers, saved them as .png and made sure they are all roughly the same size.

To use geom_image() I just added the path of the images to my data (the 
 are just an abbreviation for the complete path).

1:         alnatura   25       63 .../custom/alnatura.png
2:             blog   19       20 .../custom/blog.png
3:           dataiku   15       22 .../custom/dataiku.png
4: dealwithit_parrot     3     100 .../custom/dealwithit_parrot.png
5:     deananddavid   31       18 .../custom/deananddavid.png

This would have been enough to just add the images now, but since I wanted the NAME attribute as a label, I included geom_text_repel from the ggrepel library. This makes handling of non-overlapping labels much simpler!

ggplot(custom_dt, aes( x = REACTION, y = COUNT, label = NAME)) +
  geom_image(aes(image = IMAGE), size = 0.04) +
  geom_text_repel(point.padding = 0.9, segment.alpha = 0) +
  xlab("as reaction") +
  ylab("within message") +

Usually, if a label is «too far» away from the marker, geom_text_repel includes a line to indicate where the labels belong. Since these lines would overlap the images, I used segment.alpha = 0 to make them invisible. With point.padding = 0.9 I gave the labels a bit more space, so it looks nicer. Depending on the size of the plot, this needs to be adjusted. In the plot, one can see our usage of emojis within a message (y-axis) and as a reaction (x-axis).

To combine the emoji font and custom emojis, I used the following data and code — really
 why did I not do this last time? đŸ€” Since the UNICODE is NA when I want to use the IMAGE, there is no «double plotting».

1:                   :+1:     1090     0 1090     1 \U0001f44d
2:                   :joy:     609   152 761     2 \U0001f602
3:                 :smile:       91   496 587     3 \U0001f604
4:                   :-1:     434     9 443     4 \U0001f44e
5:                 :tada:     346   38 384     5 \U0001f389
6:                 :fire:     274   17 291     6 \U0001f525
7: :slightly_smiling_face:       1   250 251     7 \U0001f642
8:                 :wink:       27   191 218     8 \U0001f609
9:                 :clap:     201   13 214     9 \U0001f44f
10:     :party_hat_parrot:     192     9 201   10       <NA> .../custom/party_hat_parrot.png
ggplot(plotdata2, aes(x = PLACE, y = SUM, label = UNICODE)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  geom_text(family="EmojiOne") +
  xlab("Most popular emojis") +
  ylab("Number of usage") +
  scale_fill_brewer(palette = "Paired") +
  geom_image(aes(image = IMAGE), size = 0.04) +
ps = grid.export(paste0(main_path, "plots/top-10-used-emojis.svg"), addClass=T)

The meaning behind emojis

Now we know what our top emojis are. But what is the rest of the world doing? Thanks to Emojimore for providing me with this overview! On their site, you can find meanings for a lot more emojis.

Behind each of our custom emojis is a story as well. For example, all the food emojis are helping us every day to decide where to eat and provide information on what everyone is planning for lunch! And if you do not agree with the decision, just react with sadphan to let the others know about your feelings. If you want to know the whole stories behind all custom emojis or even help create new ones, then maybe you should join our team — check out our available job offers here!

Über den Autor

Jakob Gepp

Numbers were always my passion and as a data scientist and a statistician at STATWORX I can fullfill my nerdy needs. Also I am responsable for our blog. So if you have any questions or suggestions, just send me an email!


is a consulting company for data science, statistics, machine learning and artificial intelligence located in Frankfurt, Zurich and Vienna. Sign up for our NEWSLETTER and receive reads and treats from the world of data science and AI. If you have questions or suggestions, please write us an e-mail addressed to blog(at)statworx.com.