2015-06-23 6 views
0

У меня есть сюжет(), где несколько цветовых оттенков представляют одну и ту же вещь. Я хотел бы добавить легенду, которая передает это с помощью двухцветных ящиков (см. Пример ниже). Есть ли способ сделать это, используя legend() или аналогичную команду? Альтернативно, есть ли способ идентифицировать точные координаты этих ящиков, чтобы я мог построить над ним треугольник polygon()?R: ящики с более чем одним цветом

Примечание: legend() возвращает координаты внешнего блока и левого верхнего угла каждого ярлыка, но я не уверен, достаточно ли этого, чтобы рассчитать, где находятся цветные прямоугольники.

How it should look like

+0

Почему у вас есть несколько цветов для одного и того же? – Molx

+0

@Molx: Представьте простой пример: представьте круговую диаграмму или график с разбивкой по столбцам, где у вас есть разбивка по полу (мужчина/женщина = синий/красный) и класс дохода (низкий/средний/высокий доход = низкий/цвет средней/высокой интенсивности). В результате получается всего 6 комбинаций цвета и интенсивности цвета. Когда вы получаете еще несколько категорий, становится желательным иметь легенду, которая суммирует цвет и интенсивность отдельно, а не перечисляет все возможные комбинации. –

ответ

0

Немного грязный хак может позволить вам получить функцию legend(), чтобы дать вам необходимую информацию. Более умный человек, чем я, вероятно, будет выяснять, как legend() вычисляет расположение ячеек и реплицирует это вне функции. Обратите внимание, что редактирование стандартных функций R, вероятно, не рекомендуется.

Если вы не изменяли функции R все же, простой (и временный) способ доступа к нему, набрав

fix(legend) 

Typing

rm(legend) 

позже будет отменить изменения.

Найти этот раздел, который говорит fill <- rep и добавьте строки, указанные в комментариях:

fillList <- NULL ## added 
    if (mfill) { 
     if (plot) { 
      fill <- rep(fill, length.out = n.leg) 
      rect2(left = xt, top = yt + ybox/2, dx = xbox, dy = ybox, 
       col = fill, density = density, angle = angle, 
       border = border) 
      fillList <- data.frame(left = xt, top = yt + ybox/2, dx = xbox, dy = ybox) ## added 
     } 
     xt <- xt + dx.fill 
    } 

найти очень последнюю строку и изменить его

invisible(list(rect = list(w = w, h = h, left = left, top = top), 
     text = list(x = xt, y = yt), fillList=fillList)) ## modified 

Теперь называют легендой через

output <- legend(...) ## replace ... with whatever you want to have as inputs 

и ничьи треугольники, используя информацию, возвращаемую legend() так:

with(output$fillList[1,], { ## first box 
     polygon(c(left, left+dx, left+dx), c(top, top, top-dy), col=myColour, border=NA) 
    }) 

Result

1

Это немного рубить, но вы могли бы поставить две легенды на другой. К сожалению, нет левого треугольника pch, который был бы точно так, как вы хотели.

plot(1) 
legend("bottomright",c("Label 1", "Label 2"),pch=22,col=c("red","blue"),pt.bg=c("red","blue"), pt.cex=1.8) 
legend("bottomright",c("Label 1", "Label 2"),pch=21,col=c("green","orange"),pt.bg=c("green","orange")) 

enter image description here

+0

Спасибо, я вижу, что именно то, что я хочу, невозможно без «взлома» внутренних функций. Я опубликую решение, которое будет делать это в ближайшее время. –

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