2017-08-25 93 views
2

我想向我的ggplot添加一个表。在该表中,我需要为一些字符值添加一个下标(对于Winsorized平均值和标准偏差)。当我指定parse = TRUE时可以实现这个功能,但是结果我丢失了使用sprintf格式化的尾随零。有没有办法使用plotmath并在我的表中保留尾随零?如何使用gtable中的解析并保留尾随零

# exmple data 
data(iris) 

# packages 
library(dplyr) 
library(tidyr) 
library(ggplot2) 
library(psych) 
library(gridExtra) 
library(grid) 
library(gtable) 

# sumarise data 
summary.df <- iris %>% 
    group_by(Species) %>% 
    summarise(mean_length = mean(Sepal.Length), 
      meanw_length = winsor.mean(Sepal.Length), 
      sd_length = sd(Sepal.Length), 
      sdw_length = winsor.sd(Sepal.Length, trim=0.05)) %>% 
    gather(key='Metric', value='Value', 
     mean_length, meanw_length, 
     sd_length, sdw_length) %>% 
    mutate(Value = sprintf("%2.1f", Value)) %>% 
    spread(key=Species, value=Value) 

# rename metrics 
# use plotmath notation for subsript 
summary.df$Metric[summary.df$Metric == 'mean_length'] <- 'Mean' 
summary.df$Metric[summary.df$Metric == 'meanw_length'] <- 'Mean[w]' 
summary.df$Metric[summary.df$Metric == 'sd_length'] <- 'SD' 
summary.df$Metric[summary.df$Metric == 'sdw_length'] <- 'SD[w]' 

# regular theme 
tt <- ttheme_default(core = list(fg_params=list(cex = 0.7)), 
        colhead = list(fg_params=list(cex = 0.7)), 
        rowhead = list(fg_params=list(cex = 0.7))) 

# theme with parsing 
tt_parse <- ttheme_default(core = list(fg_params=list(cex = 0.7, 
                 parse=TRUE)), 
          colhead = list(fg_params=list(cex = 0.7)), 
          rowhead = list(fg_params=list(cex = 0.7))) 


# Graph with regular table theme 
iris %>% 
    ggplot(aes(x=Sepal.Length, fill=Species)) + 
    geom_density(alpha = 0.8) + 
    coord_cartesian(ylim = c(0, 1.5)) + 
    labs(title = 'Regular Theme') + 
    annotation_custom(grob=tableGrob(summary.df, theme=tt, rows=NULL), 
        xmin=6.25, xmax=8, 
        ymin = 1, ymax=1.4) 

# graph with table theme with parsing 
iris %>% 
    ggplot(aes(x=Sepal.Length, fill=Species)) + 
    geom_density(alpha = 0.8) + 
    coord_cartesian(ylim = c(0, 1.5)) + 
    labs(title = 'Theme with Parsing') + 
    annotation_custom(grob=tableGrob(summary.df, theme=tt_parse, rows=NULL), 
        xmin=6.25, xmax=8, 
        ymin = 1, ymax=1.4) 

Regular Plot Table

Plot Table with Parsing

回答

2

尾随零可以被印刷确保5.0被解释为一个字符串,而不是一个数值。 下面给出here的建议,该解决方案是基于使用的:

sprintf('"%2.1f"',5.0) 
# [1] "\"5.0\"" 

因此,修改后的代码是:

data(iris) 
library(dplyr) 
library(tidyr) 
library(ggplot2) 
library(psych) 
library(gridExtra) 
library(grid) 
library(gtable) 

summary.df <- iris %>% 
    group_by(Species) %>% 
    summarise(mean_length = mean(Sepal.Length), 
      meanw_length = winsor.mean(Sepal.Length), 
      sd_length = sd(Sepal.Length), 
      sdw_length = winsor.sd(Sepal.Length, trim=0.05)) %>% 
    gather(key='Metric', value='Value', 
     mean_length, meanw_length, 
     sd_length, sdw_length) %>% 
    mutate(Value = sprintf('"%2.1f"', Value)) %>% 
    spread(key=Species, value=Value) 

summary.df$Metric[summary.df$Metric == 'mean_length'] <- 'Mean' 
summary.df$Metric[summary.df$Metric == 'meanw_length'] <- 'Mean[w]' 
summary.df$Metric[summary.df$Metric == 'sd_length'] <- 'SD' 
summary.df$Metric[summary.df$Metric == 'sdw_length'] <- 'SD[w]' 

tt_parse <- ttheme_default(core = list(fg_params=list(cex = 0.7, 
                 parse=TRUE)), 
          colhead = list(fg_params=list(cex = 0.7)), 
          rowhead = list(fg_params=list(cex = 0.7))) 

iris %>% 
    ggplot(aes(x=Sepal.Length, fill=Species)) + 
    geom_density(alpha = 0.8) + 
    coord_cartesian(ylim = c(0, 1.5)) + 
    labs(title = 'Theme with Parsing') + 
    annotation_custom(grob=tableGrob(summary.df, theme=tt_parse, rows=NULL), 
        xmin=6.25, xmax=8, 
        ymin = 1, ymax=1.4) 

enter image description here