【问题标题】:Pie chart with label shown inside and percentage shown outside the pie饼图内部显示标签,饼图外部显示百分比
【发布时间】:2019-11-07 16:20:38
【问题描述】:

我有这样的数据,我需要画饼图:

# Creat bar chart for jam language
library("ggplot2")  # Data visualization
library("dplyr")    # Data manipulation
library("RColorBrewer")
myPalette <- brewer.pal(5, "Set2") 


all_languages <- data.frame(
  Languages = c("English", "French", "Spanish", "Portuguese", "Others"),
  n = c(81, 4, 3, 2, 3),
  prop = c(87.1, 4.3, 3.2, 2.2, 3.2)
)

# Add label position
all_languages  <-all_languages %>%
  arrange(desc(Languages)) %>%
  mutate(lab.ypos = cumsum(n) - 0.5*n)


ggplot(all_languages , aes(x = "", y = n, fill = Languages)) +
  geom_bar(width = 1, stat = "identity", color = "white") +
  coord_polar("y", start = 0)+
  geom_text(aes(y = lab.ypos, label = n), color = "white")+
  scale_fill_manual(values = myPalette) +
  theme_void()

这是我的图表:

现在我还想在相应切片的图表外添加百分比。所以我的英文幻灯片的圆周外会有87.1%。我的百分比存储在all_languages$prop。我该怎么做?

其次,如何将标签从中心移开一点?这是因为在较小的切片中,数字标签过于杂乱。

尝试:我确实尝试遵循这个答案How can I put the labels outside of piechart?

但它会抛出一个错误,指出缺少 2 行...特别是,我的西班牙语和葡萄牙语切片没有标签。另外,我的情况不同,因为我想要里面的标签和外面的百分比。

我尝试使用以下代码来遵循该答案:

all_languages <-all_languages %>%
  arrange(desc(Languages)) %>%
  mutate(end = 2 * pi * cumsum(prop)/sum(prop),
       start = lag(end, default = 0),
       middle = 0.5 * (start + end),
       hjust = ifelse(middle > pi, 1, 0),
       vjust = ifelse(middle < pi/2 | middle > 3 * pi/2, 0, 1))

ggplot(all_languages) + 
  geom_arc_bar(aes(x0 = 0, y0 = 0, r0 = 0, r = 1,
                   start = start, end = end, fill = Languages)) +
  geom_text(aes(x = 1.05 * sin(middle), y = 1.05 * cos(middle), label = prop,
                hjust = hjust, vjust = vjust)) +
  coord_fixed() +
  scale_x_continuous(limits = c(-1.5, 1.4),  # Adjust so labels are not cut off
                     name = "", breaks = NULL, labels = NULL) +
  scale_y_continuous(limits = c(-1, 1),      # Adjust so labels are not cut off
                     name = "", breaks = NULL, labels = NULL)

我收到以下警告

警告消息:已删除 2 行包含缺失值 (geom_text)

我的馅饼缺少 2 个切片的标签:

最终决定:我会按照下面 Bappa Das 的回答,稍微修改一下标签。我会将计数和百分比都放在饼图之外。

【问题讨论】:

  • 这能回答你的问题吗? How can I put the labels outside of piechart?
  • 嗨,我确实尝试过,但它会抛出一个错误,提示缺少 2 行...特别是,我的西班牙语和葡萄牙语切片没有标签。另外,我的情况不同,因为我希望在内部使用 BOTH 标签,在外部使用百分比
  • 您想要 2 个具有不同定位的独立标签这一事实最初并不清楚。我不确定您正在尝试什么导致您出错 - 如果这是您需要帮助调试的特定事情,您可以将其添加到问题中。不要设置x = "",而是使用一个虚拟数值,这样您就可以设置切片的位置(尝试x = 0)和相对于该切片的外部文本的位置(尝试x = 0.6)。
  • 嗨,我已经更新了我用来遵循该答案的确切代码。我收到了缺少行的警告。代码可以原样复制。
  • 酷,既然你已经更清楚你要做什么,我要撤回我的近距离投票

标签: r ggplot2 pie-chart


【解决方案1】:

您可以将以下代码与base R一起使用

library(RColorBrewer)
Languages = c("English", "French", "Spanish", "Portuguese", "Others")
n = c(81, 4, 3, 2, 3)
prop = c("87.1", "4.3", "3.2", "2.2", "3.2")

lbls <- paste(prop,"%",sep=" ")
lgd <- c("English", "French", "Spanish", "Portuguese", "Others")
cols = brewer.pal(n = length(prop), name = 'Set3')
pie(n, labels = lbls, col=cols)
legend("topright", legend=lgd, cex=0.9, bty = "n", fill = cols)

这是你想要的吗?

【讨论】:

  • 您好,您的代码在pie 函数处抛出错误:Error in pie(prop, labels = lbls, col = cols) : 'x' values must be positive.
猜你喜欢
  • 1970-01-01
  • 2016-07-24
  • 1970-01-01
  • 1970-01-01
  • 2022-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多