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
矩阵决定。每个条的颜色需要是与观察次数相对应的颜色(从1
to
MAX
缩放)(例如,小样本会更红,例如高样本可能会变绿)。
任何想法?
使用@ 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轴和小标签号码。因此,将success
和samples
转换为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 °。
非常好。你可以随意改变绿色的门槛值吗?换句话说,使25以上的任何“计数”都是绿色,其余的颜色连续介于25和0之间?有没有办法用字符的矢量替换底部和右侧轴上的索引?我有底部的测试名称和右侧轴的因素列表。 – testname123
查看我上面的编辑。 – jlhoward
非常感谢!是否有任何书籍或资源可以推荐您达到您使用该语言的水平?正如你所看到的,我的基本理解恰恰足以让你陷入困境或者在项目的中途搁浅! :) 谢谢 – 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)
)
太好了。它们可以被迫在彼此旁边,就像barplot中的beside = TRUE参数一样吗? – testname123
@ user3033594在'geom_bar()'里面试试'position =“dodge”',但是如果你这样做,就很难说出x值是什么。此外,如果你这样做,你将有200个酒吧,这很难区分。那真的是你想要的吗? – BrodieG
那么你想要一个堆叠的条形图,其中堆栈中的每一层对应于矩阵中的一行?你打算如何绘制3D矩阵(行,列,值),基本上是2d格式(x位置,y高度)。 – BrodieG
我希望成排矩阵的行按行分组......所以,条形图将有40组高度,每组5个小节。我希望每个栏的颜色编码为1到MAX(100)之间的值。你是这个意思吗? – testname123