Как я могу отформатировать метки осей с показателями ggplot2 и масштабами?

С новой версией ggplot2 и масштабами я не могу понять, как получить метку оси в научной нотации. Например:

x <- 1:4
y <- c(0, 0.0001, 0.0002, 0.0003)

dd <- data.frame(x, y)

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

дает мне

Example ggplot with scales

Мне бы хотелось, чтобы метки осей были 0, 5 × 10 ^ -5, 1 × 10 ^ -4, 1,5 × 10 ^ -4 и т. Д. Я не могу определить правильную комбинациюscale_y_continuous() а такжеmath_format() (по крайней мере, я думаю, что это то, что мне нужно).

scale_y_log10() log преобразует ось, которую я не хочу.scale_y_continuous(label = math_format()) просто дает мне 10 ^ 0, 10 ^ 5e-5 и т. д. Я понимаю, почему последний дает такой результат, но это не то, что я ищу.

Я использую ggplot2_0.9.1 и scale_0.2.1

 kmm26 мая 2012 г., 01:12
Правильно - это было непонятно. Я редактировал сейчас.
 Brian Diggs26 мая 2012 г., 02:15
@ BenBolker Я не думаю, что это действительно дубликат того, на который вы ссылаетесь, поскольку этот вопрос касался логарифмической шкалы и меток, отформатированных как основание для мощности (так, чтобы затем мощности линейно увеличивались). Речь идет о метках в линейном масштабе в научных обозначениях.
 joran26 мая 2012 г., 01:09
Я запутался; эти значения (0, 5 ^ -5, 1 ^ -4, 1.5 ^ -4) на самом деле не совпадают с диапазонами данных на вашем графике.
 Ben Bolker26 мая 2012 г., 01:34
 Ben Bolker26 мая 2012 г., 02:57
Ладно, я был слишком быстр

Ответы на вопрос(5)

он также удаляет ведущие нули в показателях (от 10 ^ 04 до 10 ^ 4 и т. д.). Это было адаптировано из полезных ответов, приведенных выше.

Я также включил функции масштабирования оболочки ниже.

scientific_10 <- function(x) {
    xout <- gsub("1e", "10^{", format(x),fixed=TRUE)
    xout <- gsub("{-0", "{-", xout,fixed=TRUE)
    xout <- gsub("{+", "{", xout,fixed=TRUE)
    xout <- gsub("{0", "{", xout,fixed=TRUE)
    xout <- paste(xout,"}",sep="")
    return(parse(text=xout))
}

scale_x_log10nice <- function(name=NULL,omag=seq(-10,20),...) {
    breaks10 <- 10^omag
    scale_x_log10(name,breaks=breaks10,labels=scientific_10(breaks10),...)
}

scale_y_log10nice <- function(name=NULL,omag=seq(-10,20),...) {
    breaks10 <- 10^omag
    scale_y_log10(name,breaks=breaks10,labels=scientific_10(breaks10),...)
}

scale_loglog <- function(...) {
    list(scale_x_log10nice(...),scale_y_log10nice(...))
}

qplot(x=exp(5*rnorm(100)),geom="density",kernel="rectangular") + 
    scale_x_log10nice()

приведенный выше, следующее убирает знаки + и лучше обрабатывает 0 (функция также анонимно вставлена):

scale_y_continuous(label= function(x) {ifelse(x==0, "0", parse(text=gsub("[+]", "", gsub("e", " %*% 10^", scientific_format()(x)))))} ) +
Решение Вопроса

Просто добавив parse () к функции Scientific_10 () (и изменив «x» на правильный символ «times»), вы получите следующее:

x <- 1:4
y <- c(0, 0.0001, 0.0002, 0.0003)

dd <- data.frame(x, y)

scientific_10 <- function(x) {
  parse(text=gsub("e", " %*% 10^", scales::scientific_format()(x)))
}

ggplot(dd, aes(x, y)) + geom_point()+scale_y_continuous(label=scientific_10)

Возможно, вы все еще хотите усовершенствовать функцию, чтобы она работала с 0 более элегантно, но я думаю, что это так!

 Berk U.29 янв. 2016 г., 00:59
Спасибо за этот ответ. Это решение работает, но оно печатает число вроде 1e + 03 как 10 ^ + 03. Есть ли способ распечатать его как 10 ^ 3?

OP стремится отформатировать показатели в качестве показателей. Это можно сделать с помощьюtrans_format а такжеtrans_breaks функции вВес пакет:

    library(ggplot2)
    library(scales)

    x <- 1:4
    y <- c(0, 0.0001, 0.0002, 0.0003)
    dd <- data.frame(x, y)

    ggplot(dd, aes(x, y)) + geom_point() +
    scale_y_log10("y",
        breaks = trans_breaks("log10", function(x) 10^x),
        labels = trans_format("log10", math_format(10^.x)))

 aelwan09 окт. 2017 г., 09:57
Спасибо за этот ответ. Я попробовал это, но я получил сюжет с ног на голову. / Stackoverflow.com вопросы / 46639120 / .... Я буду признателен за ваши предложения.
 computermacgyver10 окт. 2017 г., 12:16
@ aelwan: я отвечу в другой ветке, но логарифмическая шкала не работает с барплотом, потому что нулевой отметки не может быть. Я хотел бы рассмотреть просто использовать geom_errorbar (), а не geom_bar ().
scale_y_continuous(label=scientific_format())

Полагаю, если вы действительно хотите, чтобы там были десятки, вы могли бы обернуть это в другую функци

scientific_10 <- function(x) {
  gsub("e", " x 10^", scientific_format()(x))
}

ggplot(dd, aes(x, y)) + geom_point() + 
  scale_y_continuous(label=scientific_10)

 computermacgyver30 авг. 2013 г., 08:50
@ joran Я добавил решение, чтобы показать, как отформатировать показатели, как вы хотели (однако, я знаю, что это довольно старая версия).
 joran26 мая 2012 г., 01:34
Я пытался найти способ совместить это со стратегией вmath_format() чтобы правильно отформатировать показатели, но это становилось все сложнее.
 Brian Diggs26 мая 2012 г., 02:36
@ Кевин Это может быть. Общий подход заключался бы в том, чтобы составлять метки заговора выражений. Я не знаю, можете ли вы вернуть выражения для функции меток или нет. Я попробовал несколько вещей, но не мог заставить что-либо работать легко. Надеюсь, кто-то еще может вмешаться.
 kmm26 мая 2012 г., 02:13
Можно ли получить показатели в качестве фактических показателей? В противном случае это то, что я ищу.

Ваш ответ на вопрос