每行数据帧的单个条形图

时间:2014-05-31 15:57:33

标签: r ggplot2 bar-chart

我有一个csv文件,如下所示:

Name,Count1,Count2,Count3
application_name1,x1,x2,x3
application_name2,x4,x5,x6

x变量表示数字,而application_name变量表示不同应用程序的名称。

现在我想通过使用ggplot2为每一行制作一个条形图。条形图应该将application_name作为标题。 x轴应显示Count1,Count2,Count3,y轴应显示相应的值(x1,x2,x3)。

我希望每行都有一个条形图,因为我必须将不同的图存储在不同的文件中。所以我想我不能使用"融化"。

我希望有类似的东西:

for each row in rows {
  print barplot in file
}

感谢您的帮助。

2 个答案:

答案 0 :(得分:5)

您可以使用melt重新排列数据,然后使用facet_wrapfacet_grid获取每个应用程序名称的单独图表

library(ggplot2)
library(reshape2)

# example data
mydf <- data.frame(name = paste0("name",1:4), replicate(5,rpois(4,30)))
names(mydf)[2:6] <- paste0("count",1:5)

# rearrange data
m <- melt(mydf)

# if you are wanting to export each plot separately
# I used facet_wrap as a quick way to add the application name as a plot title

for(i in levels(m$name)) {
      p <- ggplot(subset(m, name==i), aes(variable, value,  fill = variable)) + 
             facet_wrap(~ name) +
             geom_bar(stat="identity", show_guide=FALSE)

      ggsave(paste0("figure_",i,".pdf"), p)
}

# or all plots in one window
ggplot(m, aes(variable, value,  fill = variable)) + 
               facet_wrap(~ name) +
               geom_bar(stat="identity", show_guide=FALSE)

答案 1 :(得分:0)

在准备之前我没有看到@ user20650的好答案。它几乎完全相同,只是我使用plyr::d_ply来保存而不是循环。我相信dplyr::do()是另一个不错的选择(你先group_by(Name))。

yourData <- data.frame(Name = sample(letters, 10),
                       Count1 = rpois(10, 20),
                       Count2 = rpois(10, 10),
                       Count3 = rpois(10, 8))
library(reshape2)
yourMelt <- melt(yourData, id.vars = "Name")

library(ggplot2)
# Test a function on one piece to develope graph
ggplot(subset(yourMelt, Name == "a"), aes(x = variable, y = value)) +
    geom_bar(stat = "identity") +
    labs(title = subset(yourMelt, Name == 'a')$Name)


# Wrap it up, with saving to file
bp <- function(dat) {
    myPlot <- ggplot(dat, aes(x = variable, y = value)) +
        geom_bar(stat = "identity") +
        labs(title = dat$Name)
    ggsave(filname = paste0("path/to/save/", dat$Name, "_plot.pdf"),
           myPlot)
}

library(plyr)
d_ply(yourMelt, .variables = "Name", .fun = bp)