ggplot2轴文本中的上标

时间:2019-06-09 16:52:07

标签: r ggplot2

我想创建一个在轴上带有上标的图形,而不是使用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

因此,我希望x轴显示相同的数字,但不显示胡萝卜。

enter image description here

3 个答案:

答案 0 :(得分:2)

编辑: 纯粹的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

图: enter image description here

原始和错误的答案

我通过使用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)

答案 1 :(得分:2)

这可以通过可以在GitHub软件包scale_x_log2中找到的函数scale_y_log2jrnoldmisc完成。

首先,安装软件包。

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)

enter image description here

编辑。

在评论中进行讨论之后,可以看到以下两种提供不同轴标签的方式。

  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)

答案 2 :(得分:1)

您可以为labelsscale_x_***函数的scale_y_***参数提供一个函数,以生成带有上标(或其他格式)的标签。请参见下面的示例。

library(jrnoldmisc)
library(ggplot2)

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_log2(breaks=2^seq(-5,5,2),
               labels=function(x) parse(text=paste("2^",round(log2(x),2))))

enter image description here

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))))

enter image description here

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))))

enter image description here