Heat map per column with ggplot2

前端 未结 2 1411
陌清茗
陌清茗 2020-12-11 07:09

I\'m using this R script:

tableau <- read.table(
  text = 
    \"Net    B   C   D   E.(e)   F.(f)
a   1.88    0.15    0.60    10.00   90.00
b   2.05    0.         


        
相关标签:
2条回答
  • 2020-12-11 07:35

    To add value as a text label to each cell, you can use geom_text:

    p <- ggplot(tableau.m, aes(variable, Net)) + 
          geom_tile(aes(fill = rescale), colour = "white") + 
          scale_fill_gradient(low = "white", high = "steelblue") +
          geom_text(aes(label=value))
    
    # Add the theme formatting
    base_size <- 9
    p + theme_grey(base_size = base_size) + 
      labs(x = "", y = "") + scale_x_discrete(expand = c(0, 0)) + 
      scale_y_discrete(expand = c(0, 0)) + 
      theme(legend.position = "none", axis.ticks = element_blank(), 
            axis.text.x = element_text(size = base_size * 0.8, 
                                       angle = 0, hjust = 0, colour = "grey50"))
    

    For your second question, your current code already takes care of that. The variable rescale scales each column separately, because you've performed the operation grouped by variable. Since rescale is the fill variable, each column's values are rescaled from zero to one for the purposes of setting color values. You don't need the tableau.s ... last.plot... code.

    Here's what the plot looks like after running the code above. Note that in each column, the lowest value is white and the highest value is steel blue. (You might want to change the border color from "white" to, say, "gray90", so that there will be a border between adjacent white squares):

    enter image description here

    0 讨论(0)
  • 2020-12-11 07:39

    Similar idea using tidyr and dplyr to reshape the data to long format and ggvis to plot the heatmap:

    library(dplyr)
    library(ggvis)
    library(tidyr)
    
    tableau %>% 
      gather(variable, value, -Net) %>%
      group_by(variable) %>%
      mutate(scale = percent_rank(value)) %>%
      mutate_each(funs(factor(.)), -value, -scale) %>%
      ggvis(~variable, ~Net, fill=~scale) %>%
      layer_rects(width = band(), height = band(), stroke := NA) %>%
      layer_text(
        x = prop("x", ~variable, scale = "xcenter"),
        y = prop("y", ~Net, scale = "ycenter", ),
        text:=~value, fontSize := 14, fontWeight := "bold", fill:="black", 
        baseline:="middle", align:="center") %>%
      scale_nominal("x", padding = 0, points = FALSE) %>%
      scale_nominal("y", padding = 0, points = FALSE) %>% 
      scale_nominal("x", name = "xcenter", padding = 1, points = TRUE) %>%
      scale_nominal("y", name = "ycenter", padding = 1, points = TRUE) %>%
      scale_numeric("fill", range = c("white", "steelblue")) %>%
      add_axis("x", properties = axis_props(grid = list(stroke = NA))) %>%
      add_axis("y", properties = axis_props(grid = list(stroke = NA))) %>%
      hide_legend("fill")
    

    Which gives:

    enter image description here

    0 讨论(0)
提交回复
热议问题