geom_tile [heatmap]
https://ggplot2.tidyverse.org/reference/geom_tile.html
https://www.r-graph-gallery.com/heatmap
https://stagraph.com/HowTo/Plot/Geometries/Geom/tile
geom_tile, geom_rect, geom_raster
geom_tile 과 geom_rect는 같은데 파라미터가 다르다.
– geom_tile()은 tile의 중심과 크기를 사용하고, (x,y,width, height)
– geom_rect()는 tile의 모서리4개의 위치로 (xmin, xmax, ymin, ymax) 를 사용한다.
geom_raster()는 tile의 크기가 같을때, 성능이 좋은 geom_tile과 같다.
cf) geom_contour()
geom_tile(mapping=NULL, data=NULL, stat="identity", position="identity", ...,
linejoin = "mitre",
na.rm = FALSE, show.legend = NA, inherit.aes = TRUE)
geom_raster(mapping=NULL, data=NULL, stat="identity", position="identity", ...,
hjust = 0.5, vjust = 0.5, interpolate = FALSE,
na.rm = FALSE, show.legend = NA, inherit.aes = TRUE)
dd <- data.table(faithfuld)
names(dd) <- c("eruptions","waiting","dens")
# A tibble: 5,625 x 3
# eruptions waiting density
#
#1 1.6 43 0.00322
#2 1.65 43 0.00384
#3 1.69 43 0.00444
# ...
p <- dd %>% ggplot(aes(x=waiting, y=eruptions)) + geom_tile(aes(fill=dens))
ggplotly(p)
dd %>% ggplot(aes(x=waiting, y=eruptions)) + geom_raster(aes(fill=dens))
dt <- data.table(
time = rep(c(2, 5, 7, 9, 12), 2),
cycle = rep(c(1, 2), each = 5),
score = factor(rep(1:5, each = 2)),
wide = rep(diff(c(0, 4, 6, 8, 10, 14)), 2)
)
# time cycle score wide
# 1: 2 1 1 4
# 2: 5 1 1 2
# 3: 7 1 2 2
# 4: 9 1 2 2
# 5: 12 1 3 4
# 6: 2 2 3 4
# 7: 5 2 4 2
# 8: 7 2 4 2
# 9: 9 2 5 2
# 10: 12 2 5 4
stheme = scale_x_discrete(limits=c(1:12))
dt %>% ggplot(aes(x=time, y=cycle)) + geom_tile(aes(fill=score)) + stheme
dt %>% ggplot(aes(x=time, y=cycle)) + geom_tile(aes(fill=score), color="grey50") + stheme
dt %>% ggplot(aes(x=time, y=cycle, width=wide)) + geom_tile(aes(fill=score), color="grey50") + stheme
dt %>% ggplot(aes(xmin=time-wide/2, xmax=time+wide/2, ymin=cycle, ymax=cycle+1)) + geom_rect(aes(fill=score), color="red") + stheme
set.seed(666)
df <- expand.grid(x=0:5, y=0:5)
df$z <- runif(nrow(df))
df
# x y z
# 1 0 0 0.77436849033
# 2 1 0 0.19722419139
# 3 2 0 0.97801384423
...
# 36 5 5 0.49425172131
df %>% ggplot(aes(x,y)) + geom_tile(aes(fill=z))
df %>% ggplot(aes(x,y)) + geom_raster(aes(fill=z))
df %>% ggplot(aes(x,y)) + geom_raster(aes(fill=z), hjust=0, vjust=0) # zero padding
mtcars %>% ggplot(aes(x=mpg, y=factor(cyl))) + geom_point()
mtcars %>% ggplot(aes(x=mpg, y=factor(cyl))) + stat_bin2d(aes(fill=stat(count)))
mtcars %>% ggplot(aes(x=mpg, y=factor(cyl))) + stat_bin2d(aes(fill=stat(count)), binwidth=c(3,1) )
mtcars %>% ggplot(aes(x=mpg, y=factor(cyl))) + stat_bin2d(aes(fill=stat(density)))
mtcars %>% ggplot(aes(x=mpg, y=factor(cyl))) + stat_bin2d(aes(fill=stat(density)), binwidth=c(3,1))
mtcars %>% ggplot(aes(x=mpg, y=factor(cyl))) + stat_density(aes(fill=stat(density)), geom="raster")
mtcars %>% ggplot(aes(x=mpg, y=factor(cyl))) + stat_density(aes(fill=stat(count)), geom="raster", position="identity")
mtcars %>% ggplot(aes(x=mpg, y=factor(cyl))) + stat_density(aes(fill=stat(density)), geom="raster", position="identity")
spinrates <- read.csv("https://raw.githubusercontent.com/plotly/datasets/master/spinrates.csv", stringsAsFactors=F)
spinrates %>% str
spinrates %>% ggplot(aes(x=velocity, y=spinrate)) + geom_point()
p <- spinrates %>% ggplot(aes(x=velocity, y=spinrate)) + geom_tile(aes(fill=swing_miss))
p <- p + scale_fill_distiller(palette="YlGnBu", direction=1) +
theme_light() + labs(title = "Likelihood of swinging and missing on a fastball", y="spin rate (rpm)")
ggplotly(p)
# Create a shareable link to your chart
# Set up API credentials: https://plot.ly/r/getting-started
chart_link = api_create(p, filename="geom_tile/customize-theme")
chart_link
ex
nba <- read.csv("http://datasets.flowingdata.com/ppg2008.csv") %>% data.table
#The players are ordered by points scored, and the Name variable converted to a factor that ensures proper sorting of the plot.
nba$Name <- with(nba, reorder(Name, PTS))
nba.m <- melt.data.table(nba, id.vars = c("Name") )
dd <- split(nba.m, nba.m$variable) %>% map_df(function(x) x[, rescales:=scales::rescale(value)])
p <- nba.m %>% ggplot(aes(x=as.factor(variable),y= Name)) + geom_tile(aes(fill = value) , colour = "white") #+
#scale_fill_gradient(low = "white" , high = "steelblue")
p
p <- dd %>% ggplot(aes(x=as.factor(variable),y= Name)) + geom_tile(aes(fill = rescales) , colour = "white") +
scale_fill_gradient(low = "white" , high = "steelblue")
p
base_size <- 9
p + hrbrthemes::theme_ipsum(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=330, hjust=0))
# heatmap-function uses a different scaling method and
# therefore the plots are not identical.
# Below is an updated version of the heatmap which looks much more similar to the original.
ex
http://www.sthda.com/english/wiki/ggplot2-quick-correlation-matrix-heatmap-r-software-and-data-visualization
# Prepare the data
mydata <- mtcars[, c(1,3,4,5,6,7)]
mydata %>% head()
# Compute the correlation matrix
cormat <- round(cor(mydata),2)
cormat %>% head()
cormat %>% rownames()
cormat %>% colnames()
cormat_m <- melt(cormat) %>% data.table()
cormat_m %>% head()
# draw heatmap
cormat_m %>% ggplot(aes(x=Var1, y=Var2)) + geom_tile(aes(fill=value))
# Get lower triangle of the correlation matrix
get_lower_tri<-function(cormat){
cormat[upper.tri(cormat)] <- NA
return(cormat)
}
# Get upper triangle of the correlation matrix
get_upper_tri <- function(cormat){
cormat[lower.tri(cormat)]<- NA
return(cormat)
}
upper_tri <- get_upper_tri(cormat)
upper_tri
melted_cormat <- melt(upper_tri, na.rm=T)
# Heatmap
p <- melted_cormat %>% ggplot(aes(Var2, Var1)) + geom_tile(aes(fill=value), color="white")
p
p + scale_fill_gradient2(low="blue", high="red", mid="white",
midpoint=0, limit=c(-1,1), space="Lab",
name="Pearson\
Correlation") +
theme_ipsum(base_size=9) + coord_fixed() +
theme(axis.text.x = element_text(angle=45, vjust=1, size=12, hjust=1))
p
# Reorder the correlation matrix
reorder_cormat <- function(cormat){
# Use correlation between variables as distance
dd <- as.dist((1-cormat)/2)
hc <- hclust(dd)
cormat <-cormat[hc$order, hc$order]
}
cormat <- reorder_cormat(cormat)
upper_tri <- get_upper_tri(cormat)
# Melt the correlation matrix
melted_cormat <- melt(upper_tri, na.rm=T)
# Create a ggheatmap
p <- melted_cormat %>% ggplot(aes(Var2, Var1)) + geom_tile(aes(fill=value), color="white")
p <- p + scale_fill_gradient2(low="blue", high="red", mid="white",
midpoint=0, limit=c(-1,1), space="Lab",
name="Pearson\
Correlation") +
theme_ipsum(base_size=9) + coord_fixed() +
theme(axis.text.x = element_text(angle=45, vjust=1, size=12, hjust=1))
p
# Add correlation coefficients on the heatmap
p + geom_text(aes(Var2, Var1, label=value), color="black", size=4) +
theme(
axis.title.x = element_blank(),
axis.title.y = element_blank(),
panel.grid.major = element_blank(),
panel.border = element_blank(),
panel.background = element_blank(),
axis.ticks = element_blank(),
legend.justification = c(1, 0),
legend.position = c(.4,.8),
legend.direction = "horizontal") +
guides(fill=guide_colorbar(barwidth=7, barheight=1,
title.position="top", title.hjust=0.5))
ex
myIris <- iris %>% data.table() %>% mutate(sepal_interval=cut(Sepal.Length, 4)) %>% group_by(sepal_interval, Species) %>% summarise(n_obs=n()) myIris%>% ggplot(aes(x=sepal_interval, y=Species, fill=n_obs)) + geom_tile(color="white") + scale_fill_gradient2(midpoint=0,limit=c(-1,1),name="", low="blue",mid="white",high="red")

nmmaps<-fread("https://raw.githubusercontent.com/Z3tt/R-Tutorials/master/ggplot2/chicago-nmmaps.csv")
thecor<-cor(nmmaps[,c("death", "temp", "dewpoint", "pm10", "o3")],
\t\t\tmethod="pearson", use="pairwise.complete.obs") %>% round(2)
thecor[lower.tri(thecor)]<-NA
melt(thecor) %>% ggplot(aes(Var2, Var1)) +
geom_tile(aes(fill=value), color="white") +
scale_fill_gradient2(midpoint=0,limit=c(-1,1),name="",
low="blue",mid="white",high="red") +
coord_equal()
