математические выражения в заголовках граней ggplot

У меня есть следующая задача:

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

rm(list=ls())
library(nlme)
library(ggplot2)
mupre<-10
sdpre<-25
n<-1000
xpre<-rnorm(n,mupre,sdpre)

############
### a function to define a variance
############
A<-matrix(c(rep(1,3),c(.2,.5,.8),c(.2,.5,.8)^2),ncol=3)
B<-c(.09,.2,.32)
A%*%solve(A,B)
X=solve(A,B)
dltf<-function(bta){c(1,bta,bta^2)%*%X}
###############
###each plot is a diffirent simulation with different beta and delta
###############
resdf<-NULL
for(i in seq(.2,1,length.out = 10)){
  bta<-i
  dlta<-dltf(bta)
  Ec_xpost<- xpre*bta
  sdc_xpost<- xpre*dlta
  xpost<-rnorm(n,Ec_xpost,sdc_xpost)
  xpost[xpost<0]<-0
  xprepost<-data.frame(pre=xpre,post=xpost,beta=bta,delta=dlta)
  resdf<-rbind(resdf,xprepost)
  plt<-ggplot(xprepost,aes(x=xpre,y=xpost))+geom_point()+
    ggtitle(substitute(paste(beta,"=",b1,", ", delta,"=",d2),list(b1=round(bta,2),d2=round(dlta,2))))+
    geom_hline(yintercept = 0,col=2)+ geom_abline(intercept = 0, slope = 1,col=2)+
    scale_x_continuous(limits = c(-5,100))+scale_y_continuous(limits = c(-5,100))+
    labs(x="pre",y="post")
  print(plt)
}

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

resdf$lab<-factor(resdf$beta,labels=c(expression(beta[1]),expression(beta[2]),expression(beta[3]),expression(beta[4]),
                                      expression(beta[5]),expression(beta[6]),expression(beta[7]),expression(beta[8]),
                                      expression(beta[9]),expression(beta[10])))

ggplot(resdf,aes(x=pre,y=post))+geom_point()+
  scale_x_continuous(limits = c(-5,100))+scale_y_continuous(limits = c(-5,100))+labs(x="pre",y="post")+
  geom_hline(yintercept = 0,col=2)+ geom_abline(intercept = 0, slope = 1,col=2)+
  facet_wrap( ~ lab, ncol=5,labeller = label_parsed)

Лучшее, что я мог, это поставить эти ярлыки «beta_i». Я ценю любые предложения


person Nicolas Molano    schedule 30.01.2018    source источник
comment
Этот код отлично работает для beta_i. Какие фактические формулы вы хотите использовать в качестве меток фасетов? Какие ошибки вы получаете?   -  person David Klotz    schedule 30.01.2018
comment
Мне нужны те, которые используются в цикле for, те, которые используются как ggtitle(substitute(paste(beta,"=",b1,", ", delta,"=",d2),list(b1=round(bta,2),d2=round(dlta,2))))   -  person Nicolas Molano    schedule 30.01.2018


Ответы (1)


Как вы можете видеть на первом графике, на самом деле вам не нужно оборачивать каждый beta[i] в expression(); ggplot должен интерпретировать язык plotmath непосредственно из символов.

Вместо этого попробуйте создать свои метки в векторе символов, используя следующий формат:

resdf$lab<-factor(resdf$beta,labels=c("list(beta[1] == 1, delta[1] == .34)", 
  "list(beta[2] == 1, delta[2] == .56)", ...))
person David Klotz    schedule 30.01.2018
comment
Действительно, это решение. Было бы хуже с увеличением количества симуляций; он должен масштабироваться до 50 или 100 симуляций, для которых предлагаемое вами решение будет включать несколько строк кода. Я хотел бы что-то более автоматическое, если это возможно (конечно, это так) - person Nicolas Molano; 31.01.2018
comment
Да, вы можете использовать paste точно так же, как и в приведенном выше примере ggtitle, чтобы динамически вставлять соответствующие бета- и дельта-значения. Просто нужно в итоге получить формат, аналогичный тому, что я написал выше. - person David Klotz; 31.01.2018