R语言中的分组柱状图和误差线

R语言中的分组柱状图和误差线 给数据可视化增添色彩和准确性

数据准备和可视化的综合指南

Photo by Paulius Dragunas on Unsplash

条形图是一个重要且广泛使用的可视化工具,有几个原因。它们非常适合可视化数值和分类变量之间的关系,易于理解不同类别或组之间的差异。它们可以表示计数、频率、比例和百分比,因此适用于各种数据类型。

在 R 中,我们有能力分析分类数据并通过条形图来表示。然而,初学者在进行 R 编程时常常遇到估计均值、标准误和创建带有误差线的分组条形图方面的挑战。为了应对这些挑战,必须对数据类型、数据结构以及数据分析所需的操作有基本的理解。

在本教程中,我们首先创建一个简单的数据集,以了解不同种类的数据类型以及如何将其转换为适合数据分析的格式。然后,我们将深入探讨如何估计均值和标准误。接下来,我们将继续创建一个带有误差线的分组条形图。为了帮助初学者,我将逐步解析代码,确保对编程过程有全面的理解。

我假设读者已经熟悉安装和加载 R 包的过程。如果不熟悉,请参考 STHDA 获取指引。

让我们立即开始创建数据集,对其进行修改和可视化。首先按以下示例加载必要的库。

library(tidyverse)library(ggthemes)library(ggpubr)

tidyverse 是一组核心的 R 包集合,包括用于数据操作和分析的 dplyr 和用于数据可视化的 ggplot2ggthemes 提供了替代主题和主题组件,以样式化 ggplot2 图表。ggpubr 提供 ggsave() 函数,可保存具有可定制尺寸、分辨率和文件格式的图表。要进一步探索这些包,只需点击提供的超链接。

创建数据框架:

在下面的代码中,data.frame() 函数使用三列初始化了一个名为 df 的数据框架:AnimalsCategoryCounts

df <- data.frame(Animals = c("猫", "狗", "牛",                              "猫", "狗", "牛",                             "猫", "狗", "牛",                             "猫", "狗", "牛"),                Category = c("家养", "家养", "家养",                             "家养","家养","家养",                             "流浪", "流浪", "流浪",                              "流浪", "流浪", "流浪"),                  Counts = c("28", "22", "45",                              "30", "18", "43",                              "40", "65","10",                             "35", "72", "8"))

💡 你也可以在 Excel 中创建数据框架并将文件导入到 R。

我们使用 view() 函数查看数据框架 df

view(df)

Animals’ 列包含不同种类动物的名称。这一列中有三种独特的动物:“猫”、“狗”和“牛”。我们对每种动物进行了四次抽样,总共有 12 行。‘Category’ 列将动物分类为“家养”或“流浪”。有六个“家养”和六个“流浪”。‘Counts’ 列表示给定 ‘Category’ 和 ‘Animals’ 列中每种动物的计数。

数据类型与数据操作

在R中,理解变量的数据类型非常重要,因为不同的操作和函数可能适用于不同类型的数据类型。在我们的数据集中,有两种数据类型:字符数值。字符数据类型用于处理文本数据,如姓名、标签、描述和文本信息。数值数据类型表示数值,包括整数和实数(浮点数)。

让我们使用glimpse()函数对数据框df进行概览,了解变量在数据框中的数据类型。

glimpse(df)

Rows: 12Columns: 3$ Animals  <chr> "cats", "dogs", "cows", "cats", "dogs", "cows", "cats", "dogs", "cows", "…$ Category <chr> "Domestic", "Domestic", "Domestic", "Domestic", "Domestic", "Domestic", "…$ Counts  <chr> "28", "22", "45", "30", "18", "43", "40", "65", "10", "35", "72", "8"

我们可以看到df数据框包含12行(观测值)和3列(变量)。值得注意的是,AnimalsCategory变量被标识为字符数据类型,表示为<chr>。这些变量中的值用双引号括起来,表示它们是字符字符串。然而,有趣的观察是Counts变量也被标识为字符数据类型。这似乎是意外的,因为这个变量中的值实际上是数值,而不是字符字符串。这种数据类型的错误分类可能在进行数值操作时引起问题。为了解决这个问题并方便数值操作,我们必须将Counts变量转换为数值数据类型。

