如何在gtable中使用解析并保留尾随零

时间:2017-08-25 17:00:48

标签: r ggplot2 printf gridextra plotmath

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

# 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

1 个答案:

答案 0 :(得分:2)

可以打印尾随零,确保将5.0解释为字符串,而不是数值。 根据{{​​3}}给出的建议,解决方案基于以下用途:

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)

here