JPD
JPD

Reputation: 2641

Force R to stop plotting abbreviated axis labels (scientific notation) - e.g. 1e+00

In ggplot2 how can I stop axis labels being abbreviated - e.g. 1e+00, 1e+01 along the x axis once plotted? Ideally, I want to force R to display the actual values which in this case would be 1,10.

Any help much appreciated.

Upvotes: 185

Views: 186307

Answers (10)

Sabareesh
Sabareesh

Reputation: 9

library(scales)

ggplot(data, aes(salary)) +
  geom_histogram() +
  scale_x_continuous(labels = comma)

here scale_x_continuous(labels = comma) can solve that issue.

Upvotes: -1

Arun
Arun

Reputation: 118779

I think you are looking for this:

require(ggplot2)
df <- data.frame(x=seq(1, 1e9, length.out=100), y=sample(100))
# displays x-axis in scientific notation
p  <- ggplot(data = df, aes(x=x, y=y)) + geom_line() + geom_point()
p

# displays as you require
library(scales)
p + scale_x_continuous(labels = label_comma())

Upvotes: 224

PeterD
PeterD

Reputation: 1501

If you additionally want to have commas as a thousand separator, you can use the following:

p + scale_x_continuous(labels=function(x) format(x, big.mark = ",", scientific = FALSE))

Upvotes: 5

tassones
tassones

Reputation: 1692

p + scale_x_continuous(labels = scales::number_format(accuracy = 1))

the accuracy = 1 is for whole numbers, you could also use accuracy = 0.1 if you wanted one decimal place, accuracy = 0.01 for two decimal places, etc.

similar to this answer

Upvotes: 2

Andrew Fraser
Andrew Fraser

Reputation: 31

Isn't the simplest general solution to set the penalty that R uses for scientific notation higher?

i.e set scipen() to a number that you are comfortable with.

e.g. If your axis maximum on charts is likely to be 100 000, setting scipen(200000) will ensure that R (and ggplot) will use standard notation for all numbers below 200000 and there will be no requirement to add any lines to the ggplot function.

Upvotes: 1

mdeleeuw
mdeleeuw

Reputation: 101

Extending the original question to comprise fractions as well, i.e. 1, 0.1, 0.01, 0.001 etc. and avoiding trailing zeros

p + scale_x_continuous(labels = function(x) sprintf("%g", x))

Upvotes: 10

Willian Adamczyk
Willian Adamczyk

Reputation: 1911

There is a solution that don't require scales library.

You can try:

# To deactivate scientific notation on y-axis:

    p + scale_y_continuous(labels = function(x) format(x, scientific = FALSE))

# To activate scientific notation on y-axis:

    p + scale_y_continuous(labels = function(x) format(x, scientific = TRUE))

# To deactivate scientific notation on x-axis:

    p + scale_x_continuous(labels = function(x) format(x, scientific = FALSE))

# To activate scientific notation on x-axis:

    p + scale_x_continuous(labels = function(x) format(x, scientific = TRUE))

Upvotes: 27

Derek Corcoran
Derek Corcoran

Reputation: 4082

Just an update to what @Arun made, since I tried it today and it didn't work because it was actualized to

+ scale_x_continuous(labels = scales::comma)

Upvotes: 65

user2739472
user2739472

Reputation: 1509

As a more general solution, you can use scales::format_format to remove the scientific notation. This also gives you lots of control around how exactly you want your labels to be displayed, as opposed to scales::comma which only does comma separations of the orders of magnitude.

For example:

require(ggplot2)
require(scales)
df <- data.frame(x=seq(1, 1e9, length.out=100), y=sample(100))

# Here we define spaces as the big separator
point <- format_format(big.mark = " ", decimal.mark = ",", scientific = FALSE)

# Plot it
p  <- ggplot(data = df, aes(x=x, y=y)) + geom_line() + geom_point()
p + scale_x_continuous(labels = point)

Upvotes: 26

juba
juba

Reputation: 49033

Did you try something like :

options(scipen=10000)

before plotting ?

Upvotes: 96

Related Questions