【问题标题】:Color Dependent Bar Graph in RR中的颜色相关条形图
【发布时间】:2014-02-11 20:45:52
【问题描述】:

我对这里的这个有点不知所措。我有以下代码生成两个大小相同的矩阵:

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 缩放)(例如,小样本会更红,而高样本可能会是绿色)。

有什么想法吗?

【问题讨论】:

  • 那么您是否想要一个堆叠条形图,其中堆叠中的每一层对应于矩阵中的一行?您打算如何以本质上是 2d 格式(x 位置,y 高度)的方式绘制 3d 矩阵(行、列、值)并不明显。
  • 我想让成功矩阵的行按行分组......所以,条形图将有 40 组高度,每组 5 条。我希望将每个条形颜色编码为 1 到 MAX (100) 之间的值。是这个意思吗?

标签: r matrix colors bar-chart graphing


【解决方案1】:

这是ggplot 的示例。首先,用melt把数据变成长格式:

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 参数?
  • @user3033594 在geom_bar() 中尝试position="dodge",但如果你这样做,就很难判断x 值是多少。此外,如果您这样做,您将有 200 个条,很难区分。这真的是你想要的吗?
【解决方案2】:

使用@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 的评论]

您会得到 x 轴和构面标签的数字,因为您从矩阵而不是 data.frames 开始。因此,将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°。

【讨论】:

  • 优秀。您可以任意更改绿色的阈值吗?换句话说,让任何高于 25 的“计数”为绿色,而颜色连续体的其余部分在 25 和 0 之间?有没有办法用字符向量替换底部和右侧轴上的索引?我有底部的测试名称和右轴的因素列表。
  • 非常感谢!是否有任何书籍或资源可以推荐,以达到你们使用这门语言的水平?如您所见,我的初步了解足以在项目中途陷入困境或搁浅! :) 谢谢
猜你喜欢
  • 1970-01-01
  • 2013-02-11
  • 2023-04-06
  • 2020-04-11
  • 2015-09-06
  • 2018-08-22
  • 1970-01-01
  • 1970-01-01
  • 2023-01-26
相关资源
最近更新 更多