Более простой способ построения таблицы - PullRequest
0 голосов
/ 15 января 2020

У меня есть таблица для построения.

enter image description here

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

enter image description here

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

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 Ответ

1 голос
/ 16 января 2020

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

#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, чтобы получить то, что вы хотите.

enter image description here

Но с точки зрения скорости это хорошо

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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...