根据R中定义的分布和有限范围的值分配颜色

时间:2015-07-16 13:44:01

标签: r colors

我用ggplot绘制片段,我想根据相关的值为片段着色,但比较来自不同来源的值。原始数据框每个实验的值超过10000,但是对于绘图,只有少数是子集(~30-50)。

到目前为止,我使用了colorRampPallete的策略:

col <- colorRampPalette(c("blue", "white", "red")) 

然后根据每个实验的每个值生成颜色,从整个范围以红色和蓝色渐变为基础(中位数都是〜0)

dat_original$colvalue1 <- col(10)[as.numeric(cut(dat_original$value1, breaks=10))]
dat_original$colvalue2 <- col(10)[as.numeric(cut(dat_original$value2, breaks=10))]

在子集化之后,我使用指定的颜色为片段着色。但我想比较不同实验的数值,所以当我生成颜色时,由于分布不同(有些范围较宽),颜色无法比较(例如,与其他实验相比,相似的负值在一个颜色中更白)

由于我想比较来自不同实验的片段/值,并且范围可能不同,我想基于有限的分布来分配值,即。正态分布/范围,例如-5,5 mean = 0且sd = 1,因此可以比较颜色强度。更具体地说,如果一个中的值是-1.2而第二个中的值是-2,后者应该更蓝,但如果一个是-1.2而另一个-1.25差异应该几乎不存在。

子集如何显示的虚拟数据框

ident <- c("ABC", "ABC", "ABC", "DEF", "DEF", "GHF", "GHF", "GHF")
a3 <- c(10, 15, 20, 30, 45, 60, 80, 90)
a4 <- c(14, 19, 28, 40, 55, 75, 85, 100)
value1 <- c(-3.7,-1.8,-1.5, 2,0.5, -0.5,-0.9, -1.5)
value2 <- c(-2.2,-3.8,-4, 1.2,1.5, -0.8,-1.9, -0.5)
#
dat <- data.frame(ident, a1, a2, a3, a4, value1, value2)
#Plot, I'm using after assigning the colors to colvalue1 or 2
ggplot(dat) +
geom_segment(aes(x=a3, xend=a4, y=as.numeric(ident), yend=as.numeric(ident)), size=4, 
color=dat$colvalue1) +
geom_segment(aes(x=a3, xend=a4, y=as.numeric(ident)+0.2, yend=as.numeric(ident)+0.2),
 size=4, , color=dat$colvalue1)

任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:0)

您可以将数字矢量映射到颜色并使用scale_color_gradient()

ggplot(dat) + 
  geom_segment(aes(x=a3, xend=a4, y=as.numeric(ident), yend=as.numeric(ident),color=value1), size=4) + 
  geom_segment(aes(x=a3, xend=a4, y=as.numeric(ident)+0.2, yend=as.numeric(ident)+0.2,color=value2),size=4) +
  scale_color_gradient2(low="blue",high="red")+
  theme(panel.background=element_rect(fill="grey"))

enter image description here