离散化ggplot2色标的连续标度的最简单方法?

问题描述 投票:0回答:3

假设我有这个情节:


ggplot(iris) + geom_point(aes(x=Sepal.Width, y=Sepal.Length, colour=Sepal.Length)) + scale_colour_gradient()

离散色阶的正确方法是什么,就像这里接受的答案下面显示的图一样(ggplot stat_bin2d图中的梯度中断)?

ggplot 正确识别离散值并使用离散比例,但我的问题是,如果您有连续数据并且您想要一个离散颜色条(每个方块对应一个值,并且方块仍然以渐变着色),那么什么最好的方法是什么?离散化/分箱是否应该在 ggplot 之外进行,并作为单独的离散值列放入数据帧中,还是有办法在 ggplot 内进行?我正在寻找的示例类似于此处显示的比例: enter image description here

除了我正在绘制散点图而不是像

geom_tile
/热图之类的东西。

谢谢。

r plot ggplot2 heatmap
3个回答
10
投票

解决方案有点复杂,因为你想要一个离散的尺度。否则你可能可以简单地使用

round

library(ggplot2)

bincol <- function(x,low,medium,high) {
  breaks <- function(x) pretty(range(x), n = nclass.Sturges(x), min.n = 1)

  colfunc <- colorRampPalette(c(low, medium, high))

  binned <- cut(x,breaks(x))

  res <- colfunc(length(unique(binned)))[as.integer(binned)]
  names(res) <- as.character(binned)
  res
}

labels <- unique(names(bincol(iris$Sepal.Length,"blue","yellow","red")))
breaks <- unique(bincol(iris$Sepal.Length,"blue","yellow","red"))
breaks <- breaks[order(labels,decreasing = TRUE)]
labels <- labels[order(labels,decreasing = TRUE)]


ggplot(iris) + 
  geom_point(aes(x=Sepal.Width, y=Sepal.Length,
                 colour=bincol(Sepal.Length,"blue","yellow","red")), size=4) +
  scale_color_identity("Sepal.Length", labels=labels, 
                       breaks=breaks, guide="legend")

enter image description here


8
投票

您可以尝试以下操作,我在下面对您的示例代码进行了适当修改:

#I am not so great at R, so I'll just make a data frame this way
#I am convinced there are better ways. Oh well.
df<-data.frame()
for(x in 1:10){
  for(y in 1:10){
    newrow<-c(x,y,sample(1:1000,1))
    df<-rbind(df,newrow)
  }
}
colnames(df)<-c('X','Y','Val')


#This is the bit you want
p<- ggplot(df, aes(x=X,y=Y,fill=cut(Val, c(0,100,200,300,400,500,Inf))))
p<- p + geom_tile() + scale_fill_brewer(type="seq",palette = "YlGn")
p<- p + guides(fill=guide_legend(title="Legend!"))

#Tight borders
p<- p + scale_x_continuous(expand=c(0,0)) + scale_y_continuous(expand=c(0,0))
p

注意策略性地使用 cut 来离散化数据,然后使用 color Brewer 使事情变得漂亮。

结果如下。

2D heatmap with discretized colour


0
投票

我知道它已经有 11 年历史了,但是当我偶然发现你的问题时,我认为当你想要连续变量的离散比例时,我认为scale_color_stepn()是一个解决方案。这是一个简单的例子:

dat <- data.frame(x =rnorm(9), y = rnorm(9), col = c(1.3,1.6,1.2,2.6,2.2,2.8,3.1,3.3,3.8))

ggplot(dat, aes(x,y, col = col))+
  geom_point(size=4)+
  scale_color_stepsn(
    colours = c("red", "yellow", "green"),
    breaks = c(1, 2, 3, 4)
  )

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.