在R中创建多列数据的分组条形图

时间:2012-04-18 14:55:34

标签: r ggplot2

我有以下数据

       Input Rtime Rcost Rsolutions  Btime Bcost 
1   12 proc.     1    36     614425     40    36 
2   15 proc.     1    51     534037     50    51 
3    18-proc     5    62    1843820     66    66 
4    20-proc     4    68    1645581 104400    73 
5 20-proc(l)     4    64    1658509  14400    65 
6    21-proc    10    78    3923623 453600    82 

我想根据此数据创建一个分组条形图,使得x轴包含Input字段(作为组),y轴表示Rtime和Btime字段(两个条形)的对数比例。 / p>

我在网上查看的所有解决方案/示例都将类似的数据放入三列布局中。我不知道如何使用我生成分组条形图的数据。或者,如果有一种方法可以将此数据(手动转换不是一个选项,因为它是一个包含大量行的大文件)转换为 R ggplot 兼容数据格式。

修改:

使用gncs解决方案生成的图表

enter image description here

4 个答案:

答案 0 :(得分:24)

根据要求, ggplot2 解决方案也使用 reshape2

library(reshape2)

df <- read.table(text = "       Input Rtime Rcost Rsolutions  Btime Bcost 
1   12-proc.     1    36     614425     40    36 
2   15-proc.     1    51     534037     50    51 
3    18-proc     5    62    1843820     66    66 
4    20-proc     4    68    1645581 104400    73 
5 20-proc(l)     4    64    1658509  14400    65 
6    21-proc    10    78    3923623 453600    82",header = TRUE,sep = "")

dfm <- melt(df[,c('Input','Rtime','Btime')],id.vars = 1)

ggplot(dfm,aes(x = Input,y = value)) + 
    geom_bar(aes(fill = variable),stat = "identity",position = "dodge") + 
    scale_y_log10()

enter image description here

请注意这里的样式差异,其中log(1) = 0 ggplot2 将其视为零高度的条形并且不绘制任何内容,而barplot绘制一个小的存根(在我看来这有点误导)。

答案 1 :(得分:6)

我想我理解这个问题,这就是我的建议(短期 - 选项):

data <- read.table("data.txt", header=TRUE)
subset <- t(data.frame(data$Rtime, data$Btime))
barplot(subset, legend = c("Rtime", "Btime"), names.arg=data$Input, log="y", beside=TRUE)

这就是你想要的吗?它有点脏,但它可以完成这项工作。

更新:代码已更正。

答案 2 :(得分:3)

joran的回答给了我很多帮助,但我必须在ggplot语句中使用 stat =&#34; identity&#34;

ggplot(dfm, aes(x = Input,y = value)) + 
geom_bar(aes(fill = variable), position = "dodge", stat="identity") + 
scale_y_log10()

我的R版本是3.2.2和ggplot2版本1.0.1

感谢。

答案 3 :(得分:2)

根据要求,ggplot2 解决方案还使用 pivot_longer() https://tidyr.tidyverse.org/reference/pivot_longer.html 将数据转换为 geom_bar() 可以轻松绘制的格式。

library(dplyr)
library(ggplot2)

df <- read.table(text = "       Input Rtime Rcost Rsolutions  Btime Bcost 
1   12-proc.     1    36     614425     40    36 
2   15-proc.     1    51     534037     50    51 
3    18-proc     5    62    1843820     66    66 
4    20-proc     4    68    1645581 104400    73 
5 20-proc(l)     4    64    1658509  14400    65 
6    21-proc    10    78    3923623 453600    82", 
header = TRUE,sep = "")


dfm <- pivot_longer(df, -Input, names_to="variable", values_to="value")
## pivot_longer takes the input data frame, excludes the Input field from the transformation, turns the remaining column names into the variable "variable" (often called the "key"), and assigns the values to the variable "value". 

ggplot(dfm,aes(x = Input,y = value)) + 
    geom_bar(aes(fill = variable),stat = "identity",position = "dodge") + 
    scale_y_log10()

enter image description here