2017-08-25 95 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