图表上的选择性粗体字体

dde*_*ert 0 r ggplot2

我正在用摘要统计数据注释我的图表。我想使用粗体字体来快速将用户的注意力吸引到按组划分的最佳/最差统计数据。突出显示的数字需要在运行时由数据本身确定。

以下是使用 ChickWeight 数据集的示例,显示了小鸡体重根据饮食的变化:

library(ggplot2)
library(dplyr)

# Calculate end vs start weights
df <- merge(filter(ChickWeight, Time==21), filter(ChickWeight, Time==0), by=c("Chick", "Diet"))
df$dWeight <- df$weight.x - df$weight.y

# Summary statistics: sd & mean
df.stat <- do.call(data.frame, 
                   aggregate(dWeight ~ Diet, 
                             data=df, 
                             FUN = function(x) c(SD=sd(x), MN=mean(x))))

ggplot(data = df) + 
    facet_grid(Diet ~ .) +
    geom_histogram(binwidth=10, aes(x=dWeight)) + 
    geom_vline(data=df.stat, aes(xintercept = dWeight.MN), color="black") + 
    geom_text(data=df.stat, aes(x=Inf, 
                                y=Inf, 
                                label = sprintf("\nmean = %4.1f\nsd = %4.1f", 
                                                dWeight.MN, dWeight.SD), 
                                hjust=1, 
                                vjust=1)) 
Run Code Online (Sandbox Code Playgroud)

在下图中,我只想突出显示以下文本:
在第 3 组中,“mean = 229.5”将变为“mean = 229.5
在第 4 组中,“sd = 43.9”将变为“sd = 43.9

在此输入图像描述

Rom*_*man 9

1

如果您不想在解析中浪费时间,您可以在绘图标签中添加一个条件,这样您就会非常接近。

数据

df.plot <- df %>%
    # Combine df and df.stat -
    # this also removes the calls to df.stat in your secondary geoms.
    left_join(df.stat, by = "Diet") %>%
    # Add global maximum of MN and global minimum of SD to every row.
    mutate(dWeight.MN.max = max(dWeight.MN),
           dWeight.SD.min = min(dWeight.SD))
Run Code Online (Sandbox Code Playgroud)

代码

ggplot(data = df.plot) + 
    facet_grid(Diet ~ .) +
    geom_histogram(binwidth = 10, aes(x = dWeight)) + 
    geom_vline(aes(xintercept = dWeight.MN), color="black") + 
    geom_text(aes(x = Inf, 
                  y = Inf, 
                  label = sprintf("\nmean = %4.1f", dWeight.MN), 
                  hjust = 1,
                  vjust = 1,
                  # bold if mean == mean maximum
                  fontface = ifelse(dWeight.MN == dWeight.MN.max, 2, 1))) +
    geom_text(aes(x = Inf, 
                  y = Inf, 
                  label = sprintf("\n\nsd = %4.1f", dWeight.SD), 
                  hjust = 1,
                  vjust = 1,
                  # bold if sd == sd minimum
                  fontface = ifelse(dWeight.SD == dWeight.SD.min, 2, 1))) +
    theme_gray()
Run Code Online (Sandbox Code Playgroud)

解释

fontface =你可以使你的geom_text() 斜体粗体。表达式中的ifelse()会检查该值是否等于全局最大值/最小值,= 2如果为 true,则将文本设置为粗体 ( );如果为 false,则将其保留为普通文本 ( = 1)。