【问题标题】:Single barplot for each row of dataframe每行数据框的单个条形图
【发布时间】:2014-05-31 15:57:33
【问题描述】:

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

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

x 变量代表数字,applications_name 变量代表不同应用程序的名称。

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

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

我想要类似的东西:

for each row in rows {
  print barplot in file
}

感谢您的帮助。

【问题讨论】:

  • 你试过什么?你绝对可以并且应该使用melt(和id = "Name")。编写一个生成一个条形图并保存它的函数,然后使用dplyrplyr::ddply 将该函数应用于您的融化数据中的每个Name

标签: r ggplot2 bar-chart


【解决方案1】:

您可以使用 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)

【讨论】:

  • 可以堆叠吗?怎么样?我尝试了不同的组合并在 geom_bar() 中添加了“position = stack”但我无法弄清楚。@user20650
  • @kukushkin;这取决于你想要什么。使用此示例中的数据:ggplot(m, aes(name, value, fill = variable)) + geom_bar(stat="identity") 是一种方法
【解决方案2】:

在准备之前我没有看到@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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2020-01-09
    • 2021-02-24
    • 2020-06-05
    • 2023-03-15
    • 2016-12-05
    • 2017-10-24
    相关资源
    最近更新 更多