Увеличить количество тактов по оси


191

Я генерирую графики для некоторых данных, но число тиков слишком мало, мне нужно больше точности при чтении.

Есть ли способ увеличить количество тактов на оси в ggplot2?

Я знаю, что могу сказать ggplot использовать вектор в качестве тиков оси, но я хочу увеличить количество тиков для всех данных. Другими словами, я хочу, чтобы число тиков было рассчитано на основе данных.

Возможно, ggplot делает это внутренне с помощью некоторого алгоритма, но я не мог найти, как он это делает, чтобы изменить в соответствии с тем, что я хочу.

Ответы:


188

Вы можете переопределить ggplots по умолчанию масштабы путем изменения scale_x_continuousи / или scale_y_continuous. Например:

library(ggplot2)
dat <- data.frame(x = rnorm(100), y = rnorm(100))

ggplot(dat, aes(x,y)) +
  geom_point()

Дает вам это:

введите описание изображения здесь

И переопределение весов может дать вам что-то вроде этого:

ggplot(dat, aes(x,y)) +
  geom_point() +
  scale_x_continuous(breaks = round(seq(min(dat$x), max(dat$x), by = 0.5),1)) +
  scale_y_continuous(breaks = round(seq(min(dat$y), max(dat$y), by = 0.5),1))

введите описание изображения здесь

Если вы хотите просто «увеличить» определенную часть графика, посмотрите xlim()и ylim()соответственно. Хорошее понимание также можно найти здесь, чтобы понять и другие аргументы.


4
На самом деле смысл в том, чтобы «обобщить» byаргумент для разных шкал чисел, т. Е. 0,5 - это хорошее значение для этих данных, диапазон которых равен c (-3,3), но это не очень хороший диапазон для данных, диапазон которых это с (0,5000). Есть ли какая-то функция, которая вычисляет это?
Жоао Даниэль

3
@ JoãoDaniel - я имею в виду, что ggplot автоматически справляется с этой задачей. Если он не дает удовлетворительного набора результатов, я не уверен, что есть встроенная функция для предоставления чего-то другого. Уровень детализации, который вам нужен, будет зависеть от вашего сюжета, но, возможно, продумайте некоторые тестовые примеры и заданный вами уровень детализации, чтобы определить шаблон ... если бы это был блокпост, что-то вроде max-min/30довольно распространенного «ведра» размер ... но это может или не может быть хорошей отправной точкой для вас.
Погоня

4
Как насчет категориальных значений на оси х, таких как месяцы года для временных рядов?
Скотт Дэвис

3
@ ScottDavis взглянуть на ссылку . Вы можете использоватьscale_x_date(date_breaks = "5 months", date_minor_breaks = "1 months")
Маркус Хаушель

Для увеличения coord_cartesianследует использовать вместо xlim. stackoverflow.com/questions/25685185/…
qwr

167

На основании комментария Даниэля Кризиана вы также можете использовать pretty_breaksфункцию из scalesбиблиотеки, которая импортируется автоматически:

ggplot(dat, aes(x,y)) + geom_point() +
scale_x_continuous(breaks = scales::pretty_breaks(n = 10)) +
scale_y_continuous(breaks = scales::pretty_breaks(n = 10))

Все, что вам нужно сделать, это ввести желаемое количество тиков n.


Чуть менее полезное решение (так как вам нужно снова указать переменную данных), вы можете использовать встроенную prettyфункцию:

ggplot(dat, aes(x,y)) + geom_point() +
scale_x_continuous(breaks = pretty(dat$x, n = 10)) +
scale_y_continuous(breaks = pretty(dat$y, n = 10))

16
Это явно лучший ответ! Кстати, ggplot уже импортирует, scalesно не добавляет функции в ваше пространство имен. Поэтому вы можете вызывать их без импорта как scales::pretty_breaks(n = 10).
то время как

63

Вы можете указать аргумент функции scale, и ggplot будет использовать эту функцию для вычисления местоположений тиков.

library(ggplot2)
dat <- data.frame(x = rnorm(100), y = rnorm(100))
number_ticks <- function(n) {function(limits) pretty(limits, n)}

ggplot(dat, aes(x,y)) +
  geom_point() +
  scale_x_continuous(breaks=number_ticks(10)) +
  scale_y_continuous(breaks=number_ticks(10))

81
Не нужно создавать собственную функцию number_ticks. Это уже было реализовано в pretty_breaks {scales}. Отсюда: ggplot(dat, aes(x,y)) + geom_point() + scale_x_continuous(breaks=pretty_breaks(n=10)) + scale_y_continuous(breaks=pretty_breaks(n=10))
Даниэль Кризиан

11
@Daniel Krizian: 1) нуждается в require(scales)2) это, кажется, предотвращает мои разрывы, появляющиеся в научной нотации, следовательно, 1e6 изменяется на 1000000 ??
smci

6
Вы можете использовать базы R prettyбез scalesпакета, просто предоставьте значения в качестве аргумента. Например:(breaks=pretty(dat$x, n=10))
Молкс

@smci Если ggplot2 работает, то доступны весы. ggplot2 не будет работать без весов.
Клаус Уилк

7

В следующей версии v3.3.0 ggplot2будет возможность n.breaksавтоматически генерировать перерывы для scale_x_continuousиscale_y_continuous

    devtools::install_github("tidyverse/ggplot2")

    library(ggplot2)

    plt <- ggplot(mtcars, aes(x = mpg, y = disp)) +
      geom_point()

    plt + 
      scale_x_continuous(n.breaks = 5)

введите описание изображения здесь

    plt + 
      scale_x_continuous(n.breaks = 10) +
      scale_y_continuous(n.breaks = 10)

введите описание изображения здесь


4

Дополнительно,

ggplot(dat, aes(x,y)) +
geom_point() +
scale_x_continuous(breaks = seq(min(dat$x), max(dat$x), by = 0.05))

Работает для дискретных или дискретных масштабированных данных по оси x (т. Е. Округление не требуется).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.