R - 如何向 ggplot2 饼图图例添加百分比?

时间:2021-04-13 01:00:27

标签: r ggplot2

我想在我的图例中添加百分比(四舍五入到 1 位小数)。 例如,“MSFT 8.3%”。 我不希望它们出现在饼图中,因为当有太多带有小 % 值的切片时,它看起来很奇怪。

这是我的代码:

library(ggplot2)

tickers <- c("msft","xic.to","fb","aapl","goog","nflx","aal","bmo","xef.to","xec.to","vsp.to","mcd")
Weights <- rep(1/12*100,12)

tickers <- tickers[order(Weights)]; Weights <- sort(Weights)
tickers.factor <- factor(tickers, levels = as.character(tickers))

ypos <- cumsum(Weights) - 0.5*Weights
ypos <- 100 - ypos

ggplot() + theme_bw() +
  geom_bar(aes(x = "", y = Weights, fill = tickers.factor),
           stat = "identity", color = "white") + 
  coord_polar("y", start = 0) +
  ggtitle("Portfolio Weights") +
  theme(plot.title = element_text(hjust = 0.5, size = 20),
        axis.title = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        panel.grid = element_blank(),
        panel.border = element_blank()) +
  guides(fill = guide_legend(reverse = TRUE)) + 
  #scale_fill_brewer(palette = "PiYG", name = "Tickers") +
  theme(legend.text = element_text(size = 12),
        legend.title = element_text(hjust = 0.5, size = 15),
        legend.key.size = unit(0.8,"cm")) 

谢谢

2 个答案:

答案 0 :(得分:1)

我使用 scales::percent 来格式化百分比。



library(ggplot2)

tickers <- c("msft","xic.to","fb","aapl","goog","nflx","aal","bmo","xef.to","xec.to","vsp.to","mcd")
Weights <- rmultinom(n = 1, size = 100, prob = rep(1/length(tickers), length(tickers)))

tickers <- tickers[order(Weights)]; Weights <- sort(Weights)
Percent <- factor(paste(tickers, scales::percent(Weights/100, accuracy = 0.01)), paste(tickers, scales::percent(Weights/100, accuracy = 0.01)))

ypos <- cumsum(Weights) - 0.5*Weights
ypos <- 100 - ypos

ggplot() + theme_bw() +
  geom_bar(aes(x = "", y = Weights, fill = Percent),
           stat = "identity", color = "white") + 
  coord_polar("y", start = 0) +
  ggtitle("Portfolio Weights") +
  theme(plot.title = element_text(hjust = 0.5, size = 20),
        axis.title = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        panel.grid = element_blank(),
        panel.border = element_blank()) +
  guides(fill = guide_legend(reverse = TRUE)) + 
  #scale_fill_brewer(palette = "PiYG", name = "Tickers") +
  theme(legend.text = element_text(size = 12),
        legend.title = element_text(hjust = 0.5, size = 15),
        legend.key.size = unit(0.8,"cm")) 

答案 1 :(得分:0)

这是一种解决方案:

library(tidyverse)

tickers <- c("msft","xic.to","fb","aapl","goog","nflx","aal","bmo","xef.to","xec.to","vsp.to","mcd")
Weights <- rep(1/12*100,12)

# Combine tickers and weights
tickers_and_weights <- paste(tickers, paste(round(Weights, 1), "%", sep = ""))
# Convert to a factor
`Tickers and Weights` <- factor(tickers_and_weights, levels = tickers_and_weights)

ypos <- cumsum(Weights) - 0.5*Weights
ypos <- 100 - ypos

ggplot() + theme_bw() +
  geom_bar(aes(x = "", y = Weights, fill = `Tickers and Weights`),
           stat = "identity", color = "white") + 
  coord_polar("y", start = 0) +
  ggtitle("Portfolio Weights") +
  theme(plot.title = element_text(hjust = 0.5, size = 20),
        axis.title = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank(),
        panel.grid = element_blank(),
        panel.border = element_blank()) +
  #guides(fill = guide_legend(reverse = TRUE)) + 
  #scale_fill_brewer(palette = "PiYG", name = "Tickers") +
  theme(legend.text = element_text(size = 12),
        legend.title = element_text(hjust = 0.5, size = 15),
        legend.key.size = unit(0.8,"cm"))

example_6.png

相关问题