Highcharter Unlimited Детализация с помощью R

Я просмотрел этот вопрос SO, это ТАКОЙ вопрос. Я следовал этому методу github проверить < href="https://github.com/jbkunst/highcharter/issues/470" rel="nofollow noreferrer">ПРОБЛЕМЫ, чтобы получить идеи о том, как решить эту проблему.

Шаг 1. Скопируйте следующий текст в текстовый редактор и сохраните его как файл test.csv:

Моим источником данных является NVD JSON FEEDS, который я обработал, очистил и создал этот набор данных с помощью первые 25 строк показаны здесь.

Year,Vendor name,Product name,CVE,Major,Minor,Build,Revision
1988,eric_allman,sendmail,CVE-1999-0095,5,5.58,,
1988,ftp,ftp,CVE-1999-0082,*,,,
1988,ftpcd,ftpcd,CVE-1999-0082,*,,,
1989,bsd,bsd,CVE-1999-1471,4,4.2,,
1989,bsd,bsd,CVE-1999-1471,4,4.3,,
1989,sun,sunos,CVE-1999-1122,4,4.0,,
1989,sun,sunos,CVE-1999-1122,4,4.0,4.0.1,
1989,sun,sunos,CVE-1999-1122,4,4.0,4.0.3,
1989,sun,sunos,CVE-1999-1467,4,4.0,,
1989,sun,sunos,CVE-1999-1467,4,4.0,4.0.1,
1989,sun,sunos,CVE-1999-1467,4,4.0,4.0.2,
1989,sun,sunos,CVE-1999-1467,4,4.0,4.0.3,
1989,sun,sunos,CVE-1999-1467,4,4.0,4.0.3c,
1990,digital,vms,CVE-1999-1057,5,5.3,,
1990,freebsd,freebsd,CVE-2000-0388,3,3.0,,
1990,freebsd,freebsd,CVE-2000-0388,3,3.1,,
1990,freebsd,freebsd,CVE-2000-0388,3,3.2,,
1990,freebsd,freebsd,CVE-2000-0388,3,3.3,,
1990,freebsd,freebsd,CVE-2000-0388,3,3.4,,
1990,hp,apollo_domain_os,CVE-1999-1115,sr10,sr10.2,,
1990,hp,apollo_domain_os,CVE-1999-1115,sr10,sr10.3,,
1990,next,nex,CVE-1999-1392,1,1.0a,,
1990,next,next,CVE-1999-1198,2,2.0,,
1990,next,next,CVE-1999-1391,1,1.0,,
1990,next,next,CVE-1999-1391,1,1.0a,,

Шаг 2: Скопируйте и вставьте следующий код в R и запустите его:

Мои коды следуют это ТАК вопрос особенно обсуждение @NinjaElvis. Я думаю, что можно создать 3 уровня или более. Просто проводит больше исследований и выясняет.

############################
suppressPackageStartupMessages(library("highcharter"))
library("dplyr")
library("purrr")
library("data.table")

second_el_to_numeric <- function(ls){

  map(ls, function(x){
    x[[2]] <- as.numeric(x[[2]])
    x
  })

}

cve_affected_product <- fread("test.csv")

# LAYER ONE YEAR DRILLDOWN VIEW #########################
Year <- cve_affected_product[,c(1:2)]
Year <- unique(Year[,list(Year,`Vendor name`)])
Year <- Year[,c(1)][,count:=1]
Year <- setDT(aggregate(.~ Year ,data=Year,FUN=sum))
#setorder(Year, Year, `Vendor name`)
years_df <- tibble(
  name = c(Year$Year),
  y = c(Year$count),
  drilldown = tolower(paste(name,'id'))
)

ds <- list_parse(years_df)
names(ds) <- NULL

# Vendor View HC ###########
hc <- highchart() %>%
  hc_chart(type = "column") %>%
  hc_title(text = "Basic drilldown") %>%
  hc_xAxis(type = "category") %>%
  hc_yAxis(visible = FALSE,reversed = FALSE) %>%
  hc_legend(enabled = FALSE) %>%
  hc_plotOptions(
    series = list(
      boderWidth = 0,
      dataLabels = list(enabled = TRUE)
    )
  ) %>%
  hc_add_series(
    name = "Vendors",
    colorByPoint = TRUE,
    data = ds
  )


