customized “scale_color_gradient2” in ggplot2

匿名 (未验证) 提交于 2019-12-03 08:52:47

问题:

I would like to use my own specific color in my image plot. I am very new in ggplot2 so had a look at its manual from here and tried to repeat some of the stuff; but I couldn't figure out how to supply my colorbar as I did for the graphics plot.

library(reshape2) library(ggplot2)  #my specific color list mycol <- vector(length=512, mode = "numeric") for (k in 1:256) mycol[k] <- rgb(255, k - 1, k - 1, maxColorValue=255) for (k in 257:512) mycol[k] <- rgb(511 - (k - 1), 511 - (k - 1), 255, maxColorValue=255) mycol <- rev(mycol) ncolors <- length(mycol)  # graphics plot par(mar = c(5, 13, 1, 6)) image(1:ncol(volcano), 1:nrow(volcano), t(volcano), zlim = c(0, ncolors), col=mycol, axes=FALSE, main="W Matrix", sub = "", xlab= "Components", ylab="Genes") axis(2, at=1:nrow(volcano), labels=row.names(volcano), adj= 0.5, tick=FALSE, las = 1, cex.axis=0.25, font.axis=1, line=-1) axis(1, at=1:ncol(volcano), labels=colnames(volcano), adj= 0.5, tick=FALSE,las = 3, cex=1, cex.axis=0.5, font.axis=1, line=-1)   # ggplot2 library(reshape2) library(ggplot2) library(ez) ggplot(melt(volcano), aes(x=Var1, y=Var2, fill=value)) + geom_tile() + scale_color_gradient2(low = muted("red"), mid = "white", high = muted("blue"), midpoint = 0, space = "rgb", guide = "colourbar") # the code does not really use my color bar 

*Error in unit(tic_pos.c, "mm") : 'x' and 'units' must have length > 0*

回答1:

Just to clarify @Didzis' answer, which works but may not produce the gradient you're looking for...

'midpoint' refers to the numerical value at which you want the color specified by 'mid' to appear. So, instead of setting the 'midpoint' argument to 256 (which falls outside the range of value, which is the vector you're coloring by), it's wise to set it to a value somewhere in the middle of the range of values you are coloring by, otherwise you aren't using the entire gradient you specified with 'low' and 'high', which defeats the purpose of scale_color_gradient2. The exact value depends on what you are trying to communicate visually, but usually the mean or median is used. Here, I edited @Didzis' code with 'midpoint' set to the median of value

v <- melt(volcano) ggplot(v, aes(x=Var1, y=Var2, fill=value)) +    geom_tile() +    scale_fill_gradient2(low = "#0000FF", mid = "#FFFFFF", high ="#FF0000",                         midpoint = median(v$value), space = "rgb", guide = "colourbar") 

This gives a plot with a much wider gradient:



回答2:

I think that you should change values for low=, mid= and high= values in scale_fill_gradient2(). For low= I used first value of mycol, for high= last value of mycol and for mid= used 256. value (middle). Also changed midpoint= to 256 as this is midpoint of your number of colors.

ggplot(melt(volcano), aes(x=Var1, y=Var2, fill=value)) +    geom_tile() +    scale_fill_gradient2(low = "#0000FF", mid = "#FFFFFF", high ="#FF0000",                         midpoint = 256.5, space = "rgb", guide = "colourbar") 



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!