Как изменить цвет взаимодействий на основе значения взаимодействия с помощью оператора ifelse() в двудольном графике?

Привет, у меня возникли проблемы с попыткой заставить операторы ifelse работать в функции plotweb (от bipartite) до взаимодействия цветов на основе общего количества взаимодействий каждой ячейки в матрице. У меня была та же проблема с цветами верхних полос, но поскольку было всего несколько значений и один вектор, кодировать вручную было легко.

Вот код, который я использую: я хочу раскрасить взаимодействия более 15 темно-бирюзовыми, а остальные оставить серыми по умолчанию (grey80).

Я пробовал много разных операторов, но я не могу понять, что вставить в [,], чтобы обозначить, чтобы функция проходила через каждую отдельную ячейку и применяла оператор вместо их суммирования, elem, elem также не кажется работать. Прикреплено изображение вывода функции в настоящее время

plotweb(LadyNet, 
        abuns.type='additional',
        arrow="up.center",
        text.rot=90,
        col.low=c("olivedrab3"),
        col.interaction =(ifelse(LadyNet[,] < 15,'grey80','darkturquoise')), 
        col.high = c("grey10","#FF0000","grey10","#FF0000","grey10","#FF0000","grey10","grey10","grey10"),
        high.lab.dis = 0,
        ybig=1.2,
        y.width.high = .06,
        high.spacing = 0.011, 
        y.lim = c(-1,2))

Изображение вывода

COCCAL  COCSEP  CYCPOL  CYCSAN  EXOFAS  HIPCON  PSYVIG  SCY1    SCYMAR
Acmispon glaber 0   1   0   1   0   0   0   0   0
Ambrosia psilostachya   1   36  0   24  0   6   0   0   0
Artemisia douglasiana   0   0   0   1   0   1   0   0   0
Asclepias fascicularis  0   5   0   4   0   2   0   0   0
Avena fatua 6   10  0   0   0   4   0   0   0
Baccharis pilularis 9   76  0   38  0   27  0   1   0
Baccharis salicifolia   0   2   0   0   0   0   0   0   0
Bromus diandrus 1   8   0   0   0   4   0   0   0
Capsicum annuum 0   0   0   0   0   0   0   0   1
Chenopodium murale  0   1   0   0   0   0   0   0   0
Croton californicus 3   20  0   13  0   54  4   0   0
DEAD WOOD   0   1   0   0   0   0   0   0   0
Distichilis spicata 0   1   0   0   0   0   0   0   0
Echium candicans    0   1   0   3   0   0   0   0   0
Eleocharis acicularis   0   1   0   0   0   0   0   0   0
Encelia californica 1   1   0   3   0   2   0   0   0
Epilobium canum 0   0   0   1   0   0   0   0   0
Erigeron bonariensis    0   4   0   0   0   0   0   0   0
Erigeron canadensis 0   17  0   10  0   2   0   0   0
Erigeron sumatrensis    0   13  0   0   0   1   0   0   0
Eriophyllum confertiflorum  1   10  0   0   0   1   0   0   0
Fence   0   0   0   1   0   0   0   0   0
Festuca perennis    0   1   0   0   0   2   0   0   0
Gambelium speciosa  0   0   0   0   0   1   0   0   0
Geranium dissectum  0   0   0   3   0   0   0   0   0
GROUND  0   1   0   1   0   0   0   0   0
Helminthotheca echioides    0   1   2   17  0   1   0   0   0
Heterotheca grandiflora 2   92  0   12  0   7   1   0   0
Hirschfieldia incana    0   3   0   0   0   1   0   0   0
Juncus patens   0   1   0   0   0   0   0   0   0
Laennecia coulteri  1   65  0   2   0   3   0   0   0
Lobularia maritima  1   1   0   0   0   0   0   0   0
Morus sp.   0   0   0   1   0   0   0   0   0
NoPicture   4   3   0   3   3   2   3   0   0
Oxalis pes-caprae   4   6   0   0   0   2   0   0   0
Pennisetum clandestinum 1   5   0   0   0   0   0   0   0
Polygonum arenastrum    0   1   0   0   0   0   0   0   0
Raphanus sativus    0   1   0   0   0   0   0   0   0
ROCK    0   0   0   1   0   0   0   0   0
Rumex crispus   0   1   0   0   0   0   0   0   0
Rumex salicifolius  0   0   0   3   0   0   0   0   0
Salsola tragus  1   6   0   1   0   1   0   0   0
Salvia leucophylla  0   1   0   0   0   1   0   0   0
Schenoplectus americanus    0   1   0   0   0   0   0   0   0
Solanum nigrum  0   0   0   0   0   1   0   0   0
Sonchus arvensis    0   1   0   0   0   0   0   0   0
Spinacia oleracea   0   0   0   0   0   0   1   0   0
Stipa pulchra   0   1   0   0   0   0   0   0   0
Symphiotrichum subulatum    0   88  0   7   0   3   0   0   0
THATCH  1   3   0   0   0   4   0   0   0
Verbena lasiostachys    1   9   0   0   0   2   0   0   0

