Довольно тикает для нормальной шкалы журнала, используя ggplot2 (динамический не ручной)

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

Вот мой пример:

library(ggplot2) library(scales) # fix RNG set.seed(seed=1) # simulate returns y=rnorm(999,0.02,0.2) # M$Y are the cummulative returns (like an index) M=data.frame(X=1:1000,Y=100) for (i in 2:1000) M[i,"Y"]=M[i-1,"Y"]*(1+y[i-1]) ggplot(M,aes(x=X,y=Y))+geom_line()+scale_y_continuous(trans=log_trans()) 

производит уродливые клещи:

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

Я также пробовал:

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

 ggplot(M,aes(x=X,y=Y)) + geom_line() + scale_y_continuous(trans=log_trans(), breaks=pretty_breaks()) 

Как я могу получить те же разрывы / тики, что и в функции графика по умолчанию:

 plot(M,type="l",log="y") 

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

Результат должен выглядеть так, но не с жестким набором перерывов, а с динамическим. Я пробовал функции, такие как axisTicks() но не был успешным:

 ggplot(M,aes(x=X,y=Y)) + geom_line() + scale_y_continuous(trans=log_trans(), breaks=c(1,10,100,10000)) 

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

Благодаря!

изменить: вставленные фотографии

Базовое графическое поведение можно воспроизвести с помощью функции пользовательских разрывов:

 base_breaks <- function(n = 10){ function(x) { axisTicks(log10(range(x, na.rm = TRUE)), log = TRUE, n = n) } } 

Применение этого к данным примера дает тот же результат, что и использование trans_breaks('log10', function(x) 10^x) :

 ggplot(M, aes(x = X, y = Y)) + geom_line() + scale_y_continuous(trans = log_trans(), breaks = base_breaks()) + theme(panel.grid.minor = element_blank()) 

ломается от десяти

Однако мы можем использовать одну и ту же функцию в подмножестве данных, причем значения y от 50 до 600:

 M2 <- subset(M, Y > 50 & Y < 600) ggplot(M2, aes(x = X, y = Y)) + geom_line() + scale_y_continuous(trans = log_trans(), breaks = base_breaks()) + theme(panel.grid.minor = element_blank()) 

Поскольку полномочия десяти уже не подходят здесь, base_breaks создает альтернативные довольно разрывы:

красивые перерывы

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

редактировать

Предположим, что мы модифицируем M так, чтобы минимальное значение равно 0,1:

 M <- M - min(M) + 0.1 

Функция base_breaks () по-прежнему выбирает довольно разрывы, но метки находятся в научной нотации, которая не может рассматриваться как «симпатичная»:

 ggplot(M, aes(x = X, y = Y)) + geom_line() + scale_y_continuous(trans = log_trans(), breaks = base_breaks()) + theme(panel.grid.minor = element_blank()) 

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

Мы можем управлять форматированием текста, передавая функцию форматирования текста в аргумент labels scale_y_continuous . В этом случае prettyNum из базового пакета делает работу красиво:

 ggplot(M, aes(x = X, y = Y)) + geom_line() + scale_y_continuous(trans = log_trans(), breaks = base_breaks(), labels = prettyNum) + theme(panel.grid.minor = element_blank()) 

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

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

 g = ggplot(M,aes(x=X,y=Y)) + geom_line() g + scale_y_continuous(trans = 'log10', breaks = trans_breaks('log10', function(x) 10^x), labels = trans_format('log10', math_format(10^.x))) 

Несколько отличий:

  1. Знаки осей показаны как степени десять – что мне нравится
  2. Малая линия сетки находится в середине основных линий сетки (сравните этот график с линиями сетки в ответе Андри).
  3. Ось x лучше. По какой-то причине в сюжете Андри диапазон х-осей отличается.

Давать

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

Базовая графическая функция axTicks() возвращает разрывы по оси для текущего графика. Таким образом, вы можете использовать это, чтобы вернуть разрывы, идентичные базовой графике. Единственный недостаток заключается в том, что сначала нужно построить график базовой графики.

 library(ggplot2) library(scales) plot(M, type="l",log="y") breaks <- axTicks(side=2) ggplot(M,aes(x=X,y=Y)) + geom_line() + scale_y_continuous(breaks=breaks) + coord_trans(y="log") 

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

  • Импорт нескольких CSV-файлов в R
  • Ошибка: неожиданный символ / ввод / строка константа / числовая константа / SPECIAL в моем коде
  • `levels <-` (Что это за колдовство?
  • Как сохранить data.frame в R?
  • избегайте строки, напечатанной на консоли, усеченной (в RStudio)
  • Изменение форм, используемых для scale_shape () в ggplot2
  • Наложение контуров на нерегулярную сетку
  • R, в которой говорится, что «Модели не были полностью приспособлены к одному и тому же размеру набора данных»
  • R tm заблокировать недопустимый ввод в 'utf8towcs'
  • Добавление таблицы в область построения графика ggplot в r
  • Разница между as.POSIXct / as.POSIXlt и strptime для преобразования векторов символов в POSIXct / POSIXlt
  • Давайте будем гением компьютера.