library(ggplot2)
library(ggrepel)

Read Valentine’s DB

db <- read.delim('sdb_May2020.csv',sep=',')

db$Year <- as.numeric(substr(db$Date, 1, 4))
db$Reported.cells.total <- as.integer(gsub(',','',as.character(db$Reported.cells.total)))
time.scale
[1] 1420088400 1451624400

Select studies

# processors
tdf <- data.frame(year=c(1993,1997,2000,2002,2006,2008,2012,2014,2016,2017,2019),name=c('Pentium','AMD K6','Pentium III','Pentium IV Northwood','Core 2 Duo Conroe','Core i7','Core i7 Haswell','Xeon Hawell5','Xeon Broadwell','Epyc','Epyc ROME'),tc=c(3.1e6,8e6,2.1e7,5.5e7,291e6,731e6,1.4e9,5.5e9,7.2e9,19.2e9,39e9))

scf <- data.frame(year=c(2009,2010,2011,2013,2014,2015,2017,2019),
                  name=c('Surani','Surani','Linnarsson','West','STRT-C1','InDrops/Drop-seq','10x Chromium','sci-RNA-seq3'),
                  tc=c(2,15,85,301,3e3,44e3,1.3e6,2.06e6))

scf <- data.frame(do.call(rbind,list(
  c(2009,'Surani',2),
  c(2010,'Surani',15),
  c(2011.3,'STRT',85),
  c(2014.1,'MARS',4468),
  c(2015.1,'CytoSeq',15000),
  c(2015.38,'InDrops/Drop-seq',44e3),
  c(2017,'10x Chromium',1.3e6),
  c(2019,'sci-RNA-seq3',2.06e6)
)),stringsAsFactors=F)
colnames(scf) <- c('year','name','tc')
scf$year <- as.numeric(scf$year); scf$tc <- as.numeric(scf$tc)


tdf$type <- 'CPUs'
scf$type <- 'Landmark studies'
acf <- data.frame(year=db$time,name=db$Shorthand,tc=db$Reported.cells.total,type='all studies'); 
acf
cd <- do.call(rbind,list(tdf,scf,acf))
cd$type <- as.factor(cd$type)
cd$name <- as.character(cd$name)
cd$name[cd$type=='all studies'] <- '';

p <- ggplot(cd,aes(x=year,y=log10(tc),color=type,label=name)) + 
  geom_point(data=cd[cd$type=='all studies',],aes(x=year,y=log10(tc)),color=adjustcolor('red',alpha=0.2),size=0.2) +
  geom_point(size=2) + 
  coord_cartesian(ylim = c(0, 13.5)) +
  geom_hline(yintercept = log10(3.73*1e13),lty=2,col='darkgreen',size=1.5)+
  annotate('text',label='number of cells in a human body',x=Inf,y=12.8,vjust=0,hjust=1.3,size=5,color='darkgreen')+
  theme_bw() + guides(color='none') + 
  scale_color_manual(values=c(adjustcolor('white',alpha=0.01),"black", "red")) +
  geom_text_repel(box.padding = 0.55,size=4) +
  geom_smooth(method = "lm", se = FALSE,linetype=2,size=0.5,fullrange=TRUE) +
  xlab("Date")+ylab("log10[ count ]") 
  
p

pdf(file='studies.pdf',width=5,height=5); print(p); dev.off();
null device 
          1 
