R barplot与bin分裂

Nep*_*une 3 r bar-chart

我需要制作一个条形图,其中数据被分成垃圾箱.

我的数据如下:

1.0 5
1.2 4
2.4 1
4.3 6
5.2 10
Run Code Online (Sandbox Code Playgroud)

然后在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")
Run Code Online (Sandbox Code Playgroud)

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

EDIT1:

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

时间/出现图表,单位长度为0.01

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

我怎么能像Y轴那样放一个"比例尺"?

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

eip*_*i10 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]
Run Code Online (Sandbox Code Playgroud)

换句话说,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")
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

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

names(Bygroup)[which.min(Bygroup)]
[1] "(2,4]"
Run Code Online (Sandbox Code Playgroud)

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

rank(Bygroup)
(0,2] (2,4] (4,6] 
    2     1     3 
Run Code Online (Sandbox Code Playgroud)