如何在R中针对这些列绘制物种丰富度与海拔的关系?

时间:2020-08-18 03:37:32

标签: r

我是R的新手。我只是想让自己对这种语言有所了解,并希望在处理和绘制数据方面寻求帮助。因此,我已经从Excel中导入了具有固定列数的数据,并且我希望根据海拔高度绘制鸟类的物种丰富度。两列中的数据如下所示:

Species Altitude (m) 
Species A 100 
Species B 100 
Species C 100 
Species D 100 
Species E 100 
Species C 200 
Species D 200 
Species E 200 
Species A 300 
Species C 300 
Species D 300 
Species E 300 
Species B 400 
Species E 400 
Species B 500 
Species D 500

我的问题是如何处理数据以求和在每个海拔高度发现的物种总数,并以图表形式显示而不使用ggplot2?谢谢。

3 个答案:

答案 0 :(得分:0)

您可以对每个aggregate使用sumAltitude Species,然后使用barplot进行绘制。

tmp <- aggregate(Altitude~Species, df, sum)
barplot(tmp$Altitude, names.arg = tmp$Species,xlab = 'Species', ylab = 'Altitude')

enter image description here

数据

df <- structure(list(Species = c("SpeciesA", "SpeciesB", "SpeciesC", 
"SpeciesD", "SpeciesE", "SpeciesC", "SpeciesD", "SpeciesE", "SpeciesA", 
"SpeciesC", "SpeciesD", "SpeciesE", "SpeciesB", "SpeciesE", "SpeciesB", 
"SpeciesD"), Altitude = c(100L, 100L, 100L, 100L, 100L, 200L, 
200L, 200L, 300L, 300L, 300L, 300L, 400L, 400L, 500L, 500L)), 
class = "data.frame", row.names = c(NA, -16L))

答案 1 :(得分:0)

## loding the data
species <- read.csv(text='Species,Altitude
Species A,100
Species B,100
Species C,100
Species D,100
Species E,100
Species C,200
Species D,200
Species E,200
Species A,300
Species C,300
Species D,300
Species E,300
Species B,400
Species E,400
Species B,500
Species D,500', header=T)
species
#>      Species Altitude
#> 1  Species A      100
#> 2  Species B      100
#> 3  Species C      100
#> 4  Species D      100
#> 5  Species E      100
#> 6  Species C      200
#> 7  Species D      200
#> 8  Species E      200
#> 9  Species A      300
#> 10 Species C      300
#> 11 Species D      300
#> 12 Species E      300
#> 13 Species B      400
#> 14 Species E      400
#> 15 Species B      500
#> 16 Species D      500
## transforming species to data.table
data.table::setDT(species)

species = species[, .(`Number of Species` = .N), by = c("Altitude")]

barplot(species$`Number of Species`, names.arg=species$Altitude, xlab='Altitude', ylab='Number of Species')

.N给出当前组的行数,by指定按哪一列进行分组。这将返回包含data.tableAltitude列的Number of Species。 有关data.table的介绍,可以说是data.frame操作最快的软件包之一,请查看vignette

答案 2 :(得分:0)

您可以使用函数aggregate()来按物种或海拔高度,使用任何现有函数或定义一个新函数来汇总数据集。

在您的情况下,我将使用函数length()进行汇总,因为它返回每个组中的案例数。如果在一个高度上有多个相同物种的计数,那么定义一个返回不同物种数量的函数可能是明智的。

您还可以使用一个函数来计算物种的熵(如果要获得多样性)或基尼系数(如果要衡量优势度)。

luniq = function(v){
  return(length(unique(v)))
}

d = data.frame("Species"=c("Species A","Species B","Species C","Species D",
                           "Species E","Species C","Species D","Species E",
                           "Species A","Species C","Species D","Species E",
                           "Species B","Species E","Species B","Species B"),
               "Altitude (m)"=c(100,100,100,100,
                                100,200,200,200,
                                300,300,300,300,
                                400,400,500,500))

agg1 = aggregate(d[["Species"]]~d[["Altitude..m."]],FUN=length)
agg2 = aggregate(d[["Species"]]~d[["Altitude..m."]],FUN=luniq)


d = data.frame("Number.Species"=agg1[,2],
               "Number.Different"=agg2[,2],
               row.names=agg[,1])

barplot(t(as.matrix(d)),beside=T,legend.text=names(d))

请注意,我将海拔高度500更改为包含两个相同物种的示例。因此,计数仍为2,但不同物种的数量为1。

enter image description here