LS0tCnRpdGxlOiAiU3R1ZGllcyBzY2FsaW5nIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ2dyZXBlbCkKYGBgCgoKClJlYWQgVmFsZW50aW5lJ3MgREIKCmBgYHtyfQpkYiA8LSByZWFkLmRlbGltKCdzZGJfTWF5MjAyMC5jc3YnLHNlcD0nLCcpCgpkYiRZZWFyIDwtIGFzLm51bWVyaWMoc3Vic3RyKGRiJERhdGUsIDEsIDQpKQpkYiRSZXBvcnRlZC5jZWxscy50b3RhbCA8LSBhcy5pbnRlZ2VyKGdzdWIoJywnLCcnLGFzLmNoYXJhY3RlcihkYiRSZXBvcnRlZC5jZWxscy50b3RhbCkpKQpgYGAKCmBgYHtyfQpkYiA8LSBuYS5vbWl0KGRiW2RiJE1lYXN1cmVtZW50PT0nUk5BLXNlcScsXSkKCmRiJFBsYXRmb3JtIDwtIHJlcCgnb3RoZXInLGxlbmd0aChkYiRUZWNobmlxdWUpKTsKIApkYiRQbGF0Zm9ybVtncmVwbCgnU21hcnQtc2VxMicsZGIkVGVjaG5pcXVlKV0gPC0gJ1NtYXJ0LXNlcTInCmRiJFBsYXRmb3JtW2dyZXBsKCdTTUFSVGVyJyxkYiRUZWNobmlxdWUpXSA8LSAnU01BUlRlcicKZGIkUGxhdGZvcm1bZ3JlcGwoJ0Ryb3Atc2VxJyxkYiRUZWNobmlxdWUpXSA8LSAnRHJvcC1zZXEnCmRiJFBsYXRmb3JtW2dyZXBsKCdJbkRyb3BzJyxkYiRUZWNobmlxdWUpXSA8LSAnSW5Ecm9wcycKZGIkUGxhdGZvcm1bZ3JlcGwoJ0Nocm9taXVtJyxkYiRUZWNobmlxdWUpXSA8LSAnQ2hyb21pdW0nCmRiJFBsYXRmb3JtIDwtIGFzLmZhY3RvcihkYiRQbGF0Zm9ybSkKCmRiJHRpbWUgPC0gYXMubnVtZXJpYyhhcy5QT1NJWGN0KGFzLmNoYXJhY3RlcihkYiREYXRlKSwgZm9ybWF0PSIlWSVtJWQiKSkKCnRpbWUuc2NhbGUgPC0gYXMubnVtZXJpYyhhcy5QT1NJWGN0KGMoJzIwMTUwMTAxJywnMjAxNjAxMDEnKSwgZm9ybWF0PSIlWSVtJWQiKSkKZGIkdGltZSA8LSAoZGIkdGltZS10aW1lLnNjYWxlWzFdKS9kaWZmKHRpbWUuc2NhbGUpKzIwMTUKYGBgCgoKYGBge3J9CmdncGxvdChkYixhZXMoeD10aW1lLHk9bG9nMTAoUmVwb3J0ZWQuY2VsbHMudG90YWwpLGNvbG9yPVBsYXRmb3JtKSkgKyBnZW9tX3BvaW50KCkKYGBgCgpTZWxlY3Qgc3R1ZGllcwpgYGB7cn0KIyBwcm9jZXNzb3JzCnRkZiA8LSBkYXRhLmZyYW1lKHllYXI9YygxOTkzLDE5OTcsMjAwMCwyMDAyLDIwMDYsMjAwOCwyMDEyLDIwMTQsMjAxNiwyMDE3LDIwMTkpLG5hbWU9YygnUGVudGl1bScsJ0FNRCBLNicsJ1BlbnRpdW0gSUlJJywnUGVudGl1bSBJViBOb3J0aHdvb2QnLCdDb3JlIDIgRHVvIENvbnJvZScsJ0NvcmUgaTcnLCdDb3JlIGk3IEhhc3dlbGwnLCdYZW9uIEhhd2VsbDUnLCdYZW9uIEJyb2Fkd2VsbCcsJ0VweWMnLCdFcHljIFJPTUUnKSx0Yz1jKDMuMWU2LDhlNiwyLjFlNyw1LjVlNywyOTFlNiw3MzFlNiwxLjRlOSw1LjVlOSw3LjJlOSwxOS4yZTksMzllOSkpCgpzY2YgPC0gZGF0YS5mcmFtZShkby5jYWxsKHJiaW5kLGxpc3QoCiAgYygyMDA5LCdTdXJhbmknLDIpLAogIGMoMjAxMCwnU3VyYW5pJywxNSksCiAgYygyMDExLjMsJ1NUUlQnLDg1KSwKICBjKDIwMTQuMSwnTUFSUycsNDQ2OCksCiAgYygyMDE1LjEsJ0N5dG9TZXEnLDE1MDAwKSwKICBjKDIwMTUuMzgsJ0luRHJvcHMvRHJvcC1zZXEnLDQ0ZTMpLAogIGMoMjAxNywnMTB4IENocm9taXVtJywxLjNlNiksCiAgYygyMDE5LCdzY2ktUk5BLXNlcTMnLDIuMDZlNikKKSksc3RyaW5nc0FzRmFjdG9ycz1GKQpjb2xuYW1lcyhzY2YpIDwtIGMoJ3llYXInLCduYW1lJywndGMnKQpzY2YkeWVhciA8LSBhcy5udW1lcmljKHNjZiR5ZWFyKTsgc2NmJHRjIDwtIGFzLm51bWVyaWMoc2NmJHRjKQoKCnRkZiR0eXBlIDwtICdDUFVzJwpzY2YkdHlwZSA8LSAnTGFuZG1hcmsgc3R1ZGllcycKYWNmIDwtIGRhdGEuZnJhbWUoeWVhcj1kYiR0aW1lLG5hbWU9ZGIkU2hvcnRoYW5kLHRjPWRiJFJlcG9ydGVkLmNlbGxzLnRvdGFsLHR5cGU9J2FsbCBzdHVkaWVzJyk7IAoKYGBgCgoKCmBgYHtyfQphY2YKYGBgCgpgYGB7ciBmaWcud2lkdGg9NSwgZmlnLmhlaWdodD01LCBtZXNzYWdlPUZ9CmNkIDwtIGRvLmNhbGwocmJpbmQsbGlzdCh0ZGYsc2NmLGFjZikpCmNkJHR5cGUgPC0gYXMuZmFjdG9yKGNkJHR5cGUpCmNkJG5hbWUgPC0gYXMuY2hhcmFjdGVyKGNkJG5hbWUpCmNkJG5hbWVbY2QkdHlwZT09J2FsbCBzdHVkaWVzJ10gPC0gJyc7CgpwIDwtIGdncGxvdChjZCxhZXMoeD15ZWFyLHk9bG9nMTAodGMpLGNvbG9yPXR5cGUsbGFiZWw9bmFtZSkpICsgCiAgZ2VvbV9wb2ludChkYXRhPWNkW2NkJHR5cGU9PSdhbGwgc3R1ZGllcycsXSxhZXMoeD15ZWFyLHk9bG9nMTAodGMpKSxjb2xvcj1hZGp1c3Rjb2xvcigncmVkJyxhbHBoYT0wLjIpLHNpemU9MC4yKSArCiAgZ2VvbV9wb2ludChzaXplPTIpICsgCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDEzLjUpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gbG9nMTAoMy43MyoxZTEzKSxsdHk9Mixjb2w9J2RhcmtncmVlbicsc2l6ZT0xLjUpKwogIGFubm90YXRlKCd0ZXh0JyxsYWJlbD0nbnVtYmVyIG9mIGNlbGxzIGluIGEgaHVtYW4gYm9keScseD1JbmYseT0xMi44LHZqdXN0PTAsaGp1c3Q9MS4zLHNpemU9NSxjb2xvcj0nZGFya2dyZWVuJykrCiAgdGhlbWVfYncoKSArIGd1aWRlcyhjb2xvcj0nbm9uZScpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKGFkanVzdGNvbG9yKCd3aGl0ZScsYWxwaGE9MC4wMSksImJsYWNrIiwgInJlZCIpKSArCiAgZ2VvbV90ZXh0X3JlcGVsKGJveC5wYWRkaW5nID0gMC41NSxzaXplPTQpICsKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBzZSA9IEZBTFNFLGxpbmV0eXBlPTIsc2l6ZT0wLjUsZnVsbHJhbmdlPVRSVUUpICsKICB4bGFiKCJEYXRlIikreWxhYigibG9nMTBbIGNvdW50IF0iKSAKICAKcApgYGAKCgoKCmBgYHtyfQpwZGYoZmlsZT0nc3R1ZGllcy5wZGYnLHdpZHRoPTUsaGVpZ2h0PTUpOyBwcmludChwKTsgZGV2Lm9mZigpOwpgYGAK