FACETS
Besides using aesthetics, you can add additional variables to a plot by splitting it up into facets, subplots that each display one subset of the data. Facets are particularly useful for categorical variables.
Use facet_wrap( ) to facet a plot by a single discrete variable. The first argument is a forumla created with “~” followed by variable name. A facet wrap variable should always be discrete.
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy)) +
facet_wrap(~ class, nrow = 2) # Variable is class, "2" puts the subplots on two lines.

Use facet_grid( ) to facet a plot with the combination of two variables. The first argument should contain two variables separated by “~”.
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy)) +
facet_grid(drv ~ cyl) # Two variables separated by "~".

If you don’t want to facet into rows and columns, use “.” instead of a variable name.
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy)) +
facet_grid(. ~ cyl) # No rows or no columns.

GEOMETRIC OBJECTS
A geom is the geometrical object that a plot uses to represent the data. Plots are often described by the geom it uses (e.g., bar geoms, line geoms, boxplot geoms). Scatterplots use the point geom.
The code below takes the mpg dataframe and makes a scatterplot (geom_point).
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy)) # Point geome used for scatterplot

You can change the look of the geome by changing the geome function in your plot. Here are the same data and variables but plotted with a smooth line instead of points. (Note: When geom=“smooth” it’s called a “loess” fit line and confidence limits are added by default (used when there is less than 1000 observations.)
ggplot(data = mpg) +
geom_smooth(mapping = aes(x = displ, y = hwy)) # Smooth geome used for line

Although every geom function in ggplot2 takes a mapping argument, not every aesthetic will work with every geom. For example, you could set the shape of a point but not the “shape” of a line. But you could set the linetype of a line with geom_smooth( ) where it will draw a different line, with a different linetype, for each unique value of the variable that you map to linetype.
In graph below the smooth line is all the data points, the wide dotted line is rear-wheel drive, and narrow dotted line is front-wheel drive. This could be made clearer by overlaying lines on top of raw data and coloring everying according to the drv variable.
ggplot(data = mpg) +
geom_smooth(mapping = aes(x = displ, y = hwy, linetype = drv)) # Different lines for drv values

Some geoms, like geom_smooth( ), use a single geometric object to display multiple rows of data. With these geoms you can set the group aesthetic to a categorical variable to draw multiple objects. ggplot2 will draw a separate object for each unique value of the grouping variable. ggplot2 will automatically group the data for these geoms whenever you map an aesthetic to a discrete variable (as in the linetype example). It is convenient to rely on this feature because the group aesthetic by itself does not add a legend or distinguishing features to the geoms.
ggplot(data = mpg) +
geom_smooth(mapping = aes(x = displ, y = hwy)) # geom_smooth uses single geometric object to display multiple rows of data.

ggplot(data = mpg) +
geom_smooth(mapping = aes(x = displ, y = hwy, group = drv)) # Group aesthetic set to a categorical variable (drive) to draw multiple objects. ggplot2 draws separate object for each unique value of grouping variable.

ggplot(data = mpg) +
geom_smooth(
mapping = aes(x = displ, y = hwy, color = drv), # Diff color for each value of grouping variable.
show.legend = FALSE # No legend
)

To display multiple geoms in the same plot, add multiple geom functions to ggplot():
ggplot(data = mpg) + # The two geome functions below introduces duplication in code.
geom_point(mapping = aes(x = displ, y = hwy)) + # Adds scatterplot and names axes variables.
geom_smooth(mapping = aes(x = displ, y = hwy)) # Now would have to change axis name in two places.

But this introduces some duplication in our code. If we wanted to change the y-axis to show “cty” instead of “hwy” we’d have to change the variable in two places. This can be avoided by passing a set of mappings to ggplot( ). ggplot2 treats them as global mappings that apply to each geom in the graph. This code will then ggproduce the same plot as the previous code:
ggplot(data = mpg, mapping = aes(x = displ, y = hwy)) + # Global mapping here for same axis labels in geome functions.
geom_point() +
geom_smooth()

If you place mappings in a geom function, ggplot2 will treat them as local mappings and use them to extend or overwrite the global mappings for that layer only. This makes it possible to display different aesthetics in different layers.
ggplot(data = mpg, mapping = aes(x = displ, y = hwy)) + # Global mappings.
geom_point(mapping = aes(color = class)) + # This local mapping will overwrite global mapping for this layer (row of code) only.
geom_smooth() # Here smooth line shows full dataset.

You can do the same to specify different data for each layer. Below the smooth line displays a subset of the mpg dataset (subcompact cars). The local data argument in geom_smooth( ) overrides the global data argument in ggplot( ) for that layer only:
ggplot(data = mpg, mapping = aes(x = displ, y = hwy)) + # Global mapping for ggplot
geom_point(mapping = aes(color = class)) + # Local mapping overwrites global mapping for geom_point only.
geom_smooth(data = filter(mpg, class == "subcompact"), se = FALSE) # Local data argument overrides global to show subset of data (subcompact cars).

End.
LS0tCnRpdGxlOiAiRmFjZXRzIGFuZCBHZW9tZXRyaWMgb2JqZWN0cyIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKKioqCiMjIyMgRkFDRVRTCgpCZXNpZGVzIHVzaW5nIGFlc3RoZXRpY3MsIHlvdSBjYW4gYWRkIGFkZGl0aW9uYWwgdmFyaWFibGVzIHRvIGEgcGxvdCBieSBzcGxpdHRpbmcgaXQgdXAgaW50byAqKmZhY2V0cyoqLCBzdWJwbG90cyB0aGF0IGVhY2ggZGlzcGxheSBvbmUgc3Vic2V0IG9mIHRoZSBkYXRhLiBGYWNldHMgYXJlIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIGNhdGVnb3JpY2FsIHZhcmlhYmxlcy4KClVzZSAqKmZhY2V0X3dyYXAoICkqKiB0byBmYWNldCBhIHBsb3QgYnkgYSBzaW5nbGUgZGlzY3JldGUgdmFyaWFibGUuIFRoZSBmaXJzdCBhcmd1bWVudCBpcyBhIGZvcnVtbGEgY3JlYXRlZCB3aXRoICJ+IiBmb2xsb3dlZCBieSB2YXJpYWJsZSBuYW1lLiBBIGZhY2V0IHdyYXAgdmFyaWFibGUgc2hvdWxkIGFsd2F5cyBiZSBkaXNjcmV0ZS4KYGBge3J9CmdncGxvdChkYXRhID0gbXBnKSArIAogIGdlb21fcG9pbnQobWFwcGluZyA9IGFlcyh4ID0gZGlzcGwsIHkgPSBod3kpKSArCiAgZmFjZXRfd3JhcCh+IGNsYXNzLCBucm93ID0gMikgIyBWYXJpYWJsZSBpcyBjbGFzcywgIjIiIHB1dHMgdGhlIHN1YnBsb3RzIG9uIHR3byBsaW5lcy4gIApgYGAKClVzZSAqKmZhY2V0X2dyaWQoICkqKiB0byBmYWNldCBhIHBsb3Qgd2l0aCB0aGUgY29tYmluYXRpb24gb2YgdHdvIHZhcmlhYmxlcy4gVGhlIGZpcnN0IGFyZ3VtZW50IHNob3VsZCBjb250YWluIHR3byB2YXJpYWJsZXMgc2VwYXJhdGVkIGJ5ICJ+Ii4gCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IG1wZykgKyAKICBnZW9tX3BvaW50KG1hcHBpbmcgPSBhZXMoeCA9IGRpc3BsLCB5ID0gaHd5KSkgKyAKICBmYWNldF9ncmlkKGRydiB+IGN5bCkgIyBUd28gdmFyaWFibGVzIHNlcGFyYXRlZCBieSAifiIuIApgYGAKCklmIHlvdSBkb24ndCB3YW50IHRvIGZhY2V0IGludG8gcm93cyBhbmQgY29sdW1ucywgdXNlICIuIiBpbnN0ZWFkIG9mIGEgdmFyaWFibGUgbmFtZS4gCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IG1wZykgKyAKICBnZW9tX3BvaW50KG1hcHBpbmcgPSBhZXMoeCA9IGRpc3BsLCB5ID0gaHd5KSkgKwogIGZhY2V0X2dyaWQoLiB+IGN5bCkgIyBObyByb3dzIG9yIG5vIGNvbHVtbnMuIApgYGAKCioqKiAKCiMjIyMgR0VPTUVUUklDIE9CSkVDVFMgCgpBICoqZ2VvbSoqIGlzIHRoZSBnZW9tZXRyaWNhbCBvYmplY3QgdGhhdCBhIHBsb3QgdXNlcyB0byByZXByZXNlbnQgdGhlIGRhdGEuIFBsb3RzIGFyZSBvZnRlbiBkZXNjcmliZWQgYnkgdGhlIGdlb20gaXQgdXNlcyAoZS5nLiwgYmFyIGdlb21zLCBsaW5lIGdlb21zLCBib3hwbG90IGdlb21zKS4gU2NhdHRlcnBsb3RzIHVzZSB0aGUgcG9pbnQgZ2VvbS4KClRoZSBjb2RlIGJlbG93IHRha2VzIHRoZSBtcGcgZGF0YWZyYW1lIGFuZCBtYWtlcyBhIHNjYXR0ZXJwbG90IChnZW9tX3BvaW50KS4KYGBge3J9CmdncGxvdChkYXRhID0gbXBnKSArIAogIGdlb21fcG9pbnQobWFwcGluZyA9IGFlcyh4ID0gZGlzcGwsIHkgPSBod3kpKSAjIFBvaW50IGdlb21lIHVzZWQgZm9yIHNjYXR0ZXJwbG90IApgYGAKCllvdSBjYW4gY2hhbmdlIHRoZSBsb29rIG9mIHRoZSBnZW9tZSBieSBjaGFuZ2luZyB0aGUgZ2VvbWUgZnVuY3Rpb24gaW4geW91ciBwbG90LiBIZXJlIGFyZSB0aGUgc2FtZSBkYXRhIGFuZCB2YXJpYWJsZXMgYnV0IHBsb3R0ZWQgd2l0aCBhIHNtb290aCBsaW5lIGluc3RlYWQgb2YgcG9pbnRzLiAoTm90ZTogV2hlbiBnZW9tPeKAnHNtb290aOKAnSBpdCdzIGNhbGxlZCBhIOKAnGxvZXNz4oCdIGZpdCBsaW5lIGFuZCBjb25maWRlbmNlIGxpbWl0cyBhcmUgYWRkZWQgYnkgZGVmYXVsdCAodXNlZCB3aGVuIHRoZXJlIGlzIGxlc3MgdGhhbiAxMDAwIG9ic2VydmF0aW9ucy4pCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IG1wZykgKyAKICBnZW9tX3Ntb290aChtYXBwaW5nID0gYWVzKHggPSBkaXNwbCwgeSA9IGh3eSkpICMgU21vb3RoIGdlb21lIHVzZWQgZm9yIGxpbmUKYGBgCgpBbHRob3VnaCBldmVyeSBnZW9tIGZ1bmN0aW9uIGluIGdncGxvdDIgdGFrZXMgYSBtYXBwaW5nIGFyZ3VtZW50LCBub3QgZXZlcnkgYWVzdGhldGljIHdpbGwgd29yayB3aXRoIGV2ZXJ5IGdlb20uIEZvciBleGFtcGxlLCB5b3UgY291bGQgc2V0IHRoZSBzaGFwZSBvZiBhIHBvaW50IGJ1dCBub3QgdGhlICJzaGFwZSIgb2YgYSBsaW5lLiBCdXQgeW91ICpjb3VsZCogc2V0IHRoZSBsaW5ldHlwZSBvZiBhIGxpbmUgd2l0aCAqKmdlb21fc21vb3RoKCApKiogd2hlcmUgaXQgd2lsbCBkcmF3IGEgZGlmZmVyZW50IGxpbmUsIHdpdGggYSBkaWZmZXJlbnQgbGluZXR5cGUsIGZvciBlYWNoIHVuaXF1ZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgdGhhdCB5b3UgbWFwIHRvIGxpbmV0eXBlLiAKCkluIGdyYXBoIGJlbG93IHRoZSBzbW9vdGggbGluZSBpcyAqYWxsKiB0aGUgZGF0YSBwb2ludHMsIHRoZSB3aWRlIGRvdHRlZCBsaW5lIGlzIHJlYXItd2hlZWwgZHJpdmUsIGFuZCBuYXJyb3cgZG90dGVkIGxpbmUgaXMgZnJvbnQtd2hlZWwgZHJpdmUuIFRoaXMgY291bGQgYmUgbWFkZSBjbGVhcmVyIGJ5IG92ZXJsYXlpbmcgbGluZXMgb24gdG9wIG9mIHJhdyBkYXRhIGFuZCBjb2xvcmluZyBldmVyeWluZyBhY2NvcmRpbmcgdG8gdGhlIGRydiB2YXJpYWJsZS4gCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IG1wZykgKyAKICBnZW9tX3Ntb290aChtYXBwaW5nID0gYWVzKHggPSBkaXNwbCwgeSA9IGh3eSwgbGluZXR5cGUgPSBkcnYpKSAjIERpZmZlcmVudCBsaW5lcyBmb3IgZHJ2IHZhbHVlcwpgYGAKClNvbWUgZ2VvbXMsIGxpa2UgZ2VvbV9zbW9vdGgoICksIHVzZSBhIHNpbmdsZSBnZW9tZXRyaWMgb2JqZWN0IHRvIGRpc3BsYXkgbXVsdGlwbGUgcm93cyBvZiBkYXRhLiBXaXRoIHRoZXNlIGdlb21zIHlvdSBjYW4gc2V0IHRoZSBncm91cCBhZXN0aGV0aWMgdG8gYSBjYXRlZ29yaWNhbCB2YXJpYWJsZSB0byBkcmF3IG11bHRpcGxlIG9iamVjdHMuIGdncGxvdDIgd2lsbCBkcmF3IGEgc2VwYXJhdGUgb2JqZWN0IGZvciBlYWNoIHVuaXF1ZSB2YWx1ZSBvZiB0aGUgZ3JvdXBpbmcgdmFyaWFibGUuIGdncGxvdDIgd2lsbCBhdXRvbWF0aWNhbGx5IGdyb3VwIHRoZSBkYXRhIGZvciB0aGVzZSBnZW9tcyB3aGVuZXZlciB5b3UgbWFwIGFuIGFlc3RoZXRpYyB0byBhIGRpc2NyZXRlIHZhcmlhYmxlIChhcyBpbiB0aGUgbGluZXR5cGUgZXhhbXBsZSkuIEl0IGlzIGNvbnZlbmllbnQgdG8gcmVseSBvbiB0aGlzIGZlYXR1cmUgYmVjYXVzZSB0aGUgZ3JvdXAgYWVzdGhldGljIGJ5IGl0c2VsZiBkb2VzIG5vdCBhZGQgYSBsZWdlbmQgb3IgZGlzdGluZ3Vpc2hpbmcgZmVhdHVyZXMgdG8gdGhlIGdlb21zLgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBtcGcpICsKICBnZW9tX3Ntb290aChtYXBwaW5nID0gYWVzKHggPSBkaXNwbCwgeSA9IGh3eSkpICMgZ2VvbV9zbW9vdGggdXNlcyBzaW5nbGUgZ2VvbWV0cmljIG9iamVjdCB0byBkaXNwbGF5IG11bHRpcGxlIHJvd3Mgb2YgZGF0YS4KICAgICAgICAgICAgICAKZ2dwbG90KGRhdGEgPSBtcGcpICsKICBnZW9tX3Ntb290aChtYXBwaW5nID0gYWVzKHggPSBkaXNwbCwgeSA9IGh3eSwgZ3JvdXAgPSBkcnYpKSAjIEdyb3VwIGFlc3RoZXRpYyBzZXQgdG8gYSBjYXRlZ29yaWNhbCB2YXJpYWJsZSAoZHJpdmUpIHRvIGRyYXcgbXVsdGlwbGUgb2JqZWN0cy4gZ2dwbG90MiBkcmF3cyBzZXBhcmF0ZSBvYmplY3QgZm9yIGVhY2ggdW5pcXVlIHZhbHVlIG9mIGdyb3VwaW5nIHZhcmlhYmxlLgogICAgCmdncGxvdChkYXRhID0gbXBnKSArCiAgZ2VvbV9zbW9vdGgoCiAgICBtYXBwaW5nID0gYWVzKHggPSBkaXNwbCwgeSA9IGh3eSwgY29sb3IgPSBkcnYpLCAjIERpZmYgY29sb3IgZm9yIGVhY2ggdmFsdWUgb2YgZ3JvdXBpbmcgdmFyaWFibGUuCiAgICBzaG93LmxlZ2VuZCA9IEZBTFNFICMgTm8gbGVnZW5kCiAgKQpgYGAKClRvIGRpc3BsYXkgbXVsdGlwbGUgZ2VvbXMgaW4gdGhlIHNhbWUgcGxvdCwgYWRkIG11bHRpcGxlIGdlb20gZnVuY3Rpb25zIHRvIGdncGxvdCgpOgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBtcGcpICsgIyBUaGUgdHdvIGdlb21lIGZ1bmN0aW9ucyBiZWxvdyBpbnRyb2R1Y2VzIGR1cGxpY2F0aW9uIGluIGNvZGUuIAogIGdlb21fcG9pbnQobWFwcGluZyA9IGFlcyh4ID0gZGlzcGwsIHkgPSBod3kpKSArICMgQWRkcyBzY2F0dGVycGxvdCBhbmQgbmFtZXMgYXhlcyB2YXJpYWJsZXMuIAogIGdlb21fc21vb3RoKG1hcHBpbmcgPSBhZXMoeCA9IGRpc3BsLCB5ID0gaHd5KSkgIyBOb3cgd291bGQgaGF2ZSB0byBjaGFuZ2UgYXhpcyBuYW1lIGluIHR3byBwbGFjZXMuCmBgYAoKQnV0IHRoaXMgaW50cm9kdWNlcyBzb21lIGR1cGxpY2F0aW9uIGluIG91ciBjb2RlLiBJZiB3ZSB3YW50ZWQgdG8gY2hhbmdlIHRoZSB5LWF4aXMgdG8gc2hvdyAiY3R5IiBpbnN0ZWFkIG9mICJod3kiIHdlJ2QgaGF2ZSB0byBjaGFuZ2UgdGhlIHZhcmlhYmxlIGluIHR3byBwbGFjZXMuIFRoaXMgY2FuIGJlIGF2b2lkZWQgYnkgcGFzc2luZyBhIHNldCBvZiBtYXBwaW5ncyB0byBnZ3Bsb3QoICkuIGdncGxvdDIgdHJlYXRzIHRoZW0gYXMgKmdsb2JhbCBtYXBwaW5ncyogdGhhdCBhcHBseSB0byBlYWNoIGdlb20gaW4gdGhlIGdyYXBoLiBUaGlzIGNvZGUgd2lsbCB0aGVuIGdncHJvZHVjZSB0aGUgc2FtZSBwbG90IGFzIHRoZSBwcmV2aW91cyBjb2RlOgpgYGB7cn0KZ2dwbG90KGRhdGEgPSBtcGcsIG1hcHBpbmcgPSBhZXMoeCA9IGRpc3BsLCB5ID0gaHd5KSkgKyAjIEdsb2JhbCBtYXBwaW5nIGhlcmUgZm9yIHNhbWUgYXhpcyBsYWJlbHMgaW4gZ2VvbWUgZnVuY3Rpb25zLgogIGdlb21fcG9pbnQoKSArIAogIGdlb21fc21vb3RoKCkKYGBgCgpJZiB5b3UgcGxhY2UgbWFwcGluZ3MgaW4gYSBnZW9tIGZ1bmN0aW9uLCBnZ3Bsb3QyIHdpbGwgdHJlYXQgdGhlbSBhcyBsb2NhbCBtYXBwaW5ncyBhbmQgdXNlIHRoZW0gdG8gZXh0ZW5kIG9yIG92ZXJ3cml0ZSB0aGUgZ2xvYmFsIG1hcHBpbmdzICpmb3IgdGhhdCBsYXllciBvbmx5Ki4gVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBkaXNwbGF5IGRpZmZlcmVudCBhZXN0aGV0aWNzIGluIGRpZmZlcmVudCBsYXllcnMuCmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IG1wZywgbWFwcGluZyA9IGFlcyh4ID0gZGlzcGwsIHkgPSBod3kpKSArICMgR2xvYmFsIG1hcHBpbmdzLgogIGdlb21fcG9pbnQobWFwcGluZyA9IGFlcyhjb2xvciA9IGNsYXNzKSkgKyAgIyBUaGlzIGxvY2FsIG1hcHBpbmcgd2lsbCBvdmVyd3JpdGUgZ2xvYmFsIG1hcHBpbmcgZm9yIHRoaXMgbGF5ZXIgKHJvdyBvZiBjb2RlKSBvbmx5LiAKICBnZW9tX3Ntb290aCgpICMgSGVyZSBzbW9vdGggbGluZSBzaG93cyBmdWxsIGRhdGFzZXQuCmBgYAoKWW91IGNhbiBkbyB0aGUgc2FtZSB0byBzcGVjaWZ5IGRpZmZlcmVudCAqZGF0YSogZm9yIGVhY2ggbGF5ZXIuIEJlbG93IHRoZSBzbW9vdGggbGluZSBkaXNwbGF5cyBhIHN1YnNldCBvZiB0aGUgbXBnIGRhdGFzZXQgKHN1YmNvbXBhY3QgY2FycykuIFRoZSBsb2NhbCBkYXRhIGFyZ3VtZW50IGluIGdlb21fc21vb3RoKCApIG92ZXJyaWRlcyB0aGUgZ2xvYmFsIGRhdGEgYXJndW1lbnQgaW4gZ2dwbG90KCApIGZvciB0aGF0IGxheWVyIG9ubHk6CmBgYHtyfQpnZ3Bsb3QoZGF0YSA9IG1wZywgbWFwcGluZyA9IGFlcyh4ID0gZGlzcGwsIHkgPSBod3kpKSArICMgR2xvYmFsIG1hcHBpbmcgZm9yIGdncGxvdAogIGdlb21fcG9pbnQobWFwcGluZyA9IGFlcyhjb2xvciA9IGNsYXNzKSkgKyAjIExvY2FsIG1hcHBpbmcgb3ZlcndyaXRlcyBnbG9iYWwgbWFwcGluZyBmb3IgZ2VvbV9wb2ludCBvbmx5LgogIGdlb21fc21vb3RoKGRhdGEgPSBmaWx0ZXIobXBnLCBjbGFzcyA9PSAic3ViY29tcGFjdCIpLCBzZSA9IEZBTFNFKSAjIExvY2FsIGRhdGEgYXJndW1lbnQgb3ZlcnJpZGVzIGdsb2JhbCB0byBzaG93IHN1YnNldCBvZiBkYXRhIChzdWJjb21wYWN0IGNhcnMpLgpgYGAKCkVuZC4=