Если важна скорость, то вам нужно использовать решетку. Сначала мы генерируем что-то вроде ваших данных:
#number of rows of data
NROWS=1000
#number of columns of colors to plot
NCOLS = 11
colTable = matrix(
sample(c("blue","green","white"),NROWS*NCOLS,replace=TRUE),
ncol=NCOLS)
xcoord = sort(sample(10000,NROWS))
df = data.frame(id=1:NROWS,xcoord=xcoord,colTable,stringsAsFactors=FALSE)
Ваша функция:
f2 = function(){
for(i in 1:NCOLS){
y=rep(i,NROWS)
x=df[,"xcoord"]
plot(x,y,col=df[,i+2],ylim=c(0,NCOLS+1),
xlim=range(xcoord),pch="|" )
par(new=TRUE) }
dev.off()
}
Вы постоянно наносите один на другой, поэтому тики на осях выглядят очень размытыми. В идеале вы просто визуализируете все за один снимок, но с использованием графика R. Это не намного быстрее.
Для решетки, поскольку у вас уже есть фрейм данных, вы можете сделать следующее:
library(lattice)
library(dplyr)
library(tidyr)
f3 = function(){
plotdf = df %>% select(2:ncol(df)) %>%
pivot_longer(-xcoord) %>% mutate(Y=as.numeric(factor(name)))
COLS = unique(plotdf$value)
xyplot(Y ~ xcoord,data=plotdf,groups=value,
par.settings = list(superpose.symbol = list(pch = "|",
col = COLS)))
}
Сюжет выглядит примерно так, вам нужно поиграться с параметрами par.settings, чтобы получить то, что вы хотите.
Но с точки зрения скорости это хорошо
library(microbenchmark)
microbenchmark(f2=f2(),f3=f3())
Unit: milliseconds
expr min lq mean median uq max neval cld
f2 421.9169 436.2520 460.75231 452.8287 479.28940 553.1396 100 b
f3 9.5304 9.9318 11.54003 10.4013 11.84475 27.8273 100 a