Creating a Scatterplot with Texture

Importing Local Libraries

library(scatterHatch)

Preparing the Data

The data that will be used to showcase the function is a tissue-CyCIF PDAC dataset from Lin et al. The preprocessing begins by adding manual annotations for each cell’s location in the tissue sample.

data("pdacData")
pdacData$cellID <- paste0('cell_', 1:nrow(pdacData))
pdacData$Yt <- -pdacData$Yt
pancreas_frames = c(1:6, 27:31, 15:19, 40:44)
PDAC_frames = c(23:26, 35:37, 51:52, 64:65, 77)
small_intestines_frames = c(49:50, 63, 75:76, 88:89, 100:103, 112:116, 125:129, 137:140)
annotateLocation <- function(frame){
    if (frame %in% pancreas_frames){return("Pancreas")}
    if (frame %in% PDAC_frames){return("PDAC")}
    if (frame %in% small_intestines_frames){return("Small Intestine")}
    return("Other")
}
pdacData$location <- sapply(pdacData$frame, annotateLocation)

head(pdacData[, c('Xt', 'Yt', 'location', 'frame')])
#>         Xt        Yt location frame
#> 1 1342.878  -801.154 Pancreas     1
#> 2 5688.494 -1391.393 Pancreas     4
#> 3 6295.826 -1393.807 Pancreas     4
#> 4 5344.257 -1391.650 Pancreas     4
#> 5 5640.034 -1391.416 Pancreas     4
#> 6 5923.357 -1390.776 Pancreas     4

Creating a Basic ScatterHatch Plot

scatterHatch() must have a data frame passed to it, along with three strings denoting the columns with the x/y coordinates and a factor variable of each point being plotted. The factor variable identifies the group each point is a part of. scatterHatch() returns a ggplot2 object with three layers; the points, the line segments (the hatching), and an invisible custom geom to render the legend icons.

plt <- scatterHatch(data = pdacData, x = "Xt", y = "Yt", 
    color_by = "location", legendTitle = "Tissue Type")
plot(plt)

Customizing ScatterHatch Plot

Changing the Order of Pattern Assignment

Controlling the aesthetics of each pattern is done by passing a list to the patternList argument. Each element of the list should contain a list that denotes the desired aesthetics for each pattern. Every element of patternList must have a named element called “pattern” that contains the unique pattern type for which the aesthetics are being changed. If patternList is passed, then the length of patternList must be equal to the number of groups being plotted.

Changing the Angles of each Pattern

Angle denotes the angle(s) for which the lines of a particular hatching pattern should be drawn. For example, the default horizontal pattern (“+”) is an angle of 0 while the default vertical pattern (“-”) is an angle of 90. Angle can be a vector with multiple angles. For example, the cross (“x”) is a vector of angles: c(135, 45).

patternList = list(list(pattern="/", angle = 70), list(pattern="-"), list(pattern="x", angle = c(135, 90, 45), lineWidth = 0.2), list(pattern="+"))
plt <- scatterHatch(data = pdacData, x = "Xt", y = "Yt", 
    color_by = "location", legendTitle = "Tissue Type", 
    patternList = patternList)
plot(plt)

scatterHatch() Arguments Explained

Argument Description
data A dataframe of the dataset being plotted
x A string describing the column name with the x-coordinates of the points being plotted
y A string describing the column name with the y-coordinates of the points being plotted
factor A string describing the column name of the factor variable
legendTitle The legend title
pointSize ggplot2 point size
pointAlpha Transparency of each point
gridSize Integer describing the precision of the hatched patterns. Larger the value, greater the precision at the expense of efficiency. Default segregates plots into 10000 bins
sparsePoints A logical vector that denotes the outlying points. Default utilizies an in-built sparsity detector
patternList List containing the aesthethics of each pattern
colorPalette Character vector describing the point color of each group; default is color-blind friendly and uses colors from the dittoSeq package

Pattern Aesthetics Arguments

These pattern aesthetics are passed into a list in the patternList argument of scatterHatch().

Aesthetics Description
pattern A string representing one of the possible 7 patterns to be used: (horizontal or “-”), (vertical or “|”), (positiveDiagonal or “/”), (negativeDiagonal or “"), (checkers or”+“), (cross or”x”), and (blank or ““).
angle Vector or number denoting at what angle(s) the lines in a hatching pattern should be drawn - e.g. c(45, 90, 135)
lineWidth Number representing the width of the lines in the pattern
lineColor String representing the colors of the lines in the pattern (black, white, etc.)
lineType String representing the type of lines in the pattern (solid, dashed, etc.)

Session Info

sessionInfo()
#> R version 4.4.2 (2024-10-31)
#> Platform: x86_64-pc-linux-gnu
#> Running under: Ubuntu 24.04.1 LTS
#> 
#> Matrix products: default
#> BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 
#> LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.26.so;  LAPACK version 3.12.0
#> 
#> locale:
#>  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
#>  [3] LC_TIME=en_US.UTF-8        LC_COLLATE=C              
#>  [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
#>  [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
#>  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
#> [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       
#> 
#> time zone: Etc/UTC
#> tzcode source: system (glibc)
#> 
#> attached base packages:
#> [1] stats     graphics  grDevices utils     datasets  methods   base     
#> 
#> other attached packages:
#> [1] scatterHatch_1.13.0 rmarkdown_2.29     
#> 
#> loaded via a namespace (and not attached):
#>  [1] Matrix_1.7-1          gtable_0.3.6          jsonlite_1.8.9       
#>  [4] compiler_4.4.2        spatstat.utils_3.1-1  Rcpp_1.0.13-1        
#>  [7] jquerylib_0.1.4       scales_1.3.0          yaml_2.3.10          
#> [10] fastmap_1.2.0         lattice_0.22-6        plyr_1.8.9           
#> [13] ggplot2_3.5.1         deldir_2.0-4          R6_2.5.1             
#> [16] spatstat.univar_3.1-1 labeling_0.4.3        spatstat.geom_3.3-4  
#> [19] knitr_1.49            polyclip_1.10-7       tibble_3.2.1         
#> [22] maketools_1.3.1       munsell_0.5.1         bslib_0.8.0          
#> [25] pillar_1.9.0          rlang_1.1.4           utf8_1.2.4           
#> [28] cachem_1.1.0          xfun_0.49             sass_0.4.9           
#> [31] sys_3.4.3             cli_3.6.3             withr_3.0.2          
#> [34] magrittr_2.0.3        digest_0.6.37         grid_4.4.2           
#> [37] lifecycle_1.0.4       vctrs_0.6.5           evaluate_1.0.1       
#> [40] glue_1.8.0            farver_2.1.2          buildtools_1.0.0     
#> [43] fansi_1.0.6           colorspace_2.1-1      spatstat.data_3.1-4  
#> [46] tools_4.4.2           pkgconfig_2.0.3       htmltools_0.5.8.1