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

Posted

技术标签:

【中文标题】离散化 ggplot2 色标的连续标度的最简单方法?【英文标题】:easiest way to discretize continuous scales for ggplot2 color scales? 【发布时间】:2013-07-16 19:30:33 【问题描述】:

假设我有这个情节:

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

什么是离散色标的正确方法,例如此处接受的答案下方显示的图 (gradient breaks in a ggplot stat_bin2d plot)?

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

除了我正在绘制散点图而不是 geom_tile/heatmap 之类的东西。

谢谢。

【问题讨论】:

看看***.com/questions/50506832/… 【参考方案1】:

解决方案有点复杂,因为您需要一个离散的比例。否则,您可能只需使用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")

【讨论】:

如果用于着色的变量中存在负数,标签的排序是否有效?【参考方案2】:

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

#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 使事情变得漂亮。

结果如下所示。

【讨论】:

我喜欢这个,但我想知道是否有办法像问题中显示的示例那样标记比例。更准确地说:如何让极端值出现在颜色“层”之间的分界点?

以上是关于离散化 ggplot2 色标的连续标度的最简单方法?的主要内容,如果未能解决你的问题,请参考以下文章

R数据可视化----ggplot2之标度坐标轴和图例详解

如何将 Plotly r 中的色标转换为对数标度

在 ggplot2 中是不是有内置的方法来做对数色标?

提供给离散比例ggplot2的连续值

ggplot2多边形->错误:提供给连续比例的离散值

即使我使用数字,ggplot2中的离散值/连续比例误差