Jonas Stein
Jonas Stein

Reputation: 7043

Force the origin to start at 0

How can I set the origin / interception of the y-axis and x-axis in ggplot2?

The line of the x-axis should be exactly at y=Z.

With Z=0 or another given value.

Upvotes: 207

Views: 277435

Answers (4)

Quinten
Quinten

Reputation: 41225

Another option is using coord_cartesian with expand = FALSE. The limits are taken from the data or based on your limits. Here is a reproducible example:

df <- data.frame(x = 1:5, y = 1:5)

library(ggplot2)
p <- ggplot(df, aes(x, y)) + geom_point()
p <- p + expand_limits(x = 0, y = 0)
p + coord_cartesian(expand = FALSE)

Created on 2022-11-26 with reprex v2.0.2

You could also specify the limits in coord_cartesian directly like this:

df <- data.frame(x = 1:5, y = 1:5)

library(ggplot2)
p <- ggplot(df, aes(x, y)) + geom_point()
p + coord_cartesian(expand = FALSE, xlim = c(0, NA), ylim = c(0, NA))

Created on 2022-11-26 with reprex v2.0.2

Upvotes: 6

Shixiang Wang
Shixiang Wang

Reputation: 2371

In the latest version of ggplot2, this can be more easy.

p <- ggplot(mtcars, aes(wt, mpg))
p + geom_point()
p+ geom_point() + scale_x_continuous(expand = expansion(mult = c(0, 0))) + scale_y_continuous(expand = expansion(mult = c(0, 0)))

enter image description here

See ?expansion() for more details.

Upvotes: 9

stevec
stevec

Reputation: 52218

Simply add these to your ggplot:

+ scale_x_continuous(expand = c(0, 0), limits = c(0, NA)) + 
  scale_y_continuous(expand = c(0, 0), limits = c(0, NA))

Example

df <- data.frame(x = 1:5, y = 1:5)
p <- ggplot(df, aes(x, y)) + geom_point()
p <- p + expand_limits(x = 0, y = 0)
p # not what you are looking for


p + scale_x_continuous(expand = c(0, 0), limits = c(0,NA)) + 
  scale_y_continuous(expand = c(0, 0), limits = c(0, NA))

enter image description here

Lastly, take great care not to unintentionally exclude data off your chart. For example, a position = 'dodge' could cause a bar to get left off the chart entirely (e.g. if its value is zero and you start the axis at zero), so you may not see it and may not even know it's there. I recommend plotting data in full first, inspect, then use the above tip to improve the plot's aesthetics.

Upvotes: 43

A5C1D2H2I1M1N2O1R2T1
A5C1D2H2I1M1N2O1R2T1

Reputation: 193507

xlim and ylim don't cut it here. You need to use expand_limits, scale_x_continuous, and scale_y_continuous. Try:

df <- data.frame(x = 1:5, y = 1:5)
p <- ggplot(df, aes(x, y)) + geom_point()
p <- p + expand_limits(x = 0, y = 0)
p # not what you are looking for

enter image description here

p + scale_x_continuous(expand = c(0, 0)) + scale_y_continuous(expand = c(0, 0))

enter image description here

You may need to adjust things a little to make sure points are not getting cut off (see, for example, the point at x = 5 and y = 5.

Upvotes: 273

Related Questions