Вопрос:

Верхние индексы в тексте оси ggplot2

r ggplot2

51 просмотра

3 ответа

164 Репутация автора

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

Пример:

x<-c('2^-5','2^-3','2^-1','2^1','2^2','2^3','2^5','2^7','2^9','2^11','2^13')
y<-c('2^-5','2^-3','2^-1','2^1','2^2','2^3','2^5','2^7','2^9','2^11','2^13')
df<-data.frame(x,y)
p<-ggplot()+
  geom_point(data=df,aes(x=x,y=y),size=4)
p

Поэтому я бы хотел, чтобы на оси х отображались те же цифры, но без моркови.

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

Автор: Jack Armstrong Источник Размещён: 09.06.2019 04:52

Ответы (3)


2 плюса

5569 Репутация автора

РЕДАКТИРОВАТЬ : чисто baseподход:

df %>% 
  mutate_all(as.character)->new_df
res<-unlist(Map(function(x) eval(parse(text=x)),new_df$x))#replace with y for y
to_use<-unlist(lapply(res,as.expression))
split_text<-strsplit(gsub("\\^"," ",names(to_use))," ")
join_1<-as.numeric(sapply(split_text,"[[",1)) #tidyr::separate might help, less robust for numeric(I think)
join_2<-as.numeric(sapply(split_text,"[[",2))
to_use_1<-sapply(seq_along(join_1),function(x) parse(text=paste(join_1[x],"^",
                                                join_2[x])))

Выше можно свести к меньшему шагу, я разместил пошаговый подход, который я выбрал. Результат только для x, то же самое можно сделать для y:

new_df %>%   
ggplot()+
  geom_point(aes(x=x,y=y),size=4)+
 scale_x_discrete(breaks=df$x,labels=to_use_1)#replace with y and scale_y_discrete for y

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

Оригинальный и ошибочный ответ :

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

    library(dplyr)
   df %>% 
          mutate(new_x=gsub("\\^"," ",x),
                 new_y=gsub("\\^"," ",y))->new_df
        new_df %>%   
        ggplot()+
          geom_point(aes(x=x,y=y),size=4)+
         scale_x_discrete(breaks=x,labels=new_df$new_x)+
          scale_y_discrete(breaks=y,labels=new_df$new_y)
Автор: NelsonGon Размещён: 09.06.2019 05:25

2 плюса

19795 Репутация автора

Решение

Это можно сделать с помощью функций scale_x_log2и scale_y_log2которые могут быть найдены в пакете GitHub jrnoldmisc.

Сначала установите пакет.

devtools::install_github("jrnold/rubbish")

Затем приведите переменные в числовое значение. Я буду работать с копией оригинального кадра данных.

df1 <- df
df1[] <- lapply(df1, function(x){
  x <- as.character(x)
  sapply(x, function(.x)eval(parse(text = .x)))
})

Теперь, граф это.

library(jrnoldmisc)
library(ggplot2)
library(MASS)
library(scales)

a <- ggplot(df1, aes(x = x, y = y, size = 4)) + 
  geom_point(show.legend = FALSE) +
  scale_x_log2(limits = c(0.01, NA), 
                labels = trans_format("log2", math_format(2^.x)),
                breaks = trans_breaks("log2", function(x) 2^x, n = 10)) +
  scale_y_log2(limits = c(0.01, NA),
                labels = trans_format("log2", math_format(2^.x)),
                breaks = trans_breaks("log2", function(x) 2^x, n = 10))
a + annotation_logticks(base = 2)

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

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

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

  1. Ось помечает каждую отметку. Установить limits = c(1.01, NA)и аргумент функции n = 11, нечетное число.
  2. Оси обозначают показатели нечетного числа. Сохранить limits = c(0.01, NA), изменить на function(x) 2^(x - 1), n = 11.

Только инструкции, без сюжетов.

Первый.

a <- ggplot(df1, aes(x = x, y = y, size = 4)) + 
  geom_point(show.legend = FALSE) +
  scale_x_log2(limits = c(1.01, NA), 
                labels = trans_format("log2", math_format(2^.x)),
                breaks = trans_breaks("log2", function(x) 2^(x), n = 11)) +
  scale_y_log2(limits = c(1.01, NA),
                labels = trans_format("log2", math_format(2^.x)),
                breaks = trans_breaks("log2", function(x) 2^(x), n = 11))
a + annotation_logticks(base = 2)

И второе.

a <- ggplot(df1, aes(x = x, y = y, size = 4)) + 
  geom_point(show.legend = FALSE) +
  scale_x_log2(limits = c(0.01, NA), 
               labels = trans_format("log2", math_format(2^.x)),
               breaks = trans_breaks("log2", function(x) 2^(x - 1), n = 11)) +
  scale_y_log2(limits = c(0.01, NA),
               labels = trans_format("log2", math_format(2^.x)),
               breaks = trans_breaks("log2", function(x) 2^(x - 1), n = 11))
a + annotation_logticks(base = 2)
Автор: Rui Barradas Размещён: 09.06.2019 05:38

0 плюса

62055 Репутация автора

Вы можете предоставить функцию labelsаргументу scaleфункций для генерации меток, которые вы хотите. Смотрите примеры ниже. Если я что-то упустил в вашем случае использования, пожалуйста, дайте мне знать.

df<-data.frame(x=2^seq(-5,5,2),
               y=2^seq(-5,5,2))

ggplot(df) +
  geom_point(aes(x=x,y=y),size=2)  +
  scale_x_continuous(breaks=c(2^-5, 2^seq(1,5,2)),
                     labels=function(x) parse(text=paste("2^",round(log2(x),2))))

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

ggplot(df) +
  geom_point(aes(x=x,y=y),size=2)  +
  scale_x_log10(breaks=10^seq(-1,1,1),
                labels=function(x) parse(text=paste("10^",round(log10(x),2))))

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

Автор: eipi10 Размещён: 12.06.2019 10:12
Вопросы из категории :
32x32