📜  如何在 R 中使用 ggplot2 创建带有百分比标签的饼图?(1)

📅  最后修改于: 2023-12-03 15:38:24.633000             🧑  作者: Mango

如何在 R 中使用 ggplot2 创建带有百分比标签的饼图?

ggplot2 是一个基于语法的绘图工具,可用于创建各种图表类型,包括饼图。在这个指南中,我将向您展示如何使用 ggplot2 在 R 中创建带有百分比标签的饼图。

准备

首先,我们需要准备一些模拟数据来演示。以下是一个简单的数据框,其中包含了一些收入类别和相应的支出金额。

set.seed(123)
df <- data.frame(
  category = c("Housing", "Transportation", "Food", "Entertainment", "Other"),
  amount = abs(rnorm(5, 5000))
)
df
创建饼图

接下来,我们将使用 ggplot2 包中的 geom_bar 函数来创建饼图。我们需要将数据框传递给 ggplot 函数,并使用 aes 函数来指定我们要绘制的图表元素。

library(ggplot2)
ggplot(df, aes(x = "", y = amount, fill = category)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar(theta = "y") +
  theme_void() +
  scale_fill_hue(labels = df$category)

首先,我们调用 ggplot 函数并指定我们要使用 df 中的数据。我们使用 aes 函数指定我们要绘制的图表元素: x = '' 表示我们不想在 x 轴上显示任何标签, y = amount 表示我们要用 amount 列来绘制饼图。最后,我们使用 fill = category 来指定我们要将数据按 category 列进行分组。

接下来,我们添加 geom_bar 函数,并将 stat 参数设置为 identity。这告诉 ggplot2 我们想要以每个类别中的 amount 列中的实际值来绘制条形。我们设置 width = 1 来确保饼图的饼厚度适当。

然后,我们使用 coord_polar 函数将坐标系转换为极坐标。这是饼图的基本要求。

接下来,我们调用 theme_void 函数来移除默认 ggplot2 主题中的所有图形元素,只留下坐标系。

最后,我们使用 scale_fill_hue 函数来指定饼图中使用的颜色,以及 labels 参数来指定每个类别的标签。

添加百分比标签

我们已经创建了一个基本的饼图。接下来,我们将添加一些带有百分比标签的注释,以便更好地描述数据。

ggplot(df, aes(x = "", y = amount, fill = category)) +
  geom_bar(stat = "identity", width = 1) +
  coord_polar(theta = "y") +
  theme_void() +
  geom_text(aes(label = paste(round(amount/sum(amount) * 100), "%"), 
                x = 1.3 * cos((cumsum(amount) - 0.5 * amount) / sum(amount) * 2 * pi), 
                y = 1.3 * sin((cumsum(amount) - 0.5 * amount) / sum(amount) * 2 * pi)), 
            size = 4, fontface = "bold") +
  scale_fill_hue(labels = df$category)

此代码与之前的代码非常相似,但有两个新元素。首先,我们使用 geom_text 函数为每个饼块添加标签。我们使用 paste 函数将百分比与标签串联在一起,并使用 round 函数将结果四舍五入到整数。

然后,我们使用三角函数和 cumsum 函数计算出每个标签的位置。具体来说,对于每个饼块,我们计算出其总和的中心角度,并将其减去该饼块实际值的一半,以计算出该饼块的起始角度。然后,我们将该角度除以总和的 2π,并乘以三角函数,使其与极坐标对应。

最后,我们设置 size 参数来调整标签的大小,以及 fontface 参数来使其更清晰易读。

至此,我们已经创建了一个带有百分比标签的饼图!