使用R中的区域创建热图

时间:2014-08-19 19:51:00

标签: r heatmap

我有以下类型的数据:在一块长方形的土地上(120x50码),有6个(也是直肠)较小的区域,每个区域都有不同种类的植物。这个想法是研究各种植物对鸟类的吸引力。每当一只鸟坐在陆地上的某个地方时,我就有鸟坐下的确切坐标。 我并不关心鸟儿坐下的地方,而只关心这六个区域中的哪一个。为了显示鸟类对各种植物的相对偏好,我想制作一个热图,使经常光顾的区域最黑暗。 因此,我需要将坐标转换为代码鸟访问的区域,然后创建一个热图,显示每个陆地区域的差异偏好。 (研究比这更复杂,但这是一般的想法。)

我如何在R中这样做?是否有一个R函数采用坐标矢量并在这样的热图中转动?如果没有,你有更多关于如何做到这一点的提示吗?

3 个答案:

答案 0 :(得分:4)

不是您想要的答案,但可能会给您一些启发。

# Simulate some data
birdieLandingSimulator <- data.frame(t(sapply(1:100, function(x) c(runif(1, -10,10), runif(1, -10,10)))))

# Assign some coordinates, which ended up not really being used much at all, except for the point colors
assignCoord <- function(x)
  {
  # Assign the four coordinates clockwise: 1, 2, 3, 4
  ifelse(all(x>0), 1, ifelse(!sum(x>0), 3, ifelse(x[1]>0, 2, 4)))
}
birdieLandingSimulator <- cbind(birdieLandingSimulator, Q = apply(birdieLandingSimulator, 1, assignCoord))

# Plot
require(ggplot2)
ggplot(birdieLandingSimulator, aes(x = X1, y = X2)) +
  stat_density2d(geom="tile", aes(fill = 1/..density..), contour = FALSE) +
  geom_point(aes(color = factor(Q))) + theme_classic() +
  theme(axis.title = element_blank(),
        axis.line = element_blank(),
        axis.text = element_blank(),
        axis.ticks = element_blank()) +
  scale_color_discrete(guide = FALSE, h=c(180, 270)) + 
  scale_fill_continuous(name = "Birdie Landing Location")

enter image description here

答案 1 :(得分:2)

使用ggplot2。看一下geom_bin2d的示例。获得2d垃圾箱非常简单。请注意,您为x和y传递了binwidth:

> df = data.frame(x=c(1,2,4,6,3,2,4,2,1,7,4,4),y=c(2,1,4,2,4,4,1,4,2,3,1,1))
> ggplot(df,aes(x=x, y=y,alpha=0.5)) + geom_bin2d(binwidth=c(2,2))

答案 2 :(得分:1)

如果您不想使用ggplot,可以使用cut功能将数据分成多个分区。

    # Test data.
    x <- sample(1:120, 100, replace=T)
    y <- sample(1:50, 100, replace=T)

    # Separate the data into bins.
    x <- cut(x, c(0, 40, 80, 120))
    y <- cut(y, c(0, 25, 50))

    # Now plot it, suppressing reordering.
    heatmap(table(y, x), Colv=NA, Rowv=NA)

或者,要实际绘制真实地理位置的区域,您可以使用rect自己绘制方框。你必须计算每个地区的点数。

    # Test data.
    x <- sample(1:120, 100, replace=T)
    y <- sample(1:50, 100, replace=T)
    regions <- data.frame(xleft=c(0, 40, 40, 80, 0, 80),
                          ybottom=c(0, 0, 15, 15, 30, 40),
                          xright=c(40, 120, 80, 120, 80, 120),
                          ytop=c(30, 15, 30, 40, 50, 50))

    # Color gradient.
    col <- colorRampPalette(c("white", "red"))(30)

    # Make the plot.
    plot(NULL, xlim=c(0, 120), ylim=c(0, 50), xlab="x", ylab="y")
    apply(regions, 1, function (r) {
        count <- sum(x >= r["xleft"] & x < r["xright"] & y >= r["ybottom"] & y < r["ytop"])
        rect(r["xleft"], r["ybottom"], r["xright"], r["ytop"], col=col[count])
        text( (r["xright"]+r["xleft"])/2, (r["ytop"]+r["ybottom"])/2, count)
    })

enter image description here