Использование circlize::draw.секторов внутри функции

#r #data-visualization #circlize

Вопрос:

Я хотел бы создать цветовую схему RGB, используя circlize пакет. Во-первых, я пытаюсь создать функцию так, чтобы мне нужно было только ввести цвет и сектора, и функция выполнит эту работу

Вот код:

 colorpallete <- function(color, x){
    draw.sector(get.cell.meta.data("cell.start.degree", sector.index = x),
        get.cell.meta.data("cell.end.degree", sector.index = x),
        rou1 = get.cell.meta.data("cell.top.radius", track.index = 1),
        rou2 = get.cell.meta.data('cell.bottom.radius', track.index = 3),
            col = adjustcolor(col = color, alpha.f = 0.2))

    draw.sector(get.cell.meta.data("cell.start.degree", sector.index = x),
        get.cell.meta.data("cell.end.degree", sector.index = x),
        rou1 = get.cell.meta.data("cell.top.radius", track.index = 1),
        rou2 = get.cell.meta.data('cell.bottom.radius', track.index = 2),
            col = adjustcolor(col = color, alpha.f = 0.2))
            
    draw.sector(get.cell.meta.data("cell.start.degree", sector.index = x),
        get.cell.meta.data("cell.end.degree", sector.index = x),
        rou1 = get.cell.meta.data("cell.top.radius", track.index = 1),
        rou2 = get.cell.meta.data('cell.bottom.radius', track.index = 1),
            col = adjustcolor(col = color, alpha.f = 0.2))
    }

circos.initialize(sectors, xlim = c(0, 1))
        for(i in 1:3) {
            circos.track(ylim = c(0, 1))
            }
colset = (c('blue', 'cyan', 'green', 'yellow', 'red', 'violet'))
sectors = letters[1:6]    
colorpallete(colset, sectors)
 

Когда я пытаюсь запустить код, он возвращает следующую ошибку:

  Error: Length of `sector.index` should only be 1.
 

Как я могу сделать так, чтобы функция соответствовала каждому списку, например, когда я вызываю функцию, вызываются только «синий» и «a», за которыми следуют «голубой» и » b » и т. Д.

Заранее большое вам спасибо

Ответ №1:

Обновление: Мне удалось запустить функцию:

 colorpallete <- function(sectors, color){
        circos.initialize(sectors, xlim = c(0, 1))
        for(i in 1:3) {
            circos.track(ylim = c(0, 1))
            }
        for(i in 1:6){
        draw.sector(get.cell.meta.data("cell.start.degree", sector.index = sectors[i]),
            get.cell.meta.data("cell.end.degree", sector.index = sectors[i]),
            rou1 = get.cell.meta.data("cell.top.radius", track.index = 1),
            rou2 = get.cell.meta.data('cell.bottom.radius', track.index = 3),
                col = adjustcolor(col = color[i], alpha.f = 0.2))
    
        draw.sector(get.cell.meta.data("cell.start.degree", sector.index = sectors[i]),
            get.cell.meta.data("cell.end.degree", sector.index = sectors[i]),
            rou1 = get.cell.meta.data("cell.top.radius", track.index = 1),
            rou2 = get.cell.meta.data('cell.bottom.radius', track.index = 2),
                col = adjustcolor(col = color[i], alpha.f = 0.2))
                
        draw.sector(get.cell.meta.data("cell.start.degree", sector.index = sectors[i]),
            get.cell.meta.data("cell.end.degree", sector.index = sectors[i]),
            rou1 = get.cell.meta.data("cell.top.radius", track.index = 1),
            rou2 = get.cell.meta.data('cell.bottom.radius', track.index = 1),
                col = adjustcolor(col = color[i], alpha.f = 0.2))
        } circos.clear()}
sectors = letters[1:6]
colset = (c('blue', 'cyan', 'green', 'yellow', 'red', 'violet'))        
colorpallete(sectors, colset)
 

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

Чтобы создать пользовательский набор секторов и цветов (где их не должно быть 6)

 colorpallete <- function(sectors, color){
    if(length(sectors) != length(color)){
        print("Error: sectors should have the same length as color")
        } else {
        circos.initialize(sectors, xlim = c(0, 1))
        for(i in 1:3) {
            circos.track(ylim = c(0, 1))
            }
        for(i in 1:length(sectors)){
            draw.sector(get.cell.meta.data("cell.start.degree", sector.index = sectors[i]),
            get.cell.meta.data("cell.end.degree", sector.index = sectors[i]),
            rou1 = get.cell.meta.data("cell.top.radius", track.index = 1),
            rou2 = get.cell.meta.data('cell.bottom.radius', track.index = 3),
                col = adjustcolor(col = color[i], alpha.f = 0.2))

        draw.sector(get.cell.meta.data("cell.start.degree", sector.index = sectors[i]),
            get.cell.meta.data("cell.end.degree", sector.index = sectors[i]),
            rou1 = get.cell.meta.data("cell.top.radius", track.index = 1),
            rou2 = get.cell.meta.data('cell.bottom.radius', track.index = 2),
                col = adjustcolor(col = color[i], alpha.f = 0.2))
            
        draw.sector(get.cell.meta.data("cell.start.degree", sector.index = sectors[i]),
            get.cell.meta.data("cell.end.degree", sector.index = sectors[i]),
            rou1 = get.cell.meta.data("cell.top.radius", track.index = 1),
            rou2 = get.cell.meta.data('cell.bottom.radius', track.index = 1),
                col = adjustcolor(col = color[i], alpha.f = 0.2))
            }
    circos.clear()
    }}
sectors = letters[1:4]
colset = (c('darkblue', 'blue', 'darkred', 'red'))
colorpallete(sectors, colset)
 

Конечно, sectors и colset нужно иметь одинаковую длину

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