Используйте ggplot2 и tablegrob для построения сгруппированных диаграмм со сводной статистикой из нескольких матриц со значениями NA.

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

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

Это код:

a<-as.vector(matrixA) #matrices A-D contain randomly generated NA and 
b<-as.vector(matrixB) #numerical values
c<-as.vector(matrixC)
d<-as.vector(matrixD)
data <- cbind(a, b, c, d)
plot <- melt(data)
colnames(plot)[2]<-"variable"
plot<-plot[,-1]
levels(df$variable) <- c("A", "B", "C",
                                  "D")
xlabs <- paste(levels(plot$variable),"\n(N=",
               colSums(!is.na(data)),")",sep="")
boxplot1<-ggplot(na.omit(plot),aes(x=variable,y=value,color=variable))+
  geom_boxplot()+scale_x_discrete(labels=xlabs)+
  xlab("X") + ylab("Y")+ 
  ggtitle("Title")
#create inset table
multi.fun <- function(x) {
  c(Mean = mean(x,na.rm=TRUE), Median = median(x,na.rm=TRUE), 
    IQR = IQR(x,na.rm=TRUE))}
sum.table<-data.frame(lapply(data.frame(a,b,c,d), multi.fun))
colnames(sum.table)<- c("A", "B", "C",
                        "D")
my_table <- tableGrob(sum.table, **digits=2**, gpar.coretext = gpar(fontsize=8), 
                      gpar.coltext=gpar(fontsize=8), gpar.rowtext=gpar(fontsize=8))
#Create the viewports, push them, draw and go up
grid.newpage()
vp1 <- viewport(width = 0.75, height = 1, x = 0.375, y = .5)
subvp <- viewport(width = 0.3, height = 0.3, x = 0.75, y = 0.20)
print(boxplot1, vp = vp1)
upViewport(0)
pushViewport(subvp)
grid.draw(my_table)

Я попытался настроить значения с помощью digits в tablegrob, но это не сработало. Я также попробовал options(digits=2), но это тоже не сработало. Любые мысли или идеи?


person Provisional.Modulation    schedule 24.02.2015    source источник
comment
Я не думаю, что у tableGrob есть аргумент цифр. Вы можете заранее преобразовать свой sum.table data.frame в символ с желаемым форматированием, как в tableGrob(format(mtcars[1:3,4:6], digits=2))   -  person baptiste    schedule 24.02.2015
comment
@baptiste Не могли бы вы пояснить, как работает матрица измерений [1:3,4:6]? Кажется, это не работает.   -  person Provisional.Modulation    schedule 24.02.2015
comment
@baptiste Неважно, я понял! Спасибо!!   -  person Provisional.Modulation    schedule 24.02.2015
comment
Кстати, я попробовал вашу технику, чтобы добавить N = к меткам оси x, но безуспешно (у меня было одинаковое количество для каждого из моих факторов). Откуда взялся ДФ? Как получилось, что суммы меняются на множители A, B, C, D? Спасибо   -  person lawyeR    schedule 24.02.2015
comment
@lawyeR Я изменил свой исходный пост. Надеюсь это поможет. Я уверен, что этот код можно было бы сделать и более элегантным способом!   -  person Provisional.Modulation    schedule 24.02.2015
comment
Спасибо. Вы научили меня очень полезной технике.   -  person lawyeR    schedule 24.02.2015
comment
@lawyeR Нет проблем. Шляпа в натуре, если можно.   -  person Provisional.Modulation    schedule 02.03.2015


Ответы (1)


colnames(sum.table)<- c("A", "B", "C","D")
***sum.table<-format(sum.table[1:3,1:4], digits=2)***
my_table <- tableGrob(sum.table, 
            gpar.coretext = gpar(fontsize=8), gpar.coltext=gpar(fontsize=8), 
            gpar.rowtext=gpar(fontsize=8))

Форматируя data.frame перед использованием tableGrob с помощью sum.table<-format(sum.table[1:3,1:4], digits=2), я получаю желаемый результат:

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

person Provisional.Modulation    schedule 24.02.2015