Skip to content
R for the Rest of Us Logo

Fundamentals of R

Setting x and y Scales

Transcript

Click on the transcript to go to that point in the video. Please note that transcripts are auto generated and may contain minor inaccuracies.

View code shown in video
# Load Packages -----------------------------------------------------------

library(tidyverse)

# Import Data -------------------------------------------------------------

penguins <- read_csv("penguins.csv")
			
penguin_bill_length_by_island <-
	penguins |>
	drop_na(bill_length_mm) |>
	group_by(island) |>
	summarize(mean_bill_length = mean(bill_length_mm))
			
# Setting x and y Scales --------------------------------------------------

# Adjusting our x and y axes is similar. 
# Remember that the x and y axes are considered an aesthetic properties 
# in the same way color and fill are.

# We adjust our x and y axes using the scale_ set of functions. 
# The exact function you use depends on your data. 
# For example, you would use scale_y_continuous() 
# if you have continuous data on the y axis.

# The limits argument sets the minimum and maximum values that display.

ggplot(data = penguin_bill_length_by_island,
       mapping = aes(x = island,
                     y = mean_bill_length,
                     fill = island)) +
  geom_col() +
  scale_y_continuous(limits = c(0, 50))

# The breaks argument determines which axis labels show up.

ggplot(data = penguin_bill_length_by_island,
       mapping = aes(x = island,
                     y = mean_bill_length,
                     fill = island)) +
  geom_col() +
  scale_y_continuous(limits = c(0, 50),
                     breaks = c(0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50))

# If we want to change the x axis labels, we'd need to use 
# the labels argument in scale_x_discrete() because that data is categorical. 

ggplot(data = penguin_bill_length_by_island,
       mapping = aes(x = island,
                     y = mean_bill_length,
                     fill = island)) +
  geom_col() +
  scale_y_continuous(limits = c(0, 50),
                     breaks = c(0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50)) +
  scale_x_discrete(labels = c("Biscoe Island", 
                              "Dream Island",
                              "Torgersen Island"))

Your Turn

# Load Packages -----------------------------------------------------------

library(tidyverse)

# Import Data -------------------------------------------------------------

penguins <- read_csv("penguins.csv")

# Setting x and y Scales --------------------------------------------------

# Copy the code for the last bar chart you made
# Update it so that the y axis goes from 0 to 200

# YOUR CODE HERE

# Copy the code you just wrote
# Update it so that it has breaks on the y axis at 0, 40, 80, 120, and 160

# YOUR CODE HERE

Have any questions? Put them below and we will help you out!

You need to be signed-in to comment on this post. Login.

Maria Montenegro

Maria Montenegro • April 8, 2024

Hello! What does the c mean in the functions? example: limits= c(0,50). Wondering if it stands for something specific that can help me remember why it goes there, it doesn't seem intuitive to me.

I am also wondering if there is a way to edit breaks that is more efficient than entering the values one by one. Is there a way to specify what in excel is called the axis' units?

David Keyes

David Keyes Founder • April 8, 2024

The c() function combines multiple values. I think of it as "combine" in my head (though I'm not sure that's what its developers would actually call it). In this case, it means combine 0 and 50 so that 0 is the low value and 50 is the high value. Does that help?

Acarilia Eduardo

Acarilia Eduardo • October 1, 2024

Why does the exercise asks the y- axis to be set to go to 200, and the code in the solution sets it to go to 200? Am I reading it wrong? Thanks

Gracielle Higino

Gracielle Higino Coach • October 1, 2024

Thanks for pointing that out, Acarilia! We fixed it and now the code shows the right value. 😉

Gaurab Pradhan

Gaurab Pradhan • March 18, 2025

What if I want dont want to show scale in y-axis? insted display the data level for each bar?

Gaurab Pradhan

Gaurab Pradhan • March 18, 2025

also how to update the x-axis and y axis title?

Gracielle Higino

Gracielle Higino Coach • March 18, 2025

Hi Gaurab! I think what you're looking for is the scale_x_discrete layer. If your data is continuous and you want to display categories, you'll need to create these first (you can use mutate combined with case_when, for example, to create these categories).

To update the axis title, you can add a theme layer with element_blank for the x and/or y titles, like this:

