2016-09-26 4 views
3

Это может быть глупый вопрос, но кто-нибудь знает, как отображать объект treemap после его создания в R? Рассмотрим приведенный ниже код:Как отобразить сохраненный объект treemap? MWE включен?

loadpackages <-function(package.list = c("ggplot2", "Rcpp")) {new.packages <-package.list[!(package.list %in% installed.packages()[, "Package"])] 
    if (length(new.packages)) 
     install.packages(new.packages, repos = 'http://cran.us.r-project.org') 
    lapply(eval(package.list), require, character.only = TRUE)} 
loadpackages(c("treemap")) 

data(GNI2014) 
tm = treemap(
    GNI2014, 
    index = c("continent", "iso3"), 
    vSize = "population", 
    vColor = "GNI", 
    draw = FALSE, # comment this line out to see the treemap 
    type = "value" 
) 

Это не делает графику, но сохраняет «список карт». Кто-нибудь знает, как я могу отобразить этот объект?

PS: Моим мотивом является изменение некоторых категориальных меток (добавление процентов) после создания определенной карты деревьев, но я не могу создать график на дисплее из объекта верхушки.

ответ

1

Рассматривая исходный код, он не хранит достаточную информацию, чтобы разрешить повторное рисование. Ожидается, что treemap() будет вызван для его создания побочных эффектов. Учитывая это, я понятия не имею, почему у них есть опция draw=FALSE, если нет возможности построить ее позже.

Даже если официальная функция этого не позволяет, вы можете взломать функцию. Мы можем изменить функцию, чтобы вернуть все параметры, которые она передавала, чтобы рисовать. Вот версия протестирована с treemap_2.4-1

treemap2 <- treemap 
drawcall <- body(treemap)[[c(85,3,2)]] 
drawcall[[1]] <- quote(list) 
savelist <- as.list(body(t2)[[c(90,3)]]) 
savelist[["drawparam"]] <- drawcall 
body(treemap)[[c(90,3)]] <- as.call(savelist) 

Тогда вы можете вызвать функцию как перед тем

tm <- treemap2(
    GNI2014, 
    index = c("continent", "iso3"), 
    vSize = "population", 
    vColor = "GNI", 
    draw = FALSE, 
    type = "value" 
) 

И теперь все параметры, используемые для рисования функции хранятся в tm$drawparam. Он использует скрытую функцию tmDrawRect, чтобы сделать все рисунок, но вы можете назвать это с

do.call(treemap:::tmDrawRect, tm$drawparam) 

, используя данные, хранящиеся в объекте. Если вы измените любые данные в tm$drawparam, которые должны непосредственно влиять на график.

+0

Благодарим вас за отличную работу по этому вопросу. Мало того, что вы решили мое затруднительное положение, ваше решение научило мне ссылаться на внутренние функции. Если вы когда-нибудь посещали округ Колумбия, сообщите мне, вы заработали * бесплатный обед *. – RTS

Смежные вопросы