ggplot2 integer multiple of minor breaks per major

2019-07-22 04:00发布

问题:

This answer shows how you can specify where the minor breaks should go. In the documentation it says that minor_breaks can be a function. This, however, takes as input the plot limits not, as I expected, the location of the major gridlines below and above.

It doesn't seem very simple to make a script that will return me, say, 4 minors per major. This is something I would like to do since I have a script that I want to use on multiple different datasets. I don't know the limits beforehand, so I can't hard code them in. I can of course create a function that gets the values I need from the dataset before plotting, but it seems overkill.

Is there a general way to state the number of minor breaks per major break?

回答1:

I think scales::extended_breaks is the default function for a continuous scale. You can set the number of breaks in this function, and make the number of minor_breaks a integer multiple of the number of breaks.

library(ggplot2)
library(scales)
nminor <- 7
nmajor <- 5
ggplot(iris, aes(x = Species, y = Sepal.Length)) + 
  geom_point() +
  scale_y_continuous(breaks = extended_breaks(n = nmajor), minor_breaks = extended_breaks(n = nmajor * nminor) )



回答2:

You can extract the majors from the plot, and from there calculate what minors you want and set it for your plot.

df <- data.frame(x = 0:10,
                 y = 0:10)
p <- ggplot(df, aes(x,y)) + geom_point()

majors <- ggplot_build(p)$panel$ranges[[1]]$x.major_source
multiplier <- 4
minors <- seq(from = min(majors),
              to = max(majors),
              length.out = ((length(majors) - 1) * multiplier) + 1)
p + scale_x_continuous(minor_breaks = minors)



回答3:

Using ggplot2 version 3, I have to modify Eric Watt's code above a bit to get it to work (I can't comment on that instead since I don't have a 50 reputation yet)

library(ggplot2)

df <- data.frame(x = 0:10,
                 y = 10:20)
p <- ggplot(df, aes(x,y)) + geom_point()

majors <- ggplot_build(p)$layout$panel_params[[1]]$x.major_source;majors
multiplier <- 10
minors <- seq(from = min(majors),
              to = max(majors),
              length.out = ((length(majors) - 1) * multiplier) + 1);minors
p + scale_x_continuous(minor_breaks = minors)

If I copy paste the same code in my editor, it doesn't create majors (NULL), and so the next line gives an error.



标签: r ggplot2