ggplot2用于热图的缩放颜色

时间:2016-10-23 23:04:16

标签: r ggplot2

我有一个正值和负值的数据集,我试图在ggplot中生成一个热图,对于小于零的所有值和大于零的所有值,它们将具有不同的颜色渐变。

我设法使用下面的代码解决了这个问题,但图例上的比例并没有显示整个颜色范围,也不能很好地代表数据。我尝试将数据标准化并在0和1之间缩放,但这会生成一个只有一种颜色的连续色标。

您可以在http://pastebin.com/gVHBcVc6

找到数据

我很感激其他任何想法。

mylimits <- c(round(min(dat$ratio[!is.na(dat$ratio) > 0])),
          round(min(dat$ratio[!is.na(dat$ratio) > 0])) / 2,
          -0.2,
          0,
          0.2,
          round(max(dat$ratio[!is.na(dat$ratio) > 0])) / 2,
          round(max(dat$ratio[!is.na(dat$ratio) > 0])))


ggplot(data = dat, aes(x = ACC, y = variable)) +
  geom_tile(aes(fill = as.numeric(sprintf("%1.2f", 100 * ratio))), colour = 'white') +
  geom_text(aes(label = text), size = 2) +
  scale_fill_gradientn(colours=c('red', 'yellow', 'cyan', 'blue'),
                       values = rescale(mylimits)) +
  theme(axis.text.x = element_text(angle = 60, hjust = 1, color="black"), legend.title = element_blank(), legend.position="top", legend.key.size = unit(2.5, "cm"))

1 个答案:

答案 0 :(得分:2)

<强> [REVISION]

enableActionBarHomeButton(this); 中,scale_fill_gradientn()length(colours)需要相同。您可以使用length(values)轻松计算values。我将-100以下的值作为异常值并在-100下更改颜色渐变。最好给scales::rescale()大值,因为图例需要在零处表示快速变化。

nbin
制作没有图例的热图
library(ggplot2); library(scales)

  ## combine fill values (because of convenience, not necessary)
dat <- cbind(dat, ratio2 = as.numeric(sprintf("%1.2f", 100 * dat$ratio)))

  ## get max and min values using range(data)
r_range <- range(dat$ratio2, na.rm = T)

  ## defaine values and colours
   # values for heatmap
main_val <- c(r_range[1], seq(-100, -1.0E-6, length = 3),  # minus
              seq(1.0E-6, r_range[2], length = 3))         # plus

   # values for legend (I made two patterns; ignore outliers or not)
legend_val_100_max <- main_val[-1]
legend_val_120_max <- c(-120, seq(-100, -1.0E-6, length = 3),
                        seq(1.0E-6, r_range[2], length = 3))

   # colours    
mycol <- c("navy", "blue", "cyan", "lightcyan",              # minus
           "yellow", "red", "red4")                          # plus
添加传奇
g <- ggplot(data = dat, aes(x = ACC, y = variable)) +
  geom_tile(aes(fill = ratio2), colour = 'white') +
  theme(axis.text.x = element_text(angle = 60, hjust = 1, color="black"), 
        legend.title = element_blank(), legend.position="top", legend.key.size = unit(2.5, "cm")) + 
  scale_fill_gradientn(colours = mycol, values = rescale(main_val), guide = F)

  # to check
ggplot(data = dat, aes(x = ACC, y = variable)) +
  geom_tile(aes(fill = cut(ratio2, breaks = c(-Inf, 0, Inf))), colour = 'white')

enter image description here enter image description here

另一种方法
您可以使用 # -100 to max version (ignore outliers) g + scale_colour_gradientn(colours = mycol[-1], values = rescale(legend_val_100_max), limits = c(-100, max(dat$ratio2, na.rm=T)), breaks= c(-80, -40, 0, 40, 80), guide = guide_colorbar(nbin=100)) # -120 to max version (but chaged labels to look like min to max) g + scale_colour_gradientn(colours = mycol, values = rescale(legend_val_120_max), limits = c(-120, max(dat$ratio2, na.rm=T)), breaks = c(-120, -111, -109, -100, -50, 0, 50), labels = c(-500, "/", "/", -100, -50, 0, 50), # (to be exact, not -500 but -494.42)) guide = guide_colorbar(nbin=100)) scales的下限来使用主热图的比例。在这种方法中,您无需添加图例。但是异常颜色成为下限的颜色(即,如果将oob=squish设置为下限,-200的颜色与-1000相同。

-200

enter image description here