Title: | Draw Sectors |
---|---|
Description: | Some useful functions that can use 'grid' and 'ggplot2' to plot sectors and interact with 'Seurat' to plot gene expression percentages. Also, there are some examples of how to draw sectors in 'ComplexHeatmap'. |
Authors: | Pengdong Yan [aut, cre, cph] |
Maintainer: | Pengdong Yan <[email protected]> |
License: | Artistic-2.0 |
Version: | 1.7.0 |
Built: | 2024-11-19 04:42:30 UTC |
Source: | https://github.com/yanpd01/ggsector |
draw_key_sector
draw_key_sector(data, params, size)
draw_key_sector(data, params, size)
data |
A single row data frame containing the scaled aesthetics to display in this key |
params |
A list of additional parameters supplied to the geom. |
size |
Width and height of key in mm. |
ggplot legend
Draw sector with ggplot2.
geom_sector( mapping = NULL, data = NULL, stat = "identity", position = "identity", ..., na.rm = FALSE, show.legend = NA, inherit.aes = TRUE, individual = FALSE, verbose = TRUE )
geom_sector( mapping = NULL, data = NULL, stat = "identity", position = "identity", ..., na.rm = FALSE, show.legend = NA, inherit.aes = TRUE, individual = FALSE, verbose = TRUE )
mapping |
Set of aesthetic mappings created by |
data |
The data to be displayed in this layer. There are three options: If A A |
stat |
The statistical transformation to use on the data for this layer.
When using a
|
position |
A position adjustment to use on the data for this layer. This
can be used in various ways, including to prevent overplotting and
improving the display. The
|
... |
Other arguments passed on to
|
na.rm |
If |
show.legend |
logical. Should this layer be included in the legends?
|
inherit.aes |
If |
individual |
Logical, default is FALSE. When "individual=FALSE", draw very quickly with a vector form, when "individual=TRUE", draw individually at a slower speed. Anyway, for better presentation, please add coord_fixed(). |
verbose |
Logical, default is TRUE. Whether to display reminder information. |
When "individual=FALSE", draw very quickly with a vector form, when "individual=TRUE", draw individually at a slower speed.
The required parameters in mapping are "x", "y", "theta", and the additional modifiable parameters are "r", "start", "r_start", "type", "colour", "fill", "ratio", "size" for line size, "linetype".
When there is coord_fixed(), r = 0.5 means that the sector-shaped background circle just fills the entire cell
The ratio
parameter is still an experimental parameter,
if it is not necessary, please do not set it yourself.
The ratio
parameter only works when individual = FALSE
.
When ratio
is null, it will be auto calculated.
For better display effect, please always add coord_fixed()
.
For details, please check the grid.sector()
.
For more details, please type vignette("ggsector")
.
ggplot object
## prepare data library(ggsector) library(reshape2) df <- cor(mtcars)[1:3, 1:5] %>% abs() %>% melt(varnames = c("x", "y")) ### ## Note, for better display effect, please always add coord_fixed() ## Note, for better display effect, please always add coord_fixed() ## Note, for better display effect, please always add coord_fixed() ## theta ggplot(df) + ## type = "percent", theta = 0-100 geom_sector( aes(y, x, theta = value * 100), type = "percent", color = "blue", individual = TRUE ) + ## type = "degree", theta = 0-360 geom_sector( aes(y, x, theta = value * 360), type = "degree", color = "red", alpha = 0.5, individual = TRUE ) + coord_fixed() + theme_bw() + theme(axis.title = element_blank()) ## r ggplot(df) + geom_sector( aes(y, x, theta = value * 100), r = rep(c(0.15, 0.3, 0.45), 5), fill = 2, individual = TRUE ) + coord_fixed() + theme_bw() + theme(axis.title = element_blank()) ## start ggplot(df) + geom_sector( aes(y, x, theta = value * 100), start = rep(c(60, 40, 20), 5), fill = 2, individual = TRUE ) + coord_fixed() + theme_bw() + theme(axis.title = element_blank()) ## r_start ggplot(df) + geom_sector( aes(y, x, theta = value * 100), r_start = rep(c(0.15, 0.25, 0.35), 5), fill = 2, individual = TRUE ) + coord_fixed() + theme_bw() + theme(axis.title = element_blank()) #################### individual ################### ########## individual with coord_fixed() ########## ## `individual = TRUE` + coord_fixed() # x = x, y = y ggplot(rbind( cbind(df, t1 = 1), cbind(df[1:9, ], t1 = 2) )) + facet_wrap(~t1, ncol = 2) + geom_sector( aes(x, y), theta = 75, fill = 2, r = 0.5, individual = TRUE ) + coord_fixed() + theme_bw() + theme(axis.title = element_blank()) # x = y, y =x ggplot(rbind( cbind(df, t1 = 1), cbind(df[1:9, ], t1 = 2) )) + facet_wrap(~t1, ncol = 2) + geom_sector( aes(y, x), theta = 75, fill = 2, r = 0.5, individual = TRUE ) + coord_fixed() + theme_bw() + theme(axis.title = element_blank()) ## `individual = FALSE` + coord_fixed() # x = x, y = y ggplot(rbind( cbind(df, t1 = 1), cbind(df[1:9, ], t1 = 2) )) + facet_wrap(~t1, ncol = 2) + geom_sector( aes(x, y), theta = 75, fill = 2, r = 0.5, individual = FALSE ) + coord_fixed() + theme_bw() + theme(axis.title = element_blank()) # x = y, y =x ggplot(rbind( cbind(df, t1 = 1), cbind(df[1:9, ], t1 = 2) )) + facet_wrap(~t1, ncol = 2) + geom_sector( aes(y, x), theta = 75, fill = 2, r = 0.5, individual = TRUE ) + coord_fixed() + theme_bw() + theme(axis.title = element_blank()) ########## individual without coord_fixed() ########## ## If you are in a special situation and cannot use coord_fixed(), ## then it is recommended that you use `individual = TRUE` and ## the `r` parameter to fine-tune. ## Also, to reduce the radius, you need to try it manually. ## `individual = TRUE` without coord_fixed() # x = x, y = y ggplot(rbind( cbind(df, t1 = 1), cbind(df[1:9, ], t1 = 2) )) + facet_wrap(~t1, ncol = 2) + geom_sector( aes(x, y), theta = 75, fill = 2, r = 0.35, ## To reduce the radius, you need to try it manually individual = TRUE ) + theme_bw() + theme(axis.title = element_blank()) # x = y, y =x ggplot(rbind( cbind(df, t1 = 1), cbind(df[1:9, ], t1 = 2) )) + facet_wrap(~t1, ncol = 2) + geom_sector( aes(y, x), theta = 75, fill = 2, r = 0.25, ## To reduce the radius, you need to try it manually individual = TRUE ) + theme_bw() + theme(axis.title = element_blank()) ## `individual = FALSE` ## If you really want to use `individual = FALSE` without coord_fixed(), ## you might try the experimental parameter `ratio' ## You need to manually adjust the `ratio` value ## to prevent sector deformation. # x = x, y = y ggplot(rbind( cbind(df, t1 = 1), cbind(df[1:9, ], t1 = 2) )) + facet_wrap(~t1, ncol = 2) + geom_sector( aes(x, y), theta = 75, fill = 2, r = 0.5, ## You need to manually adjust the `ratio` value ## to prevent sector deformation. ratio = 1.6, individual = FALSE ) + theme_bw() + theme(axis.title = element_blank()) # x = y, y =x ggplot(rbind( cbind(df, t1 = 1), cbind(df[1:9, ], t1 = 2) )) + facet_wrap(~t1, ncol = 2) + geom_sector( aes(y, x), theta = 75, fill = 2, r = 0.5, ## You need to manually adjust the `ratio` value ## to prevent sector deformation. ratio = 1.6, individual = FALSE ) + # coord_fixed() + theme_bw() + theme(axis.title = element_blank())
## prepare data library(ggsector) library(reshape2) df <- cor(mtcars)[1:3, 1:5] %>% abs() %>% melt(varnames = c("x", "y")) ### ## Note, for better display effect, please always add coord_fixed() ## Note, for better display effect, please always add coord_fixed() ## Note, for better display effect, please always add coord_fixed() ## theta ggplot(df) + ## type = "percent", theta = 0-100 geom_sector( aes(y, x, theta = value * 100), type = "percent", color = "blue", individual = TRUE ) + ## type = "degree", theta = 0-360 geom_sector( aes(y, x, theta = value * 360), type = "degree", color = "red", alpha = 0.5, individual = TRUE ) + coord_fixed() + theme_bw() + theme(axis.title = element_blank()) ## r ggplot(df) + geom_sector( aes(y, x, theta = value * 100), r = rep(c(0.15, 0.3, 0.45), 5), fill = 2, individual = TRUE ) + coord_fixed() + theme_bw() + theme(axis.title = element_blank()) ## start ggplot(df) + geom_sector( aes(y, x, theta = value * 100), start = rep(c(60, 40, 20), 5), fill = 2, individual = TRUE ) + coord_fixed() + theme_bw() + theme(axis.title = element_blank()) ## r_start ggplot(df) + geom_sector( aes(y, x, theta = value * 100), r_start = rep(c(0.15, 0.25, 0.35), 5), fill = 2, individual = TRUE ) + coord_fixed() + theme_bw() + theme(axis.title = element_blank()) #################### individual ################### ########## individual with coord_fixed() ########## ## `individual = TRUE` + coord_fixed() # x = x, y = y ggplot(rbind( cbind(df, t1 = 1), cbind(df[1:9, ], t1 = 2) )) + facet_wrap(~t1, ncol = 2) + geom_sector( aes(x, y), theta = 75, fill = 2, r = 0.5, individual = TRUE ) + coord_fixed() + theme_bw() + theme(axis.title = element_blank()) # x = y, y =x ggplot(rbind( cbind(df, t1 = 1), cbind(df[1:9, ], t1 = 2) )) + facet_wrap(~t1, ncol = 2) + geom_sector( aes(y, x), theta = 75, fill = 2, r = 0.5, individual = TRUE ) + coord_fixed() + theme_bw() + theme(axis.title = element_blank()) ## `individual = FALSE` + coord_fixed() # x = x, y = y ggplot(rbind( cbind(df, t1 = 1), cbind(df[1:9, ], t1 = 2) )) + facet_wrap(~t1, ncol = 2) + geom_sector( aes(x, y), theta = 75, fill = 2, r = 0.5, individual = FALSE ) + coord_fixed() + theme_bw() + theme(axis.title = element_blank()) # x = y, y =x ggplot(rbind( cbind(df, t1 = 1), cbind(df[1:9, ], t1 = 2) )) + facet_wrap(~t1, ncol = 2) + geom_sector( aes(y, x), theta = 75, fill = 2, r = 0.5, individual = TRUE ) + coord_fixed() + theme_bw() + theme(axis.title = element_blank()) ########## individual without coord_fixed() ########## ## If you are in a special situation and cannot use coord_fixed(), ## then it is recommended that you use `individual = TRUE` and ## the `r` parameter to fine-tune. ## Also, to reduce the radius, you need to try it manually. ## `individual = TRUE` without coord_fixed() # x = x, y = y ggplot(rbind( cbind(df, t1 = 1), cbind(df[1:9, ], t1 = 2) )) + facet_wrap(~t1, ncol = 2) + geom_sector( aes(x, y), theta = 75, fill = 2, r = 0.35, ## To reduce the radius, you need to try it manually individual = TRUE ) + theme_bw() + theme(axis.title = element_blank()) # x = y, y =x ggplot(rbind( cbind(df, t1 = 1), cbind(df[1:9, ], t1 = 2) )) + facet_wrap(~t1, ncol = 2) + geom_sector( aes(y, x), theta = 75, fill = 2, r = 0.25, ## To reduce the radius, you need to try it manually individual = TRUE ) + theme_bw() + theme(axis.title = element_blank()) ## `individual = FALSE` ## If you really want to use `individual = FALSE` without coord_fixed(), ## you might try the experimental parameter `ratio' ## You need to manually adjust the `ratio` value ## to prevent sector deformation. # x = x, y = y ggplot(rbind( cbind(df, t1 = 1), cbind(df[1:9, ], t1 = 2) )) + facet_wrap(~t1, ncol = 2) + geom_sector( aes(x, y), theta = 75, fill = 2, r = 0.5, ## You need to manually adjust the `ratio` value ## to prevent sector deformation. ratio = 1.6, individual = FALSE ) + theme_bw() + theme(axis.title = element_blank()) # x = y, y =x ggplot(rbind( cbind(df, t1 = 1), cbind(df[1:9, ], t1 = 2) )) + facet_wrap(~t1, ncol = 2) + geom_sector( aes(y, x), theta = 75, fill = 2, r = 0.5, ## You need to manually adjust the `ratio` value ## to prevent sector deformation. ratio = 1.6, individual = FALSE ) + # coord_fixed() + theme_bw() + theme(axis.title = element_blank())
According to the input center position, radius and angle, get the polygon coordinates of a sector.
sector_df( x = 0.5, y = 0.5, theta = 25, r = 0.5, start = 0, r_start = 0, type = "percent", ratio = 1 ) sector_df_multiple( x = 0.5, y = 0.5, theta = 25, r = 0.5, start = 0, r_start = 0, type = "percent", ratio = 1, group )
sector_df( x = 0.5, y = 0.5, theta = 25, r = 0.5, start = 0, r_start = 0, type = "percent", ratio = 1 ) sector_df_multiple( x = 0.5, y = 0.5, theta = 25, r = 0.5, start = 0, r_start = 0, type = "percent", ratio = 1, group )
x |
Numeric, the x-axis coordinate of the sector center. |
y |
Numeric, the y-axis coordinate of the sector center. |
theta |
Numeric, the angle of the sector, if 'type = "percent"', the input is a percentage(0-100), if 'type = "degree"', the input is an angle(0-360). |
r |
Numeric, radius of the outer circle of the sector(0-0.5). |
start |
Numeric, starting angle of sector. |
r_start |
Numeric, radius of the inner circle of the sector(0-r). |
type |
"percent", "degree" or an integer (preferably greater than 50),
represents the number of scattered points on the circle where the sector is drawn.
When |
ratio |
aspect ratio, expressed as |
group |
A numeric vector used to separate locations in x and y into multiple sectors. If missing, it will be automatically added as a number. |
sector_df()
Only one value can be passed in for each parameter,
and a sector coordinate is returned.
sector_df_multiple()
Each parameter can pass in multiple values,
and return multiple sector coordinates
The value of the 'type' parameter is "percent", "degree" or an integer (preferably greater than 50), represents the number of scattered points on the circle where the sector is drawn. When type = "percent", the circumference of the circle where the sector is located is composed of 100 scattered points; when type = "degree", the circumference of the circle where the sector is located is composed of 360 scattered points
For more details, please type vignette("ggsector")
.
coordinates of sector.
coordinates of sectors.
## coordinates of single sector # type of percent, start = 0, r_start = 0 tmp_df <- sector_df(x = 0.5, y = 0.5, theta = 25, r = 0.4, start = 0, r_start = 0) tmp_df grid.newpage() grid.polygon( tmp_df$x, tmp_df$y, vp = viewport(height = unit(1, "snpc"), width = unit(1, "snpc")) ) # type of percent, start = 50, r_start = 0.2 tmp_df <- sector_df(x = 0.5, y = 0.5, theta = 25, r = 0.4, start = 50, r_start = 0.2) tmp_df grid.newpage() grid.polygon( tmp_df$x, tmp_df$y, vp = viewport(height = unit(1, "snpc"), width = unit(1, "snpc")) ) # type of degree, start = 90, r_start = 0 tmp_df <- sector_df( x = 0.5, y = 0.5, theta = 180, r = 0.4, start = 90, r_start = 0, type = "degree" ) tmp_df grid.newpage() grid.polygon( tmp_df$x, tmp_df$y, vp = viewport(height = unit(1, "snpc"), width = unit(1, "snpc")) ) # type of degree, start = 180, r_start = 0.2 tmp_df <- sector_df( x = 0.5, y = 0.5, theta = 180, r = 0.4, start = 270, r_start = 0.2, type = "degree" ) tmp_df grid.newpage() grid.polygon( tmp_df$x, tmp_df$y, vp = viewport(height = unit(1, "snpc"), width = unit(1, "snpc")) ) ## Coordinates of Multiple Sectors tmp_df <- sector_df_multiple( x = c(0.2, 0.5, 0.8), theta = c(25, 50, 75), r = 0.15, start = c(75, 50, 100), r_start = c(0, 0.05, 0.1), type = "percent" ) tmp_df grid.newpage() grid.polygon( tmp_df$x, tmp_df$y, id = tmp_df$group, vp = viewport(height = unit(1, "snpc"), width = unit(1, "snpc")), gp = gpar( fill = 3:1, col = 1:3 ) ) # type = 10, 100, 1000 tmp_df <- sector_df_multiple( x = c(0.25, 0.5, 0.75), theta = c(7.5, 75, 750), r = 0.125, r_start = c(0.05), type = c(c(10, "percent", 1000)) ) tmp_df grid.newpage() grid.polygon( tmp_df$x, tmp_df$y, id = tmp_df$group, vp = viewport(height = unit(1, "snpc"), width = unit(1, "snpc")), gp = gpar( fill = 3:1, col = 1:3 ) )
## coordinates of single sector # type of percent, start = 0, r_start = 0 tmp_df <- sector_df(x = 0.5, y = 0.5, theta = 25, r = 0.4, start = 0, r_start = 0) tmp_df grid.newpage() grid.polygon( tmp_df$x, tmp_df$y, vp = viewport(height = unit(1, "snpc"), width = unit(1, "snpc")) ) # type of percent, start = 50, r_start = 0.2 tmp_df <- sector_df(x = 0.5, y = 0.5, theta = 25, r = 0.4, start = 50, r_start = 0.2) tmp_df grid.newpage() grid.polygon( tmp_df$x, tmp_df$y, vp = viewport(height = unit(1, "snpc"), width = unit(1, "snpc")) ) # type of degree, start = 90, r_start = 0 tmp_df <- sector_df( x = 0.5, y = 0.5, theta = 180, r = 0.4, start = 90, r_start = 0, type = "degree" ) tmp_df grid.newpage() grid.polygon( tmp_df$x, tmp_df$y, vp = viewport(height = unit(1, "snpc"), width = unit(1, "snpc")) ) # type of degree, start = 180, r_start = 0.2 tmp_df <- sector_df( x = 0.5, y = 0.5, theta = 180, r = 0.4, start = 270, r_start = 0.2, type = "degree" ) tmp_df grid.newpage() grid.polygon( tmp_df$x, tmp_df$y, vp = viewport(height = unit(1, "snpc"), width = unit(1, "snpc")) ) ## Coordinates of Multiple Sectors tmp_df <- sector_df_multiple( x = c(0.2, 0.5, 0.8), theta = c(25, 50, 75), r = 0.15, start = c(75, 50, 100), r_start = c(0, 0.05, 0.1), type = "percent" ) tmp_df grid.newpage() grid.polygon( tmp_df$x, tmp_df$y, id = tmp_df$group, vp = viewport(height = unit(1, "snpc"), width = unit(1, "snpc")), gp = gpar( fill = 3:1, col = 1:3 ) ) # type = 10, 100, 1000 tmp_df <- sector_df_multiple( x = c(0.25, 0.5, 0.75), theta = c(7.5, 75, 750), r = 0.125, r_start = c(0.05), type = c(c(10, "percent", 1000)) ) tmp_df grid.newpage() grid.polygon( tmp_df$x, tmp_df$y, id = tmp_df$group, vp = viewport(height = unit(1, "snpc"), width = unit(1, "snpc")), gp = gpar( fill = 3:1, col = 1:3 ) )
sectorGrob()
return a polygon grob. grid.sector()
draw sector.
For more details, please type vignette("ggsector")
.
sectorGrob( x = 0.5, y = 0.5, theta = 25, r = 0.5, start = 0, r_start = 0, type = "percent", ratio = 1, group, default.units = "npc", vp = viewport(height = unit(1, "snpc"), width = unit(1, "snpc")), gp = gpar(col = "black", fill = "transparent") ) grid.sector( x = 0.5, y = 0.5, theta = 25, r = 0.5, start = 0, r_start = 0, type = "percent", ratio = 1, group, default.units = "npc", vp = viewport(height = unit(1, "snpc"), width = unit(1, "snpc")), gp = gpar(col = "black", fill = "transparent") )
sectorGrob( x = 0.5, y = 0.5, theta = 25, r = 0.5, start = 0, r_start = 0, type = "percent", ratio = 1, group, default.units = "npc", vp = viewport(height = unit(1, "snpc"), width = unit(1, "snpc")), gp = gpar(col = "black", fill = "transparent") ) grid.sector( x = 0.5, y = 0.5, theta = 25, r = 0.5, start = 0, r_start = 0, type = "percent", ratio = 1, group, default.units = "npc", vp = viewport(height = unit(1, "snpc"), width = unit(1, "snpc")), gp = gpar(col = "black", fill = "transparent") )
x |
Numeric, the x-axis coordinate of the sector center. |
y |
Numeric, the y-axis coordinate of the sector center. |
theta |
Numeric, the angle of the sector, if 'type = "percent"', the input is a percentage(0-100), if 'type = "degree"', the input is an angle(0-360). |
r |
Numeric, radius of the outer circle of the sector(0-0.5). |
start |
Numeric, starting angle of sector. |
r_start |
Numeric, radius of the inner circle of the sector(0-r). |
type |
"percent", "degree" or an integer (preferably greater than 50),
represents the number of scattered points on the circle where the sector is drawn.
When |
ratio |
aspect ratio, expressed as |
group |
A numeric vector used to separate locations in x and y into multiple sectors. If missing, it will be automatically added as a number. |
default.units |
A string indicating the default units to use
if |
vp |
A Grid viewport object (or NULL). |
gp |
An object of class |
polygon grob
draw sector
## Draw basic grid # sectorGrob with units of "cm" and type of "degree" grid.newpage() gp <- sectorGrob( x = unit(c(3, 9, 15), "cm"), y = unit(c(5, 9, 15), "cm"), theta = c(90, 180, 270), r = 1, start = c(180, 180, 270), r_start = c(0.6, 0.3, 0), type = "degree", group = factor(1:3, levels = c(2, 3, 1)), gp = gpar(fill = c("green", "red", "blue")) ) grid.draw(gp) # grid.sector with units of "npc" and type of "percent" grid.newpage() grid.sector( x = c(0.1, 0.5, 0.9), y = c(0.9, 0.6, 0.1), theta = c(25, 50, 90), r = .1, start = c(25, 50, 100), r_start = c(0.06, 0.03, 0), type = "percent", group = factor(1:3, levels = c(2, 3, 1)), gp = gpar(col = c("green", "red", "blue"), fill = 2:4), default.units = "npc" ) ## Draw sector with ComplexHeatmap # prepare data library(magrittr) library(ComplexHeatmap) t0 <- cor(mtcars) %>% set_colnames(paste("y_", colnames(.))) %>% set_rownames(paste("x_", rownames(.))) mat <- abs(t0) mat[1:5, 1:5] # Realized by modifying the [grid::viewport()], # the sector can be set with a fixed width and height set.seed(1) Heatmap( mat, name = "vp", rect_gp = gpar(type = "none"), cell_fun = function(j, i, x, y, width, height, fill) { grid.rect( x = x, y = y, width = width, height = height, gp = gpar(col = "grey", fill = NA) ) grid.sector( theta = mat[i, j] * 100, r = 0.5, start = mat[i, j] * 100 * runif(1), r_start = mat[i, j] * 0.49 * runif(1), vp = viewport(x, y, width, height), gp = gpar(fill = fill, col = "transparent") ) }, width = unit(.7, "snpc"), height = unit(.7, "snpc") ) # Realized in the form of coordinates + radius. # The default viewport locks the horizontal and vertical axes # so that the sector does not deform, which needs to be removed here. # The radius 'r' is half the min(length, width). set.seed(2) Heatmap( mat, name = "xy + r", rect_gp = gpar(type = "none"), cell_fun = function(j, i, x, y, width, height, fill) { grid.rect( x = x, y = y, width = width, height = height, gp = gpar(col = "grey", fill = NA) ) r <- as.numeric(min(width, height)) / 2 grid.sector( x, y, theta = mat[i, j] * 100, r = r, start = mat[i, j] * 100 * runif(1), r_start = mat[i, j] * r * 0.9 * runif(1), vp = NULL, gp = gpar(fill = fill, col = "transparent") ) }, width = unit(.7, "snpc"), height = unit(.7, "snpc") ) # layer full # The input matrix needs to be extracted with pindex(mat, i, j) set.seed(3) Heatmap( mat, name = "layer", rect_gp = gpar(type = "none"), layer_fun = function(j, i, x, y, width, height, fill) { grid.rect( x = x, y = y, width = width, height = height, gp = gpar(col = "grey", fill = NA) ) r <- as.numeric(min(width, height)) / 2 grid.sector( x, y, theta = pindex(mat, i, j) * 100, r = r, start = pindex(mat, i, j) * 100 * runif(nrow(mat) * ncol(mat)), r_start = pindex(mat, i, j) * r * 0.9 * runif(nrow(mat) * ncol(mat)), vp = NULL, gp = gpar(fill = fill, col = "transparent") ) }, width = unit(.7, "snpc"), height = unit(.7, "snpc") )
## Draw basic grid # sectorGrob with units of "cm" and type of "degree" grid.newpage() gp <- sectorGrob( x = unit(c(3, 9, 15), "cm"), y = unit(c(5, 9, 15), "cm"), theta = c(90, 180, 270), r = 1, start = c(180, 180, 270), r_start = c(0.6, 0.3, 0), type = "degree", group = factor(1:3, levels = c(2, 3, 1)), gp = gpar(fill = c("green", "red", "blue")) ) grid.draw(gp) # grid.sector with units of "npc" and type of "percent" grid.newpage() grid.sector( x = c(0.1, 0.5, 0.9), y = c(0.9, 0.6, 0.1), theta = c(25, 50, 90), r = .1, start = c(25, 50, 100), r_start = c(0.06, 0.03, 0), type = "percent", group = factor(1:3, levels = c(2, 3, 1)), gp = gpar(col = c("green", "red", "blue"), fill = 2:4), default.units = "npc" ) ## Draw sector with ComplexHeatmap # prepare data library(magrittr) library(ComplexHeatmap) t0 <- cor(mtcars) %>% set_colnames(paste("y_", colnames(.))) %>% set_rownames(paste("x_", rownames(.))) mat <- abs(t0) mat[1:5, 1:5] # Realized by modifying the [grid::viewport()], # the sector can be set with a fixed width and height set.seed(1) Heatmap( mat, name = "vp", rect_gp = gpar(type = "none"), cell_fun = function(j, i, x, y, width, height, fill) { grid.rect( x = x, y = y, width = width, height = height, gp = gpar(col = "grey", fill = NA) ) grid.sector( theta = mat[i, j] * 100, r = 0.5, start = mat[i, j] * 100 * runif(1), r_start = mat[i, j] * 0.49 * runif(1), vp = viewport(x, y, width, height), gp = gpar(fill = fill, col = "transparent") ) }, width = unit(.7, "snpc"), height = unit(.7, "snpc") ) # Realized in the form of coordinates + radius. # The default viewport locks the horizontal and vertical axes # so that the sector does not deform, which needs to be removed here. # The radius 'r' is half the min(length, width). set.seed(2) Heatmap( mat, name = "xy + r", rect_gp = gpar(type = "none"), cell_fun = function(j, i, x, y, width, height, fill) { grid.rect( x = x, y = y, width = width, height = height, gp = gpar(col = "grey", fill = NA) ) r <- as.numeric(min(width, height)) / 2 grid.sector( x, y, theta = mat[i, j] * 100, r = r, start = mat[i, j] * 100 * runif(1), r_start = mat[i, j] * r * 0.9 * runif(1), vp = NULL, gp = gpar(fill = fill, col = "transparent") ) }, width = unit(.7, "snpc"), height = unit(.7, "snpc") ) # layer full # The input matrix needs to be extracted with pindex(mat, i, j) set.seed(3) Heatmap( mat, name = "layer", rect_gp = gpar(type = "none"), layer_fun = function(j, i, x, y, width, height, fill) { grid.rect( x = x, y = y, width = width, height = height, gp = gpar(col = "grey", fill = NA) ) r <- as.numeric(min(width, height)) / 2 grid.sector( x, y, theta = pindex(mat, i, j) * 100, r = r, start = pindex(mat, i, j) * 100 * runif(nrow(mat) * ncol(mat)), r_start = pindex(mat, i, j) * r * 0.9 * runif(nrow(mat) * ncol(mat)), vp = NULL, gp = gpar(fill = fill, col = "transparent") ) }, width = unit(.7, "snpc"), height = unit(.7, "snpc") )
A better alternative to Seurat::DotPlot()
.
For more details, please type vignette("ggsector")
.
SectorPlot( object, features, features.level, assay, slot = c("data", "scale.data", "counts"), group.by, group.level, split.by, split.level, col_low = "blue", col_mid = "white", col_high = "red", col_midpoint, ... )
SectorPlot( object, features, features.level, assay, slot = c("data", "scale.data", "counts"), group.by, group.level, split.by, split.level, col_low = "blue", col_mid = "white", col_high = "red", col_midpoint, ... )
object |
Seurat object |
features |
Input vector of genes list. |
features.level |
Levels of genes list. |
assay |
Specific assay to get data from or set data for; defaults to the default assay. |
slot |
Specific assay data to get or set. |
group.by |
Column of metadata to group the cells by, default is Idents(). |
group.level |
Levels of group. |
split.by |
Column of metadata to split the cells by, default is NULL. |
split.level |
Levels of split vars. |
col_low |
Colours for low ends of the gradient. |
col_mid |
Colour for mid point. |
col_high |
Colours for high ends of the gradient. |
col_midpoint |
The midpoint (in data value) of the diverging scale. |
... |
Other arguments for |
ggplot
## Download pbmc data from # https://cf.10xgenomics.com/samples/cell/pbmc3k/pbmc3k_filtered_gene_bc_matrices.tar.gz library(Seurat) path <- paste0(tempdir(), "/pbmc3k.tar.gz") file <- paste0(tempdir(), "/filtered_gene_bc_matrices/hg19") download.file( "https://cf.10xgenomics.com/samples/cell/pbmc3k/pbmc3k_filtered_gene_bc_matrices.tar.gz", path ) untar(path, exdir = tempdir()) pbmc.data <- Read10X(data.dir = file) pbmc <- CreateSeuratObject( counts = pbmc.data, project = "pbmc3k", min.cells = 3, min.features = 200 ) pbmc <- NormalizeData(pbmc) pbmc <- FindVariableFeatures(pbmc, selection.method = "vst", nfeatures = 2000) pbmc <- ScaleData(pbmc, features = rownames(pbmc)) pbmc <- RunPCA(pbmc) pbmc <- RunUMAP(pbmc, dim = 1:10) pbmc <- FindNeighbors(pbmc, dims = 1:10) pbmc <- FindClusters(pbmc, resolution = 1) pbmc <- FindClusters(pbmc, resolution = 0.5) markers <- tibble::tribble( ~type, ~marker, "Naive CD4+ T", "IL7R,CCR7", "CD14+ Mono", "CD14,LYZ", "Memory CD4+", "IL7R,S100A4", "B", "MS4A1", "CD8+ T", "CD8A", "FCGR3A+ Mono", "FCGR3A,MS4A7", "NK", "GNLY,NKG7", "DC", "FCER1A,CST3", "Platelet", "PPBP", ) %>% tidyr::separate_rows(marker, sep = ", *") %>% dplyr::distinct() # Dotplot DotPlot(pbmc, features = unique(markers$marker)) + coord_flip() # contrast with DotPlot SectorPlot(pbmc, markers$marker, features.level = unique(rev(markers$marker))) SectorPlot(pbmc, markers$marker, group.by = "RNA_snn_res.1") # split plot # Assume a variable 'day', expressed as the number of days of cell development. set.seed(1) pbmc[["day"]] <- sample(1:3, ncol(pbmc), TRUE) SectorPlot(pbmc, markers$marker, group.by = "RNA_snn_res.0.5", split.by = "day") SectorPlot( pbmc, markers$marker, group.by = "day", split.by = "RNA_snn_res.0.5", nrow = 1 )
## Download pbmc data from # https://cf.10xgenomics.com/samples/cell/pbmc3k/pbmc3k_filtered_gene_bc_matrices.tar.gz library(Seurat) path <- paste0(tempdir(), "/pbmc3k.tar.gz") file <- paste0(tempdir(), "/filtered_gene_bc_matrices/hg19") download.file( "https://cf.10xgenomics.com/samples/cell/pbmc3k/pbmc3k_filtered_gene_bc_matrices.tar.gz", path ) untar(path, exdir = tempdir()) pbmc.data <- Read10X(data.dir = file) pbmc <- CreateSeuratObject( counts = pbmc.data, project = "pbmc3k", min.cells = 3, min.features = 200 ) pbmc <- NormalizeData(pbmc) pbmc <- FindVariableFeatures(pbmc, selection.method = "vst", nfeatures = 2000) pbmc <- ScaleData(pbmc, features = rownames(pbmc)) pbmc <- RunPCA(pbmc) pbmc <- RunUMAP(pbmc, dim = 1:10) pbmc <- FindNeighbors(pbmc, dims = 1:10) pbmc <- FindClusters(pbmc, resolution = 1) pbmc <- FindClusters(pbmc, resolution = 0.5) markers <- tibble::tribble( ~type, ~marker, "Naive CD4+ T", "IL7R,CCR7", "CD14+ Mono", "CD14,LYZ", "Memory CD4+", "IL7R,S100A4", "B", "MS4A1", "CD8+ T", "CD8A", "FCGR3A+ Mono", "FCGR3A,MS4A7", "NK", "GNLY,NKG7", "DC", "FCER1A,CST3", "Platelet", "PPBP", ) %>% tidyr::separate_rows(marker, sep = ", *") %>% dplyr::distinct() # Dotplot DotPlot(pbmc, features = unique(markers$marker)) + coord_flip() # contrast with DotPlot SectorPlot(pbmc, markers$marker, features.level = unique(rev(markers$marker))) SectorPlot(pbmc, markers$marker, group.by = "RNA_snn_res.1") # split plot # Assume a variable 'day', expressed as the number of days of cell development. set.seed(1) pbmc[["day"]] <- sample(1:3, ncol(pbmc), TRUE) SectorPlot(pbmc, markers$marker, group.by = "RNA_snn_res.0.5", split.by = "day") SectorPlot( pbmc, markers$marker, group.by = "day", split.by = "RNA_snn_res.0.5", nrow = 1 )