phenoScreen is a collection of R functions I created for personal use for phenotypic screening studies, though the majority are applicable to any work with multi-well plates.

Link to Github page:
https://www.github.com/Swarchal/phenoScreen

The code for plotting multi-well plates in ggplot2 was adapted from Brian Connely’s blog.


Well labels

numbers <- 1:96
num_to_well(numbers)
##  [1] "A01" "A02" "A03" "A04" "A05" "A06" "A07" "A08" "A09" "A10" "A11"
## [12] "A12" "B01" "B02" "B03" "B04" "B05" "B06" "B07" "B08" "B09" "B10"
## [23] "B11" "B12" "C01" "C02" "C03" "C04" "C05" "C06" "C07" "C08" "C09"
## [34] "C10" "C11" "C12" "D01" "D02" "D03" "D04" "D05" "D06" "D07" "D08"
## [45] "D09" "D10" "D11" "D12" "E01" "E02" "E03" "E04" "E05" "E06" "E07"
## [56] "E08" "E09" "E10" "E11" "E12" "F01" "F02" "F03" "F04" "F05" "F06"
## [67] "F07" "F08" "F09" "F10" "F11" "F12" "G01" "G02" "G03" "G04" "G05"
## [78] "G06" "G07" "G08" "G09" "G10" "G11" "G12" "H01" "H02" "H03" "H04"
## [89] "H05" "H06" "H07" "H08" "H09" "H10" "H11" "H12"

And works with 384-well plates, as well as and partial plates:

numbers <- 320:384
num_to_well(numbers, plate = 384)
##  [1] "N08" "N09" "N10" "N11" "N12" "N13" "N14" "N15" "N16" "N17" "N18"
## [12] "N19" "N20" "N21" "N22" "N23" "N24" "O01" "O02" "O03" "O04" "O05"
## [23] "O06" "O07" "O08" "O09" "O10" "O11" "O12" "O13" "O14" "O15" "O16"
## [34] "O17" "O18" "O19" "O20" "O21" "O22" "O23" "O24" "P01" "P02" "P03"
## [45] "P04" "P05" "P06" "P07" "P08" "P09" "P10" "P11" "P12" "P13" "P14"
## [56] "P15" "P16" "P17" "P18" "P19" "P20" "P21" "P22" "P23" "P24"
wells <- c("A01", "D08", "H12")
well_to_num(wells)
## [1]  1 44 96

Both num_to_well and well_to_num order the wells by starting each new row at the left hand side of the plate, i.e …A11, A12, B01, B02… However, some automated systems count wells in a way to maximise speed, and snake across the rows, i.e …A11, A12, B12, B11… To change to this behaviour use the style argument.

wells <- c("A11", "A12", "B01", "B02")
well_to_num(wells)
## [1] 11 12 13 14
well_to_num(wells, style = "snake")
## [1] 11 12 23 24

well value
A01 3
A02 8

The read_map function can annotate data such as this with values from a platemap (in the same spatial layout as the plate). The easiest way to do this is create the platemap as a .csv file in a spreadsheet programme, and then import this into R.

This will then annotate the correct well dependent on the position of the values in the platemap.


Plate data

Plate heatmaps

To produce a heatmap of numerical data in the layout of the plate, the function z_map (‘z’ for z-score) takes alpha-numerical well identifiers, and numerical values, nomalises and centers the numerical values, and plots them in a platelayout in the spatial context of the well identifiers.

# example data
wells <- num_to_well(1:96)
vals <- rnorm(96)
df96 <- data.frame(wells, vals)
z_map(data = df96$vals,
      well = df96$wells,
      title = "Example plot")