我需要制作一个条形图,将数据分成多个分区。
我的数据如下:
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):
现在的问题是如何读取X轴标签,因为我需要读取局部最小值的值。
我如何设置一个&#34;比例尺&#34;像Y轴?
好的,我不能把所有bin的确切值,但至少有一个everey 0.5?
答案 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")
如果您想要不同的休息时间,您当然可以调整breaks
的{{1}}参数。特别要注意cut
的{{1}}参数,它允许您选择是否要在左侧或右侧关闭中断间隔。 right
是默认设置,这就是原始代码中{1}}排除了第一行数据的原因。
更新:要回答您的后续问题,您可以找到最小值cut
的bin,如下所示:
right=TRUE
如果您想对Groups
值进行排名以找到最低,下一个最低等,您可以使用Bygroup
,它会返回每个值的排名:
names(Bygroup)[which.min(Bygroup)]
[1] "(2,4]"