R语言学习指南(8) 绘制具有显著性条形图

整理数据

使用ggplot2软件包中的测试数据集msleep,其中包括哺乳动物的睡眠时间。让我们首先加载包并查看数据:

library(tidyverse)
glimpse(msleep, width = 50)

由于我们对不同动物的睡眠时间感兴趣,因此我们感兴趣的变量为voresleep_total首先,我们需要重构数据,以便获得这些动物的平均睡眠时间和睡眠时间的标准差:
注:此处涉及的重要函数请通过dplyr官网检索

msleep %>% 
  group_by(vore) %>% summarise(mean_sleep = mean(sleep_total),
    sd_sleep   = sd(sleep_total)) 
# A tibble: 5 x 3
  vore    mean_sleep sd_sleep
  <chr>        <dbl>    <dbl>
1 carni        10.4      4.67
2 herbi         9.51     4.88
3 insecti      14.9      5.92
4 omni         10.9      2.95
5 NA           10.2      3.00

为了获得这些数据,我们首先通过group_by函数根据分组拆分数据,然后summarise函数进行统计计算

但是数据还不够完善。我们在数据中含有缺失值,并且动物名被缩写,
通过以下操作解决问题:

(sleep_mean_values <- msleep %>% group_by(vore) %>% 
summarise(mean_sleep = mean(sleep_total),
sd_sleep   = sd(sleep_total)) %>% drop_na() %>% 
  mutate(vore = case_when(vore == "insecti" ~ "insectivore",
      vore == "omni" ~ "omnivore",vore == "carni" ~ "carnivore",
      vore == "herbi" ~ "herbivore") %>% as.factor %>% 
      fct_relevel("insectivore", "omnivore","carnivore", "herbivore")))
# A tibble: 4 x 3
  vore        mean_sleep sd_sleep
  <fct>            <dbl>    <dbl>
1 carnivore        10.4      4.67
2 herbivore         9.51     4.88
3 insectivore      14.9      5.92
4 omnivore         10.9      2.95

首先通过case_when函数更改变量的名称,并将变量vore转换为因子。并使用函数fct_relevel自定义条形图顺序,确保食虫动物首先出现,然后是杂食动物,然后是食肉动物,最后是食草动物。我们选择此顺序是因为它对应于动物的平均值。最后,使用函数drop_na剔除NA值

创建第一个条形图

sleep_mean_values %>% 
  ggplot(aes(vore, mean_sleep)) +
    geom_col(aes(fill = vore), color = "black", width = 0.85) +
    geom_errorbar(aes(ymin = mean_sleep - sd_sleep,
    ymax = mean_sleep + sd_sleep),
    color = "#22292F",width = .1)

可视化是很好的第一步,但是仍然存在一些问题。例如,图例是多余的。我们已经知道红色条形图表示食虫动物。同样,x和y值实际上没有意义。我们需要重命名它们并使它们更有意义。而且,我们没有标题或标题告诉我们的读者误差棒的含义。另一个问题是条形图的颜色可能会产生误导。为什么食虫动物应该是红色的?让我们在下一个可视化中对这些进行修改

sleep_mean_values %>% 
  ggplot(aes(vore, mean_sleep)) +
  geom_col(aes(fill = vore), color = "black", width = 0.85) +
  geom_errorbar(aes(ymin = mean_sleep - sd_sleep,
                    ymax = mean_sleep + sd_sleep),color = "#22292F",width = .1) +
  scale_fill_grey(start = 0.3) +
  scale_y_continuous(limits = c(0, 26), expand = c(0, 0)) +
  guides(fill = FALSE) +theme_minimal() +
  labs(x = "Vore",y = "Mean Sleep",title = "Mean Sleep in Different Animals",
  caption = "Error bars indicate standard deviations")

