R 用 mtcars 编程饼图

问题描述

我需要帮助来使用 mtcars$mpg 和 mtcars$carb 创建饼图。我想做这个;我想创建一个饼图,显示每个化油器的总 mpg 值。让我多解释一下;在饼图中,每个切片将根据总 mpg 值显示化油器 (1,2,3,4,6,8) 的值和形状。我写了一些命令,但我如何用这些创建一个 tablo,我应该如何继续?我需要最好的简单方法。请帮我。谢谢...

> carb1 <- filter(mtcars,carb==1)
> carb2 <- filter(mtcars,carb==2)
> carb3 <- filter(mtcars,carb==3)
> carb4 <- filter(mtcars,carb==4)
> carb6 <- filter(mtcars,carb==6)
> carb8 <- filter(mtcars,carb==8)
> summpg_carb1 <- sum(carb1$mpg)
> summpg_carb2 <- sum(carb2$mpg)
> summpg_carb3 <- sum(carb3$mpg)
> summpg_carb4 <- sum(carb4$mpg)
> summpg_carb6 <- sum(carb6$mpg)
> summpg_carb8 <- sum(carb8$mpg)

解决方法

您尝试在额外的一行代码中为 mtcars$carb 的六个值中的每一个求和的尝试规模不大,而且很容易出错并且整体风格很糟糕。在 R 中有多种聚合数据的方法,其中包括函数 aggregate

aggr <- aggregate(mtcars$mpg,list(mtcars$carb),sum)
print(aggr)
pie(aggr$x,aggr$Group.1)

by 函数(在这种特殊情况下甚至更全面):

b <- by(mtcars$mpg,mtcars$carb,sum)
pie(b,names(b))
,

使用 ggplot2plotly

# Install pacakges if they are not already installed: necessary_packages => vector
necessary_packages <- c("ggplot2","plotly")

# Create a vector containing the names of any packages needing installation:
# new_pacakges => vector
new_packages <- necessary_packages[!(necessary_packages %in%
                                       installed.packages()[,"Package"])]

# If the vector has more than 0 values,install the new pacakges
# (and their) associated dependencies:
if(length(new_packages) > 0){install.packages(new_packages,dependencies = TRUE)}

# Initialise the packages in the session: list of boolean => stdout (console)
lapply(necessary_packages,require,character.only = TRUE)

# Aggregate the data.frame: 
agg_df <- transform(aggregate(mpg ~ carb,mtcars,sum),carb = as.factor(paste(
                      carb,paste0(round(prop.table(mpg),4) * 100,"%"),sep = " - "
                    )))

# Chart aggregated data.frame: 
ggplot(agg_df,aes(x = "",y = mpg,fill = carb)) +
  geom_bar(width = 1,stat = "identity") +
  scale_fill_viridis_d(option = "viridis") +
  coord_polar("y",start = 0) +
  ylab("") +
  xlab("Total MPG") +
  ggtitle("Total MPG by Carburetor") +
  theme(
    panel.grid.major = element_blank(),panel.grid.minor = element_blank(),panel.border = element_blank(),panel.background = element_blank()
  ) 

# Plotly chart: 
plot_ly(aggregate(mpg ~ carb,labels = ~sort(carb),values = ~mpg,type = "pie",marker = list(colors=c("#440154FF","#404788FF","#2E6E8EFF","#20A486FF","#44BF70FF","#FDE725FF","#20A387FF")),textinfo = "label+percent",textposition = "outside") %>% 
  layout(title = "Total MPG by Carburetor")
,

这类问题往往会在 stackoverflow 上得到三种不同的答案。一种用于标准 R,一种用于通过 dplyr 增强的 R,一种用于通过 data.table 包增强的 R。第一个 dplyr 反应是 stefan 的评论。为完整起见,这是一个 data.table 的答案来四舍五入。 data.table 倾向于为感兴趣的人提供最短的代码,而且通常是运行速度最快的代码,这对于 mtcars 等小型数据集毫无价值。

library(data.table)

mtcars.dt <- data.table(mtcars)
aggr <- mtcars.dt[,sum(mpg),carb][order(carb),]
pie(x = aggr$V1,labels = aggr$carb)
aggr

您上面的“手册”方法已转换为 data.table,作为一个完整的示例,它可能如下所示:

library(data.table)
mtcars.dt <- data.table(mtcars)
aggr <- c( mtcars.dt[carb == 1,sum(mpg)],mtcars.dt[carb == 2,mtcars.dt[carb == 3,mtcars.dt[carb == 4,mtcars.dt[carb == 6,mtcars.dt[carb == 8,sum(mpg)]) 
perc <- 100 * round(aggr / sum(aggr),3)
           
pie(aggr,labels = paste(perc,col = rainbow(6))
legend("topright",fill = rainbow(6),legend = c(1,2,3,4,6,8),title = "carb")