你可能已经注意到,当我最初创建数据框df时,我故意用双引号括起来将数值转换为字符数据类型,以便Counts变量成为字符数据类型。现在我们清楚了数据框的结构,让我们继续解决这个问题。我们将通过将df数据框中的Counts变量从当前的字符数据类型转换为数值类型来解决这个问题。

df$Counts <- as.numeric(df$Counts)

df$Counts选择df数据框中的Counts列。as.numeric()将输入转换为数值数据类型。

glimpse(df)

Rows: 12Columns: 3$ Animals  <chr> "cats", "dogs", "cows", "cats", "dogs", "cows", "cats", "dogs", "cows", "…$ Category <chr> "Domestic", "Domestic", "Domestic", "Domestic", "Domestic", "Domestic", "…$ Counts  <dbl> 28, 22, 45, 30, 18, 43, 40, 65, 10, 35, 72, 8

现在Counts变量被标识为数值数据类型,表示为<dbl>,通常简称为“double”。该变量中的值不用引号括起来,表示它们是数值,而不是字符字符串。

<dbl>代表“双精度浮点数”,它是一种用于存储实数并对实数进行算术运算(包括小数)的数值数据类型。

估计均值和标准误差

下面的代码通过对现有数据框df进行数据汇总和聚合,创建一个名为mean_df的新数据框。

mean_df <- df %>% group_by(Animals, Category) %>% summarise(mean= mean(Counts), se = sd(Counts)/sqrt(n()))

让我们逐步分解代码:

     

             

  1. 管道(%>%)操作符将现有的数据框df传递给代码的下一部分。它将df设置为后续操作的输入。在R中,管道(%>%)运算符将左侧函数的结果作为第一个参数传递给右侧的下一个函数,从而能够清晰、连续地通过一系列操作链接在一起。
  2.          

  3. group_by()函数根据AnimalsCategory列对数据框进行分组,基于这两个变量的唯一组合,在数据框内创建子组。
  4.          

  5. summarise()函数估算了均值和标准误差,并将其分配给新变量:meanse
  6.      

     

             

  • mean()函数计算了由group_by()操作创建的每个子组中的Counts列的均值(平均值)。
  •          

  • sd()函数计算了每个子组的Counts列的标准误差(se)。标准误差通过将Counts列的标准差除以样本大小的平方根(sqrt(n()))来计算。
  •      

让我们来看看数据框mean_df的摘要:

glimpse(mean_df)

行数:6 列数:4
$ Animals  <chr> "cats", "cats", "cows", "cows", "dogs", "dogs"
$ Category <chr> "Domestic", "Stray", "Domestic", "Stray", "Domestic", "Stray"
$ mean     <dbl> 29.0, 37.5, 44.0, 9.0, 20.0, 68.5
$ se       <dbl> 1.0, 2.5, 1.0, 1.0, 2.0, 3.5

完成!我们现在有了四列或变量,包括两个根据我们的分组条件计算的新变量meanse。让我们使用这个新数据框“mean_df”继续进行数据可视化。

可视化数据

下面的代码接受数据框mean_df并使用%>%操作符将其传递给ggplot2,从而创建一个分组柱状图。

barplot <- mean_df %>% ggplot(aes(x = Animals, y = mean, fill = Category)) + geom_col(position = "dodge", width = 0.5, alpha = 0.5, color = "black", size = 0.1)

💡请注意,管道(%>%)操作符可以在数据操作和分析中用于将多个操作链接在一起,但不能在数据可视化过程中用于在ggplot2函数内部添加附加图层。而是使用上面所示的‘+’符号。

让我们逐步解析代码:

             

  1. aes()函数是‘aesthetic’的缩写,用于指定数据集中的变量如何映射到绘图的视觉美学特征。在这种情况下,它指定x轴表示Animals变量,y轴表示mean变量,并根据Category变量填充柱形颜色。
  2.          

  3. geom_col()函数根据mean列的值计算每个柱子的高度。以下是在geom_col()函数中使用的参数的详细说明:
  4.      

  • position = "dodge":它指定条形应按照Category变量进行分组(侧边对齐)。这就是创建一个分组条形图的方式。
  • width = 0.5:它确定条形的宽度。在这种情况下,条形的宽度为0.5。
  • alpha = 0.5:它控制条形的透明度。alpha值为0.5使条形具有一定的透明性。
  • color = "black":它将条形的边框颜色设置为黑色。
  • size = 0.1:它指定条形周围的边框的大小。在这种情况下,边框将相对较薄。

