R中的颜色依赖条形图

问题描述:

这里有一点我不太深入。我有以下代码生成两个相等大小的矩阵:R中的颜色依赖条形图

MAX<-100 
m<-5 
n<-40 

success<-matrix(runif(m*n,0,1),m,n) 
samples<-floor(MAX*matrix(runif(m*n),m))+1 

success的矩阵是成功的概率和samples矩阵是在每种情况下观察到的样品的相应的数字。我想制作一个条形图,将每列组合在一起,高度由success矩阵决定。每个条的颜色需要是与观察次数相对应的颜色(从1toMAX缩放)(例如,小样本会更红,例如高样本可能会变绿)。

任何想法?

+0

那么你想要一个堆叠的条形图,其中堆栈中的每一层对应于矩阵中的一行?你打算如何绘制3D矩阵(行,列,值),基本上是2d格式(x位置,y高度)。 – BrodieG

+0

我希望成排矩阵的行按行分组......所以,条形图将有40组高度,每组5个小节。我希望每个栏的颜色编码为1到MAX(100)之间的值。你是这个意思吗? – testname123

使用@ BrodieG的data.long,该地块可能会更容易一些解释。

library(ggplot2) 
library(RColorBrewer) # for brewer.pal(...) 
ggplot(data.long) + 
    geom_bar(aes(x=x, y=success, fill=count),colour="grey70",stat="identity")+ 
    scale_fill_gradientn(colours=brewer.pal(9,"RdYlGn")) + 
    facet_grid(group~.) 

注意,实际值可能是不同的,因为你的样品中使用随机数。将来,请考虑使用set.seed(n)来生成可重现的随机样本。

编辑 [回应OP的评论]

,因为你开始矩阵,而不是data.frames您获得x轴和小标签号码。因此,将successsamples转换为data.frames,将列名称设置为您的测试名称,并在“列表因子”前加上group列。现在转换为长格式有点不同,因为第一列有组名。设置阈值的颜色

library(reshape2) 
set.seed(1) 
success <- data.frame(matrix(runif(m*n,0,1),m,n)) 
success <- cbind(group=rep(paste("Factor",1:nrow(success),sep=".")),success) 
samples <- data.frame(floor(MAX*matrix(runif(m*n),m))+1) 
samples <- cbind(group=success$group,samples) 
data.long <- cbind(melt(success,id=1), melt(samples, id=1)[3]) 
names(data.long) <- c("group", "x", "success", "count") 

一种方法是添加一列data.long和使用,为fill

threshold <- 25 
data.long$fill <- with(data.long,ifelse(count>threshold,max(count),count)) 

全部放在一起:

library(ggplot2) 
library(RColorBrewer) 
ggplot(data.long) + 
    geom_bar(aes(x=x, y=success, fill=fill),colour="grey70",stat="identity")+ 
    scale_fill_gradientn(colours=brewer.pal(9,"RdYlGn")) + 
    facet_grid(group~.)+ 
    theme(axis.text.x=element_text(angle=-90,hjust=0,vjust=0.4)) 

最后,当你有x的名字轴标签往往会卡在一起,所以我旋转了名称-90 °。

+0

非常好。你可以随意改变绿色的门槛值吗?换句话说,使25以上的任何“计数”都是绿色,其余的颜色连续介于25和0之间?有没有办法用字符的矢量替换底部和右侧轴上的索引?我有底部的测试名称和右侧轴的因素列表。 – testname123

+0

查看我上面的编辑。 – jlhoward

+0

非常感谢!是否有任何书籍或资源可以推荐您达到您使用该语言的水平?正如你所看到的,我的基本理解恰恰足以让你陷入困境或者在项目的中途搁浅! :) 谢谢 – testname123

以下是ggplot的示例。首先,获得的数据为长格式与熔体:

library(reshape2) 
data.long <- cbind(melt(success), melt(samples)[3]) 
names(data.long) <- c("group", "x", "success", "count") 
head(data.long) 
# group x success count 
# 1  1 1 0.48513473  8 
# 2  2 1 0.56583802 58 
# 3  3 1 0.34541582 40 
# 4  4 1 0.55829073 64 
# 5  5 1 0.06455401 37 
# 6  1 2 0.88928606 78 

注意melt将通过行/列组合的迭代矩阵都以同样的方式,所以我们只要cbind所产生的熔融的数据帧。第二个melt之后的[3]是这样的,所以我们不会以重复的组和x值(我们只需要来自第二个melt的计数)结束。现在,让我们ggplot做它的事:

library(ggplot2) 
ggplot(data.long, aes(x=x, y=success, group=group, fill=count)) + 
    geom_bar(position="stack", stat="identity") + 
    scale_fill_gradient2(
    low="red", mid="yellow", high="green", 
    midpoint=mean(data.long$count) 
) 

enter image description here

+0

太好了。它们可以*在彼此旁边,就像barplot中的beside = TRUE参数一样吗? – testname123

+0

@ user3033594在'geom_bar()'里面试试'position =“dodge”',但是如果你这样做,就很难说出x值是什么。此外,如果你这样做,你将有200个酒吧,这很难区分。那真的是你想要的吗? – BrodieG