10

I need to plot with ggplot2 package in R a graph with some negative values using an x logarithmic scale.

For example I want to plot these points using an x logarithmic scale

x <- c(-1,-10,-100)
y <- c(1,2,3)

I know that the logarithm of a negative value in R produces a NA value, but I need a result like this:

click to view the picture

Is this possible using ggplot2?

Ben Bolker
  • 211,554
  • 25
  • 370
  • 453
Dalmo1991
  • 125
  • 1
  • 1
  • 9

2 Answers2

15

For this, I find the pseudolog10_trans transformation from the ggallin package to be very helpful, as it can accomodate situations with both positive and negative numbers on a log scale. E.g.

library(ggplot2)
library(ggallin)

x <- c(-1,-10,-100, 1, 10, 100)
y <- c(1,2,3, 1,2,3)

df = data.frame(x = x, y = y)

My_Plot = ggplot(
    df, 
    aes(x=x, y=y)) + 
    geom_point() + 
    scale_x_continuous(trans = pseudolog10_trans)

My_Plot
Michael Ohlrogge
  • 10,559
  • 5
  • 48
  • 76
9

There are two problems to solve - calculate log from negative values and then combine logarithmic scale and reverse scale.

To combine log and reverse scales you can use solution provided by @Briand Diggs on this SO question.

library(scales)
reverselog_trans <- function(base = exp(1)) {
    trans <- function(x) -log(x, base)
    inv <- function(x) base^(-x)
    trans_new(paste0("reverselog-", format(base)), trans, inv, 
              log_breaks(base = base), 
              domain = c(1e-100, Inf))
}

To make it work with negative values, provide x values as -x in ggplot() call and then use another transformation for labels= inside scale_x_continuous() to get back negative values.

df<-data.frame(x=c(-1,-10,-100),y= c(1,2,3))
ggplot(df,aes(-x,y))+geom_point()+
  scale_x_continuous(trans=reverselog_trans(base=10),
                     labels=trans_format("identity", function(x) -x))

enter image description here

Community
  • 1
  • 1
Didzis Elferts
  • 95,661
  • 14
  • 264
  • 201
  • 2
    Another question..what I have to do if I also have positive data in x axis? For exemple 'x <- c(-10,1,10)'... – Dalmo1991 Jan 05 '14 at 15:22
  • How, then, do you explain the possibility of log-scaling axes in Motion Charts, even with negative values? – CBechet Feb 19 '18 at 02:03