I generate a fine histogram here with both positive and negative numbers.
x <- rnorm(5000,0,1000)
library(ggplot2)
df <- data.frame(x)
ggplot(df, aes(x = x)) + geom_histogram()
What I want is to have a logged x-axis. When I do this for only positive numbers with scale_x_log10(), it works like a charm. But here it does not and it either removes my negative numbers are adds them to the positive numbers.
ggplot(df, aes(x = x)) + geom_histogram() + scale_x_log10()
All I really want is for the ticks and the spacing between the ticks to follow the log pattern and for either side of 0 on the x-axis to be mirror images of each other but I cannot seem to get that.
This is possible to do by defining a new transformation (a "signed log", sign(x)*log(abs(x))
; the asinh transformation suggested by Histogram with "negative" logarithmic scale in R might be more principled, or a signed square root as suggested in the comments above), but I question whether it's a good idea or not. Nevertheless ... ("Teach a man to fish and you feed him for a lifetime; give him a rope, and he can go hang himself ...") ... you can define your own axis transformations via trans_new
as shown below.
Setup:
library(ggplot2); theme_set(theme_bw())
set.seed(101)
df <- data.frame(x=rnorm(5000,0,1000))
Set up the new transformation:
weird <- scales::trans_new("signed_log",
transform=function(x) sign(x)*log(abs(x)),
inverse=function(x) sign(x)*exp(abs(x)))
Try it out -- first on the raw points:
ggplot(df,aes(x,x))+geom_point()+
scale_y_continuous(trans=weird)
Now on the histogram:
ggplot(df, aes(x = x)) + geom_histogram()+
scale_x_continuous(trans=weird)
Things you should worry about:
ggplot(df, aes(x = weird$transform(x))) + geom_histogram()
looks about the same as the plot above ...If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With