如何在 gtable 中使用解析并保留尾随零
How to use parsing inside a gtable and retain trailing zeros
我想在我的 ggplot 中添加一个 table。在 table 中,我需要为几个字符值添加一个下标(对于 Winsorized 均值和标准差)。这可以在我指定 parse = TRUE
时实现,但结果是我丢失了使用 sprintf
格式化的尾随零。有没有办法使用 plotmath 并在我的 table?
中保留尾随零
# 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)
可以打印尾随零,确保将 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)
我想在我的 ggplot 中添加一个 table。在 table 中,我需要为几个字符值添加一个下标(对于 Winsorized 均值和标准差)。这可以在我指定 parse = TRUE
时实现,但结果是我丢失了使用 sprintf
格式化的尾随零。有没有办法使用 plotmath 并在我的 table?
# 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)
可以打印尾随零,确保将 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)