让我们来看看这些变化

  • scale_fill_grey 函数将填充更改为灰度值,start = 0.3表示第一个填充不应为全黑,而应为灰色。
  • guides 函数删除填充图例
  • scale_y_contiuous 函数自定义y轴的高度
    因为需要添加p值,因此我们需要在最高柱上方留出更多空间,我们还希望定义x轴从0开始最后
  • labs 函数来添加标题,脚注以及x和y轴的标题。
p1 <- sleep_mean_values %>% 
  ggplot(aes(vore, mean_sleep)) +
  geom_col(aes(fill = vore), color = "black", width = 0.85) +
  geom_errorbar(aes(ymin = mean_sleep - sd_sleep,
                    ymax = mean_sleep + sd_sleep),color = "#22292F", width = .1) +
  scale_fill_grey(start = 0.3) +
  scale_y_continuous(limits = c(0, 26), expand = c(0, 0)) +
  guides(fill = FALSE) +theme_minimal() +
  labs(x = "Vore",y = "Mean Sleep",title = "Mean Sleep in Different Animals",
       caption = "Error bars indicate standard deviations") + 
  theme(plot.title = element_text(size = 20,face = "bold",
                                  margin = margin(b = 35)),
        plot.margin = unit(rep(1, 4), "cm"),
        axis.text = element_text(size = 12, color = "#22292F"),
        axis.title = element_text(size = 12, hjust = 1),
        axis.title.x = element_text(margin = margin(t = 12)),
        axis.title.y = element_text(margin = margin(r = 12)),
        axis.text.y = element_text(margin = margin(r = 5)),
        axis.text.x = element_text(margin = margin(t = 5)),
        plot.caption = element_text(size = 12, face = "italic",color = "#606F7B",
                                    margin = margin(t = 12)),
        axis.line = element_line(color = "#3D4852"),
        axis.ticks = element_line(color = "#3D4852"),
        panel.grid.major.y = element_line(color = "#DAE1E7"),
        panel.grid.major.x = element_blank(),
        panel.grid.minor.y = element_blank())
p1

添加轴刻度线和轴线

  • 使plot.title更大的余量增加至底部
  • 设置边距 plot.margin
  • 在轴标题和轴文本中添加边距 element_text
  • 将标题设为灰色,plot.caption
  • axis.line添加轴线。
  • axis.ticks添加轴刻度线
  • panel.grid.major.y 更改水平网格线的颜色,其他网格线已被删除

将p值添加为星号

使用ggpubr软件包,可以将显著性差异的结果自动添加到可视化中。但是,通常情况下需要自定义可视化效果,而使用这些软件包则更加麻烦。因此我们需要直接在ggplot2中进行操作

诀窍是在可视化中添加两行。每行需要四个点。左值较低,左值较高,右值较高,右值较低。因此,我们需要创建一个包含以下值的数据集:

p_value_one <- tibble(
  x = c("insectivore", "insectivore", "omnivore", "omnivore"),
  y = c(22, 23, 23, 22))

该线从食虫动物条中的y == 20开始。然后上升一点至23。然后该线到达杂食动物条并在y == 23处停止。然后下沉一点至22。让我们定义第二条假设线

p_value_two <- tibble(
  x = c("omnivore", "omnivore", "herbivore", "herbivore"),
  y = c(16, 17, 17, 16))

要将这些线添加到绘图中,需要使用geom_line函数在相应的数据集中添加两条线即可。另外需要在图的中间添加星号,使用annotate函数:

p1 + geom_line(data = p_value_one, aes(x = x, y = y, group = 1)) +
  geom_line(data = p_value_two, aes(x = x, y = y, group = 1)) +
  annotate("text", x = 1.5, y = 23.5, label = "***",size = 8, color = "#22292F") +
  annotate("text", x = 3, y = 17.5, label = "*",size = 8, color = "#22292F")


通过geom_line添加了一个新的数据集,另外定义美学group = 1以可视化单个线条

https://mp.weixin.qq.com/s/W8jCZHdrf7TB2M0Khpu7dQ

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容