# LAYER TWO VENDOR DRILLDOWN VIEW #########################
Vendor <- cve_affected_product[,c(1:3)]
Vendor <- unique(Vendor[,list(Year,`Vendor name`,`Product name`)])
Vendor <- Vendor[,c(1:2)][,count:=1]
Vendor <- setDT(aggregate(.~ Year+`Vendor name` ,data=Vendor,FUN=sum))
setorder(Vendor, Year, `Vendor name`)

years <- as.character(unique(Vendor$Year))

for(i in 1:length(years)){
  tempdf <- Vendor[Vendor$Year==years[i],]
  dfname <- paste("df",years[i],sep="")
  dsname <- paste("ds",years[i],sep="")

  X <- tibble(
    name = c(tempdf$`Vendor name`),
    y = c(tempdf$count),
    drilldown = tolower(paste(name,'id'))
  )


  Y <- second_el_to_numeric(list_parse2(assign(dfname,X)))

  assign(dsname,Y)


}


# Vendor View HC ###########
hc <- hc %>%
  hc_drilldown(
    allowPointDrilldown = TRUE,
    series = list(
      list(
        id = "1988 id",
        data = ds1988,
        colorByPoint = TRUE,
        keys = list('name','y','drilldown')
      ),
      list(
        id = "1989 id",
        data = ds1989,
        keys = list('name','y','drilldown')
      ),
      list(
        id = "1990 id",
        data = ds1990,
        keys = list('name','y','drilldown')
      )#,
    )
  )

# LAYER THREE PRODUCT DRILLDOWN VIEW #########################
Product <- cve_affected_product[,c(1:4)]
Product <- unique(Product[,list(Year,`Vendor name`,`Product name`, CVE)])
Product <- Product[,c(1:3)][,count:=1]
Product <- setDT(aggregate(.~ Year+`Vendor name`+`Product name` ,data=Product,FUN=sum))
setorder(Product, Year, `Vendor name`,`Product name`)

vendors <- as.character(unique(Product$`Vendor name`))

for(i in 1:length(vendors)){
  tempdf <- Product[Product$`Vendor name`==vendors[i],]
  dfname <- paste("df",vendors[i],sep="")
  dsname <- paste("ds",vendors[i],sep="")

  X <- tibble(
    name = c(tempdf$`Product name`),
    y = c(tempdf$count),
    drilldown = tolower(paste(name,'id'))
  )


  Y <- second_el_to_numeric(list_parse2(assign(dfname,X)))

  assign(dsname,Y)

}
# Product View HC ###########
hc <- hc %>%
  hc_drilldown(
    allowPointDrilldown = TRUE,
    series = list(
      list(
        id = "eric_allman id",
        data = dseric_allman,
        keys = list('name','y','drilldown')
      ),
      list(
        id = "ftp id",
        data = dsftp,
        keys = list('name','y','drilldown')
      ),
      list(
        id = "ftpcd id",
        data = dsftpcd,
        keys = list('name','y','drilldown')
      ),
      list(
        id = "bsd id",
        data = dsbsd,
        keys = list('name','y','drilldown')
      ),
      list(
        id = "sun id",
        data = dssun,
        keys = list('name','y','drilldown')
      ),
      list(
        id = "digital id",
        data = dsdigital,
        keys = list('name','y','drilldown')
      ),
      list(
        id = "freebsd id",
        data = dsfreebsd,
        keys = list('name','y','drilldown')
      ),
      list(
        id = "hp id",
        data = dshp,
        keys = list('name','y','drilldown')
      ),
      list(
        id = "next id",
        data = dsnext,
        keys = list('name','y','drilldown')
      )#,
    )
  )

# LAYER FOUR CVE DRILLDOWN VIEW #########################
Product_CVE <- cve_affected_product[,c(1:5)]
Product_CVE <- unique(Product_CVE[,list(Year,`Vendor name`,`Product name`, CVE, Major)])
Product_CVE <- Product_CVE[,c(1:4)][,count:=1]
Product_CVE <- setDT(aggregate(.~ Year+`Vendor name`+`Product name`+CVE ,data=Product_CVE,FUN=sum))
setorder(Product_CVE, Year, `Vendor name`,`Product name`, CVE)

products <- as.character(unique(Product_CVE$`Product name`))

