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.23 0.51 55.00 80.00
c 2.09 0.29 0.40 58.00 88.00
d 2.07 0.52 0.36 80.00 84.00
e 2.13 0.30 0.27 7.00 90.00",
header = TRUE)
library(plyr)
library(reshape)
library(ggplot2)
library(scales)
tableau.m <- melt(tableau)
tableau.m <- ddply(tableau.m, .(variable), transform, rescale = rescale(value))
(p <- ggplot(tableau.m, aes(variable, Net)) +
geom_tile(aes(fill = rescale), colour = "white") +
scale_fill_gradient(low = "white", high = "steelblue"))
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"))
tableau.s <- ddply(tableau.m, .(variable), transform, rescale = scale(value))
last_plot() %+% tableau.s
And I obtain this plot:
Where darker blue means higher values and white means lower values.
How, if possible, could I change this code so that:
Thanks!
To create a heatmap with the melted data so produced, we use geom_tile() function of the ggplot2 library. It is essentially used to create heatmaps.
A basic heatmap can be produced using either the R base function heatmap() or the function heatmap. 2() [in the gplots package]. The pheatmap() function, in the package of the same name, creates pretty heatmaps, where ones has better control over some graphical parameters such as cell size.
The heatmap() function is natively provided in R. It produces high quality matrix and offers statistical tools to normalize input data, run clustering algorithm and visualize the result with dendrograms. It is one of the very rare case where I prefer base R to ggplot2 .
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):
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:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With