Более простой способ построения таблицы

У меня есть стол для заговора.

введите описание изображения здесь

После того, как я заговорю, я получил приличный результат из этого

введите описание изображения здесь

Я пишу код следующим образом, но есть ли более быстрый способ сделать это, так как размер данных велик, и у меня есть еще несколько таблиц, которые я бы поместил в цикл. Запуск может занять много времени.

for(i in 1:11){
     y=rep(i,length(n))
     x=wp[n,2]
     plot(x,y,col=wp[,i+2],ylim=c(1,12), xlim=c(20000000,30000000), lwd = 20,lend = 0, pch="|" )
     par(new=TRUE) }

Не обращайте внимания на xlim, это не так важно

Всего 1 ответ


Если скорость важна, то вам нужно использовать решетку. Сначала мы генерируем что-то вроде ваших данных:

#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 

Есть идеи?

10000