Для справки, я получил оператор ifelse для правильной работы в функции plotweb, когда на нижнем уровне был только один вид, это пример вместе с кодом:

RNET

plotweb(rnet, 
        abuns.type='additional',
        arrow="down.center",
        text.rot=90,  
        col.low=c("olivedrab3"),
        col.interaction =(ifelse(rnet[1,] < 12,'grey80','darkturquoise')), 
        col.high = (ifelse(rnet[1,] < 12,'grey10','darkturquoise')),
        high.lab.dis = 0,
        ybig=1.2,
        y.width.high = .06, 
        high.spacing = 0.011)

person Justin Luong    schedule 01.08.2018    source источник
comment
Трудно ответить, не видя хотя бы некоторых из LadyNet.   -  person neilfws    schedule 01.08.2018
comment
Извините, спасибо за исправление формата   -  person Justin Luong    schedule 01.08.2018


Ответы (1)


Следует отметить, что цветовая матрица col.interaction должна быть транспонирована.

Вот пример, который, надеюсь, будет вам полезен:

library(bipartite)
library(grDevices)

plotweb(df, 
    abuns.type='additional',
    arrow="up.center",
    text.rot=90,
    col.low=c("olivedrab3"),
    col.interaction = t(ifelse(df[,] < 15,
                             adjustcolor('grey80', alpha.f = 0.5), #add alpha to colors
                             adjustcolor('darkturquoise', alpha.f = 0.5))), 
    col.high = c("grey10",
                 "#FF0000",
                 "grey10",
                 "#FF0000",
                 "grey10",
                 "#FF0000",
                 "grey10",
                 "grey10",
                 "grey10"),
    bor.col.interaction = NA, #remove the black border color
    high.lab.dis = 0,
    ybig=1.2,
    y.width.high = .06,
    high.spacing = 0.011, 
    y.lim = c(-1,2))

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

person missuse    schedule 01.08.2018
comment
Привет, missuse, спасибо за вашу помощь, этот код определенно помогает, удаление границ и добавление альфы было хорошей идеей, но у меня все еще та же проблема. Я не уверен, как вы решили выбрать значение 2 для оператора if else, но мне все еще кажется, что оно окрашивается случайным образом. Моя самая большая проблема сейчас заключается в том, что я пытаюсь заставить оператор if else работать для окрашивания взаимодействия в зависимости от их значения, поэтому, если взаимодействие > 15, (да) цвет темно-бирюзовый, (нет) цвет серый80 - person Justin Luong; 02.08.2018
comment
@ Джастин Луонг, ты прав, я не проверял подробно, когда давал ответ. Я верю, что это обновление будет более удовлетворительным. - person missuse; 02.08.2018
comment
Большое спасибо, все сработало идеально! Если вы не возражаете, я спрошу в своих учебных целях, что именно делает пакет grDevices и функция t() перед оператором ifelse? - person Justin Luong; 02.08.2018
comment
@Justin Luong the t (база R) выполняет транспонирование матрицы (переворачивает матрицу по диагонали, чтобы столбцы становились строками, а строки становились столбцами - вот как должны выглядеть входные данные для этого аргумента). Функция adjustcolor из grDevices добавляет прозрачности цвету. Рад помочь. - person missuse; 02.08.2018