Variables in diamonds dataset includes the price, carat, color, clarity, and cut of each diamond (~54K). The chart below shows that more high quality cut diamonds are available than low quality. Count is shown on y axis, but count is not a variable. Unlike scatterplots that plot raw values of dataset, bar charts bin data and plot the bin counts–the number of points that fall in each bin. The algorithm used to calculate new values for a graph is called a stat (short for statistical transformation–see 3.7 in book).

ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut))

Find what stat a geom uses by checking the default value for the stat argument; for geom_bar the deafult stat is stat_count( ). A description of how stat was computed is at bottom of ?geom_bar in section “Computed Variables” where the two new variables are count (the number of points in bin), and prop (groupwise proportion). The height of a stat_count bar chart is generated by counting rows.

Most of the time you can use geoms and stats interchangeably. The code below will therefore produce the same graph.

ggplot(data = diamonds) + 
  stat_count(mapping = aes(x = cut)) # Uses stat argument instead of geom_bar function.

When to use a stat argument instead of relying on a geom function

  1. You need to override default stat. For example, you may need to map the height of bars to a y variable (individual values) instead of bins.
demo <- tribble(
  ~cut,         ~freq,
  "Fair",       1610,
  "Good",       4906,
  "Very Good",  12082,
  "Premium",    13791,
  "Ideal",      21551
)
ggplot(data = demo) +
  geom_bar(mapping = aes(x = cut, y = freq), stat = "identity") # Default stat of geom_bar is changed from count (defualt) to identity.

  1. You need to override the default mapping from transformed variables to aesthetics. For example, you might want to display a bar chart of proportion, rather than count:
ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut, y = ..prop.., group = 1))

  1. You need to draw greater attention to the statistical transformation in your code. For example, you might use stat_summary( ), which summarises the y values for each unique x value, to draw attention to the summary that you’re computing:
ggplot(data = diamonds) + 
  stat_summary(
    mapping = aes(x = cut, y = depth),
    fun.ymin = min,
    fun.ymax = max,
    fun.y = median
  )

ggplot2 provides over 20 stats for you to use. Each stat is a function, so you can get help in the usual way, e.g. ?stat_bin. See the ggplot2 cheatsheet for a complete list of stats.

End.

?stat_summary
ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut, y = ..prop..))

ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut, fill = color, y = ..prop..))

ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut, y = ..prop..))

ggplot(data = diamonds) + 
  geom_bar(mapping = aes(x = cut, y = ..prop.., group = 0))