theme(axis.title.x = element_blank())
Mike LeVan

Mike LeVan • March 21, 2025

Hi,

I'm looking at the last two graphs and something odd is happening. I can see that the scales themselves are changing, but the heights of the bars are not. So when I run the first command the Adelie bar looks to be about height a little over 150 but when I run the second command the shape of the graph does not change but the scale does and that makes the bar look to be height a little over 120. It appears the numbers listed as the scale on the y-axis are changing, but the graph itself is not adjusting.

Gracielle Higino

Gracielle Higino Coach • March 21, 2025

Hi Mike! That's correct: the thing is the point of reference. The bar ends exactly at the same point, but because the numbers in the axes are different, we get the impression that the bars end at different points.

Try adding a horizontal lines at 120 and 150 to visualize that:

ggplot(data = penguins_by_species,
       mapping = aes(x = species,
                     y = n,
                     fill = species)) +
  geom_col() +
  scale_fill_viridis_d() +
  scale_y_continuous(limits = c(0, 200)) +
  # scale_y_continuous(limits = c(0, 200),
  #                    breaks = c(0, 40, 80, 120, 160)) +
  # scale_y_continuous(limits = c(0, 200),
  #                    breaks = seq(0, 200, 10)) +
  geom_hline(yintercept = c(120, 150), color = "red")

Run the code with the different scales, one at a time, and use the left and right arrows on the plot panel to navigate the plots and see the difference. [= I suggest popping out the plots panel (you can do that by clicking on the "zoom" button there) to make it bigger and easier to see the scales.

Mike LeVan

Mike LeVan • March 22, 2025

Hi,

Is there a way to attach an image to a message? Here is a Google link to my image :

Original Image: https://drive.google.com/file/d/17wVn6fGb1VNiBmDQx3cUrwKc68WE_e9H/view?usp=sharing

Image with horizontal lines at 120 and 150 : https://drive.google.com/file/d/1VXLwvAfp_vFVXR6sVEPMIFXSmTGNdI8U/view?usp=sharing

I see what you are saying about the bars, but that doesn't get around the fact that the vertical axis is not correct. This can lead to wrong conclusions. I don't understand the point of a command that will change the scale of the vertical axis without changing the data as well.

Obviously I can take out the scale_y_continuous command and the visualization is fine. I am just trying to wrap my head around the command to make it make sense.

ggplot(penguins_by_species, aes(x=species, 
                                y=n, 
                                fill=species,
                                label = n)) +
  geom_bar(stat="identity") +
  scale_fill_viridis_d() +
  scale_y_continuous(limits = c(0,200),
                     labels = c(0, 40, 80, 120, 160)) +
  geom_label(vjust=1.5, color="white") +
  geom_hline(yintercept = c(120, 150), color = "red")

Thanks, Mike

Gracielle Higino

Gracielle Higino Coach • March 22, 2025

Hey Mike! Thanks for expanding on this and sending your code! I've found a "bug" on your code and it completely makes sense now!

You're using a labels argument inside the scale_y_continuous layer - this is a way for you to set whatever text you want on the breaks of the y axis. Instead, the original code uses the breaks arguments, which shows or hides specific breaks in the scale shown in the y axis. Try adding this layer to your plot to see the mess it can make, and then try commenting out the labels argument:

  scale_y_continuous(limits = c(0, 200), 
                     labels = c(0, "forty", 160, "top"),
                     breaks = c(0, 40, 120, 160)) +
Da'Shon Carr

Da'Shon Carr • March 26, 2025

I created a horizontal chart and noticed that you could add coord_flip, as David mentioned in his previous lessons.

ggplot(data = penguins_by_species, mapping = aes(x = species, y = n, fill = species)) + geom_col() + scale_fill_viridis_d(option = "F") + scale_y_continuous(limits = c(0, 200), breaks = c(0,40,80,120,160)) + coord_flip()

I played around with the scale_x_continous, too, and it seems to work:

ggplot(data = penguins_by_species, mapping = aes(x = n, y = species, fill = species)) + geom_col() + scale_fill_viridis_d(option = "F") + scale_x_continuous(limits = c(0, 200), breaks = c(0,20,40,60,100, 120, 140, 160))