在R中:从单个输出获取多个条形图

最后发布: 2015-09-16 18:59:51


问题

我有一个数据框(100 x 4)。 第一列是一组0-100的“箱”,其余列是每个箱中每个事件变量的计数(0到最大事件数)。

我想做的是将三列数据(2:4)中的每一列相互绘制在一起。 因为每个数据集的每个箱中的计数接近相同,所以尽管我使用了next = true和position = dodge,但数据仍在我创建的直方图/条形图中重叠。

我已经将第一列设置为数字和字符,但是结果是相同的-条形图相互重叠。 (半透明的密度图不起作用,因为我不希望计算分布密度)。

随附的代码基于R和其他文档,生成了随附的图表。

barplot(BinCntDF$preT,main=NewMain_Trigger, plot=TRUE,
    xlab="sample frequency interval counts (0-100 msec bins)", 
    names.arg=BinCntDF$dT, las=0,
    ylab="bin counts", axes=TRUE, xlim=c(0,100), 
    ylim=c(0,1000), col="red") 
 geom_bar(position="dodge")
 barplot(BinCntDF$postT, beside=TRUE, add=TRUE)
 geom_bar()

目的是能够在同一轴上并排比较两个(或多个)数据集,而又不与其他数据集重叠。

r
回答

我认为您已将barplotggplot2混淆了。 ggplot2是一个库,函数geom_bar来自此库,并且与Base R附带的barplot不兼容。

只需比较?barplot?geom_bar ,您将看到geom_bar来自ggplot2库。 在使用ggplot2库和reshape2之后,要实现您的reshape2

第1步

根据您的描述,我假设您的数据大致如下所示:

df <- data.frame(x = 1:10, 
                 c1 = sample(0:100, replace=TRUE, size=10),
                 c2 = sample(0:50, replace=TRUE, size=10),
                 c3 = sample(0:70, replace=TRUE, size=10))

要使用ggplot2对其进行ggplot2您首先必须将数据转换为长格式而不是宽格式。 您可以使用来自reshape2 melt函数来执行此操作。

library(reshape2)
a <- melt(df, id=c("x"))

输出看起来像这样

> head(a)
  x variable value
1 1       c1    62
2 2       c1    47
3 3       c1    20
4 4       c1    64
5 5       c1     4
6 6       c1    52

第2步

在线提供了大量有关ggplot2功能和参数的教程。 我会建议您使用Google,或者搜索SO中的许多线程以了解。

ggplot(a, aes(x=x, y=value, group=variable, fill=variable)) + 
  geom_bar(stat='identity', position='dodge')

给您输出:

在此处输入图片说明

简而言之:

  • group将感兴趣的变量分组
  • stat=identity可确保对您的数据不进行其他汇总


回答

有这么多的容器(100)和组(3),该图看起来很杂乱,但是请尝试以下操作:

set.seed(123)
myDF <- data.frame(bins=1:100, x=sample(1:100, replace=T), y=sample(1:100, replace=T), z=sample(1:100, replace=T))
myDF.m <- melt(myDF, id.vars='bins')
ggplot(myDF.m, aes(x=bins, y=value, fill=variable)) + geom_bar(stat='identity', position='dodge')

条形图1

您也可以尝试绘制带有构面的图:

ggplot(myDF.m, aes(x=bins, y=value, fill=variable)) + geom_bar(stat='identity') + facet_wrap(~ variable)

Barplot 2