我正在尝试制作一个图表,显示三明治店不同类型三明治的卡路里计数。即地铁与吉米约翰等人的素食三明治有多少卡路里
我想把它想象成一个条形图,
每个三明治都有一个酒吧卡路里计数
明显按类型分组三明治:素食,烤牛肉等,其中每个组根据不同分组供应商。
我的数据看起来像这样(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
设置来执行此操作。我使用lines
和points
命令使用for
和{{1}}命令并使用下面的示例复制了常规绘图,这也是我想要转移到条形图中的内容。
然而,它不起作用,因为它似乎将所有的条形图相互叠加(参见下面的输出)。
我的问题
(怎么样)我能解决这个问题吗?我希望使用base R而不是ggplot来使这更便携。
有没有比{{1}}循环更好的方法?
我查看了tutorials的分组条形图,但没看到它们是如何转换为我的问题的。
当前输出:
答案 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")
答案 1 :(得分:1)
以下是基本情节中的解决方案,因为这是您对ggpltot2的偏好。
第一步是将您的数据以宽幅格式用于基础图,用于条形图,例如:使用reshape2::dcast
或tidyr::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))