for(i in 1:length(products)){
  tempdf <- Product_CVE[Product_CVE$`Product name`==products[i],]
  ifelse(tempdf$`Vendor name`==tempdf$`Product name`,
         dfname <- paste("df_",products[i],sep=""),
         dfname <- paste("df",products[i],sep=""))

    ifelse(tempdf$`Vendor name`==tempdf$`Product name`,
         dsname <- paste("ds_",products[i],sep=""),
         dsname <- paste("ds",products[i],sep=""))

  X <- tibble(
    name = gsub("-", "", c(tempdf$CVE)),
    y = c(tempdf$count),
    drilldown = tolower(paste(name,'id'))
  )

  Y <- second_el_to_numeric(list_parse2(assign(dfname,X)))

    assign(dsname,Y)

}

# CVE View HC ###########
hc <- hc %>%
  hc_drilldown(
    allowPointDrilldown = TRUE,
    series = list(
      list(
        id = "sendmail id",
        data = dssendmail,
        keys = list('name','y','drilldown')
      ),
      list(
        id = "ftp id",
        data = ds_ftp,
        keys = list('name','y','drilldown')
      ),
      list(
        id = "ftpcd id",
        data = ds_ftpcd,
        keys = list('name','y','drilldown')
      ),
      list(
        id = "bsd id",
        data = ds_bsd,
        keys = list('name','y','drilldown')
      ),
      list(
        id = "sunos id",
        data = dssunos,
        keys = list('name','y','drilldown')
      ),
      list(
        id = "vms id",
        data = dsvms,
        keys = list('name','y','drilldown')
      ),
      list(
        id = "freebsd id",
        data = ds_freebsd,
        keys = list('name','y','drilldown')
      ),
      list(
        id = "apollo_domain_os id",
        data = dsapollo_domain_os,
        keys = list('name','y','drilldown')
      ),
      list(
        id = "nex id",
        data = dsnex,
        keys = list('name','y','drilldown')
      ),
      list(
        id = "next id",
        data = ds_next,
        keys = list('name','y','drilldown')
      )
    )
  )

Вывод первого уровня: введите здесь описание изображения

Вывод второго уровня, нажав на 1988: введите здесь описание изображения

ПРОБЛЕМЫ: я должен иметь возможность щелкнуть поставщика eric_allman и получить детализацию, но это не так. Я хочу иметь возможность перейти к ревизии, если она существует. Это всего лишь прототип новых функций для моего приложения, чтобы заставить его работать. Однако Highcharter не делает это простым или эффективным. В моем наборе данных почти 4 миллиона наблюдений. Это будет следующая борьба, как справиться с этим.

Я даже рассматриваю возможность использования D3, создав файл JSON в python, если не могу сделайте это с помощью R. Однако создание файла JSON в python не тривиально, но выполнимо. В настоящее время я работаю над кодом Python в качестве резервной копии.

Спасибо за помощь и любые предложения


person Kill3rbee Lee Mtoti    schedule 28.03.2019    source источник
comment
Можно проголосовать против вопроса, потому что он не ясен или показывает отсутствие исследований. Однако при этом обеспечьте некоторую обратную связь. А может быть, you(whomever downvoted) не понял, как решить проблемный вопрос? Некоторые люди визуалы, поэтому я предоставил рабочий пример, чтобы, когда вы играете с ним, вы могли понять, что моя цель, как указано в ISSUES, состоит в том, чтобы достичь 3-го уровня детализации или более.   -  person Kill3rbee Lee Mtoti    schedule 28.03.2019


Ответы (1)


Интересно, что после публикации этого вопроса я решил провести дополнительное исследование, поскольку большая часть исследований указывала мне на пример того, как это сделать в javascript. Поиск Google привел меня к этот ответ SO от < a href="https://stackoverflow.com/users/5836932/k-rohde">@K. Rohde Этот пост написан 2015, и я очень ценю то, как он объяснил два разных подхода. В итоге я использовал гибридный подход, заимствованный у обоих.

Тем, кто хочет узнать, как работает детализация, перейдите в мое блестящее приложение. Как только вы окажетесь на странице Click on Visualizations, то "Drill Down For Vendor CVE Affected Products Versions and Revisions"и попробуйте. Опять же, я бы не сделал этого без @K. Rohde записи.

person Kill3rbee Lee Mtoti    schedule 31.03.2019