LS0tCnRpdGxlOiAiU3RhdGlzdGljYWwgdHJhbnNmb3JtYXRpb25zIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgoqKioKClZhcmlhYmxlcyBpbiBkaWFtb25kcyBkYXRhc2V0IGluY2x1ZGVzIHRoZSBwcmljZSwgY2FyYXQsIGNvbG9yLCBjbGFyaXR5LCBhbmQgY3V0IG9mIGVhY2ggZGlhbW9uZCAofjU0SykuIFRoZSBjaGFydCBiZWxvdyBzaG93cyB0aGF0IG1vcmUgaGlnaCBxdWFsaXR5IGN1dCBkaWFtb25kcyBhcmUgYXZhaWxhYmxlIHRoYW4gbG93IHF1YWxpdHkuIENvdW50IGlzIHNob3duIG9uIHkgYXhpcywgYnV0IGNvdW50IGlzIG5vdCBhIHZhcmlhYmxlLiBVbmxpa2Ugc2NhdHRlcnBsb3RzIHRoYXQgcGxvdCByYXcgdmFsdWVzIG9mIGRhdGFzZXQsICoqYmFyIGNoYXJ0cyoqIGJpbiBkYXRhIGFuZCBwbG90IHRoZSBiaW4gY291bnRzLS10aGUgbnVtYmVyIG9mIHBvaW50cyB0aGF0IGZhbGwgaW4gZWFjaCBiaW4uIFRoZSBhbGdvcml0aG0gdXNlZCB0byBjYWxjdWxhdGUgbmV3IHZhbHVlcyBmb3IgYSBncmFwaCBpcyBjYWxsZWQgYSAqKnN0YXQqKiAoc2hvcnQgZm9yIHN0YXRpc3RpY2FsIHRyYW5zZm9ybWF0aW9uLS1zZWUgMy43IGluIGJvb2spLgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBkaWFtb25kcykgKyAKICBnZW9tX2JhcihtYXBwaW5nID0gYWVzKHggPSBjdXQpKQpgYGAKCkZpbmQgd2hhdCBzdGF0IGEgZ2VvbSB1c2VzIGJ5IGNoZWNraW5nIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgc3RhdCBhcmd1bWVudDsgZm9yIGdlb21fYmFyIHRoZSBkZWFmdWx0IHN0YXQgaXMgKipzdGF0X2NvdW50KCApKiouIEEgZGVzY3JpcHRpb24gb2YgaG93IHN0YXQgd2FzIGNvbXB1dGVkIGlzIGF0IGJvdHRvbSBvZiA/Z2VvbV9iYXIgaW4gc2VjdGlvbiAiQ29tcHV0ZWQgVmFyaWFibGVzIiB3aGVyZSB0aGUgdHdvIG5ldyB2YXJpYWJsZXMgYXJlICpjb3VudCogKHRoZSBudW1iZXIgb2YgcG9pbnRzIGluIGJpbiksIGFuZCAqcHJvcCogKGdyb3Vwd2lzZSBwcm9wb3J0aW9uKS4gKipUaGUgaGVpZ2h0IG9mIGEgc3RhdF9jb3VudCBiYXIgY2hhcnQgaXMgZ2VuZXJhdGVkIGJ5IGNvdW50aW5nIHJvd3MqKi4gIAoKTW9zdCBvZiB0aGUgdGltZSB5b3UgY2FuIHVzZSBnZW9tcyBhbmQgc3RhdHMgaW50ZXJjaGFuZ2VhYmx5LiBUaGUgY29kZSBiZWxvdyB3aWxsIHRoZXJlZm9yZSBwcm9kdWNlIHRoZSBzYW1lIGdyYXBoLgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBkaWFtb25kcykgKyAKICBzdGF0X2NvdW50KG1hcHBpbmcgPSBhZXMoeCA9IGN1dCkpICMgVXNlcyBzdGF0IGFyZ3VtZW50IGluc3RlYWQgb2YgZ2VvbV9iYXIgZnVuY3Rpb24uCmBgYAoKIyMjIyBXaGVuIHRvIHVzZSBhIHN0YXQgYXJndW1lbnQgaW5zdGVhZCBvZiByZWx5aW5nIG9uIGEgZ2VvbSBmdW5jdGlvbgoKMS4gWW91IG5lZWQgdG8gb3ZlcnJpZGUgZGVmYXVsdCBzdGF0LiBGb3IgZXhhbXBsZSwgeW91IG1heSBuZWVkIHRvIG1hcCB0aGUgaGVpZ2h0IG9mIGJhcnMgdG8gYSB5IHZhcmlhYmxlIChpbmRpdmlkdWFsIHZhbHVlcykgaW5zdGVhZCBvZiBiaW5zLgpgYGB7cn0KZGVtbyA8LSB0cmliYmxlKAogIH5jdXQsICAgICAgICAgfmZyZXEsCiAgIkZhaXIiLCAgICAgICAxNjEwLAogICJHb29kIiwgICAgICAgNDkwNiwKICAiVmVyeSBHb29kIiwgIDEyMDgyLAogICJQcmVtaXVtIiwgICAgMTM3OTEsCiAgIklkZWFsIiwgICAgICAyMTU1MQopCgpnZ3Bsb3QoZGF0YSA9IGRlbW8pICsKICBnZW9tX2JhcihtYXBwaW5nID0gYWVzKHggPSBjdXQsIHkgPSBmcmVxKSwgc3RhdCA9ICJpZGVudGl0eSIpICMgRGVmYXVsdCBzdGF0IG9mIGdlb21fYmFyIGlzIGNoYW5nZWQgZnJvbSBjb3VudCAoZGVmdWFsdCkgdG8gaWRlbnRpdHkuCmBgYAoKMi4gWW91IG5lZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgbWFwcGluZyBmcm9tIHRyYW5zZm9ybWVkIHZhcmlhYmxlcyB0byBhZXN0aGV0aWNzLiBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IHdhbnQgdG8gZGlzcGxheSBhIGJhciBjaGFydCBvZiBwcm9wb3J0aW9uLCByYXRoZXIgdGhhbiBjb3VudDoKYGBge3J9CmdncGxvdChkYXRhID0gZGlhbW9uZHMpICsgCiAgZ2VvbV9iYXIobWFwcGluZyA9IGFlcyh4ID0gY3V0LCB5ID0gLi5wcm9wLi4sIGdyb3VwID0gMSkpCmBgYAoKMy4gWW91IG5lZWQgdG8gZHJhdyBncmVhdGVyIGF0dGVudGlvbiB0byB0aGUgc3RhdGlzdGljYWwgdHJhbnNmb3JtYXRpb24gaW4geW91ciBjb2RlLiBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IHVzZSAqKnN0YXRfc3VtbWFyeSggKSoqLCB3aGljaCBzdW1tYXJpc2VzIHRoZSB5IHZhbHVlcyBmb3IgZWFjaCB1bmlxdWUgeCB2YWx1ZSwgdG8gZHJhdyBhdHRlbnRpb24gdG8gdGhlIHN1bW1hcnkgdGhhdCB5b3XigJlyZSBjb21wdXRpbmc6CgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBkaWFtb25kcykgKyAKICBzdGF0X3N1bW1hcnkoCiAgICBtYXBwaW5nID0gYWVzKHggPSBjdXQsIHkgPSBkZXB0aCksCiAgICBmdW4ueW1pbiA9IG1pbiwKICAgIGZ1bi55bWF4ID0gbWF4LAogICAgZnVuLnkgPSBtZWRpYW4KICApCmBgYAoKZ2dwbG90MiBwcm92aWRlcyBvdmVyIDIwIHN0YXRzIGZvciB5b3UgdG8gdXNlLiBFYWNoIHN0YXQgaXMgYSBmdW5jdGlvbiwgc28geW91IGNhbiBnZXQgaGVscCBpbiB0aGUgdXN1YWwgd2F5LCBlLmcuID9zdGF0X2Jpbi4gU2VlIHRoZSBnZ3Bsb3QyIGNoZWF0c2hlZXQgZm9yIGEgY29tcGxldGUgbGlzdCBvZiBzdGF0cy4KCkVuZC4KCmBgYHtyfQo/c3RhdF9zdW1tYXJ5CmBgYAoKYGBge3J9CmdncGxvdChkYXRhID0gZGlhbW9uZHMpICsgCiAgZ2VvbV9iYXIobWFwcGluZyA9IGFlcyh4ID0gY3V0LCB5ID0gLi5wcm9wLi4pKQpnZ3Bsb3QoZGF0YSA9IGRpYW1vbmRzKSArIAogIGdlb21fYmFyKG1hcHBpbmcgPSBhZXMoeCA9IGN1dCwgZmlsbCA9IGNvbG9yLCB5ID0gLi5wcm9wLi4pKQpgYGAKCgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBkaWFtb25kcykgKyAKICBnZW9tX2JhcihtYXBwaW5nID0gYWVzKHggPSBjdXQsIHkgPSAuLnByb3AuLikpCmBgYApgYGB7cn0KZ2dwbG90KGRhdGEgPSBkaWFtb25kcykgKyAKICBnZW9tX2JhcihtYXBwaW5nID0gYWVzKHggPSBjdXQsIHkgPSAuLnByb3AuLiwgZ3JvdXAgPSAwKSkKYGBgCgoK