Principles of ggplot2: Understanding Components

Unlike many other charting libraries, ggplot2 doesn’t provide functions for specific chart types like scatterplot() orboxplot(). Instead, it follows the grammar of graphics: a structured yet flexible approach where plots are built from components like sentences from words.

Let’s look at how this “sentence-building” approach works — and why it’s such a powerful way to visualize data!

Free6 minutes read

🌱 What Makes ggplot2 Tick?

Before ggplot2, most R charts were built using base R graphics — a capable system with many functions, each tailored to a specific chart type.

For example, here’s how you might create a boxplot, histogram, or scatterplot in base R from the dataset.

ggplot2, however, takes a fundamentally different approach. Inspired by the Grammar of Graphics, it doesn’t ask you to pick a chart type and then fill in options.

Instead, you build a plot by combining components — such as data, aesthetics, layers, and scales — in a structured, sentence-like way.

Here’s the shift in mindset — traditionally, you might simply think:

“Make a bar chart of sales by region and products.”

That description could mean many things — the key issue is there’s little control or certainty about how the final visualization will look.

With ggplot2, we think in components:

“Using the sales data, put region on the x-axis, sales on the y-axis, and group bars by product with a unique color for each region.”



While this approach may seem more complex at first, it unlocks far greater flexibility and expressiveness to design your visual story. You’re no longer limited to predefined chart types — you can combine elements freely to create and combine (or even invent) the visualizations you need.

Let’s explore how this works in practice 🧑‍💻

🧱 Building Plots Like Sentences

ggplot2 consists of seven key components that work together to create a chart, each serving a distinct purpose.

The first three components are essential — you cannot create a chart without them. The remaining four allow you to customize and refine your plot's appearance, structure, and overall presentation.

Let's explore each component in detail!

🔤 Essential Building Blocks


The data is the foundation of your chart — after all, there's no data visualization without data!

In R, this is typically a data.frame or tibble. The dataset is usually passed to the initial ggplot() call.



With these three core building blocks, you have everything you need to create a meaningful graph. The syntax remains consistent and follows this pattern:

  ggplot(data) +
    aes(x, y) +
    geom_drawsomething()


Now that we understand the basic structure, let's look at a real-world example:

Feel free to experiment with this example!

What happens when you use geom_boxplot() or stat_summary() instead of geom_point()? Or when you map a different variable like Month instead of Temp?

You can even add a new aesthetic — try mapping Wind or Solar.R to the color aesthetic!

You feel lost? Look here 👇

geom_boxplot() only shows one boxplot?

That’s because the variable on the x-axis — Temp — is numerical (continuous). ggplot2 doesn’t automatically group or “bin” continuous variables for boxplots. So instead of multiple boxplots, you get just one for the entire range of temperatures.

But you can create groups yourself by cutting the temperature into intervals using cut() inside the aesthetics:

  • cut(Temp, breaks = 5) splits the temperature range into 5 equal-width bins.

  • cut(Temp, breaks = seq(50, 100, by = 10)) lets you define your own intervals.




I don't get what stat_summary() is doing.

When you use two numerical variables, stat_summary() treats the x variable as a grouping variable and calculates summary statistics for the y values within each group. By default, it shows a pointrange displaying the mean ± one standard error.

You’ll explore more about stat_* functions — and how to customize these summaries — in the lesson on statistical layers.





I struggle to put Month on the x-axis.

To plot a different variable, just change the one mapped to the x aesthetic. In this case, swap Temp with Month:

Since Month is stored as integer values (whole numbers), the result is what we’d call a dot strip plot: vertical stacks of points, one per month.





How do I add the color mapping?

You can map another variable to color by passing a column name to the color argument inside aes().

For example, to color the points by wind speed, add color = Wind:

This creates a continuous color scale: darker or lighter colors indicate different wind speeds. The default uses a gradient of blues.

You’ll learn more about mapping variables to visual properties like color, size, or shape in the lesson on aesthetics.





📚 Completing the Sentence

Beyond the essential building blocks, ggplot2 automatically includes additional components with sensible defaults.

This means you can start plotting without explicitly specifying these components. However, as your needs grow, you can easily customize or modify these default settings to achieve your desired look and behavior.

Let's explore these components:


Scales let you fine-tune how data is shown: you can customize visual representation (like color palettes, shapes, or labels), modify axes, and control legend behavior.

You can override the defaults by adding scale_* functions. For instance, adding scale_y_log10() to the graph below applied a log scale to the y-axis! 🔥

🧩 The puzzle is complete!

You've now learned all the essential building blocks for creating beautiful visualizations with ggplot2 🎉

You can add each component as needed — whether you keep it simple or build complex layers, the choice is yours.

The grammar remains consistent, even as your visual story evolves 🙌


Next, we'll work through some exercises to help you apply what you've learned. After that, we'll explore each component in detail — one piece at a time.

🏆 Exercises

The best way to truly understand these concepts is to work through real-world examples.

Let's get started!


← Previous

Why R and ggplot2?

Next →

Aesthetics: Fundamentals