这些参数的组合可以自定义条形图中条形的外观,使它们变得更加细小、有一定的透明度,边框为黑色,并且以侧边对齐的方式呈现不同的类别,这可以增强数据的视觉表示效果。

让我们来看看图形:

plot(bar_chart)

太好了!我们成功创建了一个条形图,但是目前的条形缺乏标准误差。让我们将标准误差纳入图中。

添加标准误差到条形上并自定义条形颜色

首先复制并粘贴上面的代码,然后按照下面的示例将geom_errorbar()函数添加到其中。

barplot <- mean_df %>%   ggplot(aes(x = Animals, y = mean, fill = Category))+  geom_col( position = "dodge", width = 0.5, alpha = 0.7, color = "black", size = 0.1)+  geom_errorbar(aes(ymin = mean-se, ymax = mean+se),                position =  position_dodge(width = 0.5), width = 0.2) 

让我们分解一下geom_errorbar()函数中使用的组件:

  1. yminymax定义了根据计算得到的平均值和标准误差的下限和上限值。
  2. position参数设置为position_dodge(),以便将错误条形以侧边对齐的方式放置,并使用width = 0.5设置侧边对齐宽度。尝试调整宽度参数,观察条形位置的变化。
  3. width = 0.2设置了错误条形的宽度。在这种情况下,错误条形的宽度为0.2。

让我们来看看图形:

plot(barplot)

很棒!我们现在创建了一个带有误差条的分组条形图。这个图表几乎可以用于出版,但是进行一些微小的调整可以大大提升其外观。例如,您可能已经注意到条形和x轴标签之间有一段间隙。让我们将其删除。此外,更改条形颜色,将图例放在图表内部,并提供一个预定义的主题以获得简洁明了的视觉效果,将改善整体呈现效果。

生成出版级别的图表

让我们从复制上面的代码开始,然后添加额外的图层,如下所示。

barplot <- mean_df %>%   ggplot(aes(x = Animals, y = mean, fill = Category))+  geom_col( position = "dodge", width = 0.5, alpha = 0.7, color = "black", size = 0.1)+  geom_errorbar(aes(ymin = mean-se, ymax = mean+se),                position =  position_dodge(width = 0.5), width = 0.2)+  scale_y_continuous(expand = expansion(0),                     limits = c(0,100))+  scale_fill_manual(values = c("blue", "gray"),                    name = NULL)+ # NULL移除图例标题"Category"。  theme_par()+  theme(legend.position = c(0.2, 0.80))

让我们一步一步来解析代码:

  1. scale_y_continuous()expand参数设置为expansion(0),以去除y轴限制周围的任何填充,并且limits参数设置为c(0, 100),将y轴限制设置为0到100。
  2. scale_fill_manual(values)用于自定义填充色系的图例(柱状图的颜色),并将图例标题设置为NULL,以移除图例标题“Category”
  3. theme_par()用于自定义绘图主题,提供干净的白色背景和紧凑的图形效果。它有其优点和缺点。
  4. theme()中的legend.position参数设置为c(0.2, 0.80),以指定图例在图中的位置。可以尝试不同的值来更好地理解这个参数。

💡 预定义的主题(如theme_par())将覆盖之后应用的主题组件。为了解决这个问题,我们在theme_par()函数之后添加了theme(legend.position)

让我们来看一下图表:

plot(barplot)

这是一个外观吸引人且适合出版的带有误差棒的柱状图。该图有效地展示了动物种群的变化。在“流浪”类别中,狗的数量超过猫和奶牛,而在“家养”类别中,奶牛明显多于猫和狗。

保存图表以便出版

下面的代码利用了ggpubr库中的ggsave()函数。为了保存图表,我们需要指定ggplot对象bar_chart,然后使用所需的图形格式指定文件名。在这个示例中,我使用了文件名“barchart_animals.tiff”,将图表保存为TIFF图像。我还设置了“width”和“height”的英寸尺寸以及“dpi”(每英寸点数)以设置分辨率。

ggsave(bar_chart, filename = "barchart_animals.tiff", width = 5, height = 4, dpi = 300)

现在,您已经可以使用标准误差棒创建适合出版的柱状图了。享受创作的过程,并乐在其中!🎉✨