Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Logarithmic y-axis Tick Marks in R plot() or ggplot2()

I saw the ideal tick-mark structure for a log="y" plot in this paper, Figure 3b 3c 3d.

It has short, log-spaced minor tick marks without labels, plus long, log-spaced major tick marks with labels.

Does anyone know how to achieve this in R?

like image 668
isomorphismes Avatar asked Apr 28 '11 16:04

isomorphismes


People also ask

How do I change the Y axis to log scales ggplot2?

This can be done easily using the ggplot2 functions scale_x_continuous() and scale_y_continuous(), which make it possible to set log2 or log10 axis scale. An other possibility is the function scale_x_log10() and scale_y_log10(), which transform, respectively, the x and y axis scales into a log scale: base 10.

How do I add axis tick marks in R?

To hide or to show tick mark labels, the following graphical parameters can be used : xaxt : a character specifying the x axis type; possible values are either “s” (for showing the axis) or “n” ( for hiding the axis)

How do you plot a log graph in R?

To create a Log-Log plot in base R we pass log(data) as data argument instead of data in the plot() function. The log() function converts the data value into its logarithmic value.


2 Answers

Here is a ggplot2 solution:

library(ggplot2)

set.seed(20180407)

df = data.frame(x = seq(from = 1, by = 1, length.out = 20),
                y = 2^(seq(to = 1, by = -1, length.out = 20) + rnorm(20, 0, 0.7)))

ggplot(data = df, aes(x = x, y = y)) +
  geom_line() +
  scale_y_log10() +
  annotation_logticks(sides = "l") 

example_plot

You can make it look even more than the paper you linked to with some theming:

ggplot(data = df, aes(x = x, y = y)) +
  geom_line(colour = "blue") +
  geom_point(colour = "blue") +
  scale_y_log10() +
  annotation_logticks(sides = "l") +
  theme_minimal() +
  theme(panel.grid = element_blank(), 
        axis.line = element_line(),
        axis.ticks.x = element_line())

example_themed

like image 97
Droplet Avatar answered Sep 30 '22 20:09

Droplet


In base R just build the axes however you want. Something like this could be a start.

set.seed(5)
d <- data.frame(x=1:100, y=rlnorm(100, meanlog=5, sdlog=3))
with(d, {
  plot(x, y, log="y", yaxt="n")
  y1 <- floor(log10(range(y)))
  pow <- seq(y1[1], y1[2]+1)
  ticksat <- as.vector(sapply(pow, function(p) (1:10)*10^p))
  axis(2, 10^pow)
  axis(2, ticksat, labels=NA, tcl=-0.25, lwd=0, lwd.ticks=1)
})

In lattice, the latticeExtra package has the capability:

library(lattice)
library(latticeExtra)
xyplot(y~x, data=d, scales=list(y=list(log=10)),
       yscale.components=yscale.components.log10ticks)
like image 26
Aaron left Stack Overflow Avatar answered Sep 30 '22 18:09

Aaron left Stack Overflow