制作一个显示每列最大位置的图表

时间:2015-03-10 10:59:29

标签: r

1-我想制作一个数据框或矩阵,每列与另一列不同(至少50%不同)

我所做的就是例如

M <- data.frame(matrix(runif(5),10000,50))

然后我想找到M

中每列最大值的位置和值

我可以使用

找到每列最大值的位置
indexmax <- apply(M, MARGIN = 2, function(x) which(x == max(x), arr.ind = TRUE)) 

我现在的主要问题是如何制作一个显示这些指数位置的图表

X轴范围从1到列数 在Y轴范围从1到行数

然后突出显示最大值是在数据的底行还是顶行

1 个答案:

答案 0 :(得分:1)

这是你想要的吗?

library(reshape2)
library(ggplot2)

M <- data.frame(matrix(runif(100), ncol=10))
res <- sapply(M, function(x) x>=max(x))
where <- sapply(M, function(x) which.max(x)>length(x)/2)
where <- data.frame('x'=1:ncol(M), 'y'=0, 'label'=factor(where, labels=c("sup", "inf")))

ggplot(data=melt(t(res))) +
  geom_tile(aes(x=Var1, y=Var2, fill=value))+
  scale_y_reverse() + xlab("columns") + ylab("rows") +
  geom_text(data=where, aes(x=x, y=y, label=label)) +
  guides(fill=guide_legend(title="is maximum?"))

该脚本创建一个随机矩阵,然后创建一个M的逻辑副本,告诉每个值是否为最大值。而不是它创造了一个&#39;其中&#39;向量告知每列是否在顶行中具有最大值,并将此向量转换为命名的2级因子。最终,它使用ggplot和reshape来绘制两个信息,并使用&#39; tile&#39;可视化。

enter image description here

修改 鉴于你有一个非常大的矩阵(30000 * 2000),绘制最大值的位置将是完全无用的。相反,我们可以绘制它在矩阵的上部或下部的信息:

M <- data.frame(matrix(runif(20000), ncol=2000))
res <- sapply(M, function(x) x>=max(x))
where <- sapply(M, function(x) which.max(x)>length(x)/2)
image(as.matrix(cbind(!where, where)))

enter image description here

红色表示每列中的最大值。 但是,如果您的数据每列有几个最大值,请小心使用which.max函数,此图形表示可能会产生误导。