R barplot with bin division

时间:2014-06-25 16:04:21

标签: r bar-chart

我需要制作一个条形图,将数据分成多个分区。

我的数据如下:

1.0 5
1.2 4
2.4 1
4.3 6
5.2 10

然后在X轴上我希望得到时间值,如:[1-4],[4-5]等(取决于csv文件中的数据)。

在Y轴上,我希望有多次出现,如10,16等。

我写了这个R代码:

dataset <- read.csv("/Users/MNeptune/Documents/workspace R/BarPlot/times.csv")
dataset <- data.matrix(dataset, rownames.force = NA)
time <- dataset[,1]
occurence <- dataset[,2]
min <- min(time);
max <- max(time);

# Creo i bin
Groups <- cut(x = time, breaks = seq(from = min, to = max, by = 2))
Groups <- data.matrix(Groups, rownames.force = NA)

# Raggruppo i dati nei bin
Bygroup = tapply(occurence, Groups, sum)

# Faccio il plot dei bin
barplot(height = Bygroup, xlab = "time", ylab = "occurence")

但是代码没有正确地存储数据(错误的数字而不是正确的顺序)。问题在哪里?

EDIT1:

感谢eipi10我得到了这个(bin长度为0.01):

Time/Occurence graph with bin lenght of 0.01

现在的问题是如何读取X轴标签,因为我需要读取局部最小值的值。

我如何设置一个&#34;比例尺&#34;像Y轴?

好的,我不能把所有bin的确切值,但至少有一个everey 0.5?

1 个答案:

答案 0 :(得分:7)

如果您执行以下操作,您可以看到出现了什么问题:

seq(from=1.0, to=5.2, by=2)
[1] 1 3 5

cut(c(1.0,1.2,2.4,4.3,5.2), breaks=seq(from=1.0, to=5.2, by=2))
[1] <NA>  (1,3] (1,3] (3,5] <NA> 
Levels: (1,3] (3,5]

换句话说,seq停止在小于5.2的最高值,即5,因此您错过了time = 5.2的行。此外,默认情况下,cut会排除值范围的低端,因此当您使用time的最低值作为cut的低端时,您也会错过该值范围。

在这里重新编写代码以获取您正在寻找的情节:

dat=read.table(text="time occurence
1.0 5
1.2 4
2.4 1
4.3 6
5.2 10", header=TRUE)

# Creo i bin
dat$Groups <- cut(x=dat$time, breaks=seq(from=0, to=ceiling(max(dat$time)), by = 2))

# Raggruppo i dati nei bin
Bygroup = tapply(dat$occurence, dat$Groups, sum)

# Faccio il plot dei bin
barplot(height = Bygroup, xlab = "time", ylab = "occurence")

enter image description here

如果您想要不同的休息时间,您当然可以调整breaks的{​​{1}}参数。特别要注意cut的{​​{1}}参数,它允许您选择是否要在左侧或右侧关闭中断间隔。 right是默认设置,这就是原始代码中{1}}排除了第一行数据的原因。

更新:要回答您的后续问题,您可以找到最小值cut的bin,如下所示:

right=TRUE

如果您想对Groups值进行排名以找到最低,下一个最低等,您可以使用Bygroup,它会返回每个值的排名:

names(Bygroup)[which.min(Bygroup)]
[1] "(2,4]"