在R中逐步建立一个条形图

时间:2017-05-28 21:12:08

标签: r for-loop plot bar-chart

我正在尝试制作一个图表,显示三明治店不同类型三明治的卡路里计数。即地铁与吉米约翰等人的素食三明治有多少卡路里

我想把它想象成一个条形图,

  • 每个三明治都有一个酒吧卡路里计数

  • 明显按类型分组三明治素食烤牛肉等,其中每个组根据不同分组供应商。

我的数据看起来像这样(EDITED表示可重复性):

cleaninput <- data.frame ("type" = c("italian", "turkey", "roastbeef", "club", "veggie", "italian", "turkey", "roastbeef", "veggie"), 
"vendor" = c( "subway",  "subway",  "subway",  "subway",  "subway",  "jimmyjohns", "jimmyjohns", "jimmyjohns", "jimmyjohns"),
"calories" = c(410,280,320,310,230,640,510,540,690))

我尝试迭代这样的数据,其中cleaninput是我的data.frame

#set up barplot
barplot(height = mean(cleaninput[['calories']]))
#iterate over sandwich types
for (t in levels(cleaninput[['type']]))
{
  cat(t,"\n")

  barplot(cleaninput[cleaninput[['type']]==t,][['calories']], add = TRUE)
}

想法是首先设置条形图,然后迭代地为每个三明治类型添加条形图。我understood add设置来执行此操作。我使用linespoints命令使用for和{{1}}命令并使用下面的示例复制了常规绘图,这也是我想要转移到条形图中的内容。

enter image description here

然而,它不起作用,因为它似乎将所有的条形图相互叠加(参见下面的输出)。

我的问题

  • (怎么样)我能解决这个问题吗?我希望使用base R而不是ggplot来使这更便携。

  • 有没有比{{1}}循环更好的方法?

我查看了tutorials的分组条形图,但没看到它们是如何转换为我的问题的。

当前输出:

ugly R plot

2 个答案:

答案 0 :(得分:1)

这是你在找什么?

type<-c("italian","turkey","roastbeef","club","veggie","italian","turkey","roastbeef","veggie")
vendor<-c(rep("subway",5),rep("jimmyjohns",4))
calories<-c(410,280,320,310,230,640,510,540,690)
size<-c(rep(6,5),rep(8,4))

cleaninput<-data.frame(type,vendor,calories,size)

#first you calculate the mean by type using by function (base package)  

calor.by.type<-by(cleaninput$calories,INDICES = list(cleaninput$type),FUN = mean)

#then you plot the result from by function

barplot(calor.by.type,main="by function")

enter image description here

答案 1 :(得分:1)

以下是基本情节中的解决方案,因为这是您对ggpltot2的偏好。

第一步是将您的数据以宽幅格式用于基础图,用于条形图,例如:使用reshape2::dcasttidyr::spread

library(tidyr)
library(tidyverse)
cleaninput_spread <- cleaninput %>% spread(type, calories) %>% remove_rownames %>% column_to_rownames(var="vendor")
cleaninput_spread

>            club italian roastbeef turkey veggie
> jimmyjohns   NA     640       540    510    690
> subway      310     410       320    280    230

将NA值替换为0:

cleaninput_spread[is.na(cleaninput_spread)] <- 0

基地堆积的条形图:

barplot(as.matrix(cleaninput_spread), main="Calories per Sandwich, by shop",
        xlab="Sandwich", ylab="Calories",
        col=c("darkblue","red"),
        legend = rownames(cleaninput_spread))

enter image description here