Исправление перекрывающихся узлов и меток узлов на точечной диаграмме в R.

Я пытаюсь построить некоторые данные в R, используя точечный график. Вот код, который у меня был для построения графика

data <- read.table(filename, header=FALSE);
colnames(data) <- c("xlabel", "ylabel", "xvalue", "yvalue", "class");   
df <- data.frame(data["xlabel"], data["ylabel"],data["xvalue"], data["yvalue"], data["class"]);
with(df, plot(xvalue, yvalue,       
    pch=c(16,17)[class],
    col=c("red", "blue", "green")[class],
    main="Tittle",
))

#label the nodes    
with(df, text(xvalue+300, yvalue, cex=0.5, sprintf("(%s, %s)", xlabel, ylabel)));

Однако, когда 2 узла закрыты друг для друга или, что еще хуже, перекрываются, как показано на здесь, очень трудно различить узлы и их метки. Итак, мои вопросы: 1. Как я могу по-разному установить обводку и цвет заливки узлов, чтобы различать перекрывающиеся узлы? 2. Есть ли способ заставить метки узлов вести себя более разумно, например, скорректировать их расположение в случае перекрытия? Может быть, есть какая-то библиотека, которая позволяет эту опцию?

Вот данные, если вы хотите проверить это:

2 6 6990 4721 1 
2 7 6990 4643 2 
1 4 13653 3294 2 
3 7 4070 4643 1 
2 8 6990 6354 1 
3 8 4070 6354 1 
1 2 13653 6990 1 
1 7 13653 4643 2 
3 5 4070 3349 2 
1 8 13653 6354 1 
3 6 4070 4721 1 
2 4 6990 3294 2 
1 5 13653 3349 2 
1 6 13653 4721 1 
3 4 4070 3294 2 
2 5 6990 3349 2 
5 8 3349 6354 1 

Спасибо,


person chepukha    schedule 23.10.2013    source источник
comment
Вы заметили, что определяете df как data? Попробуйте identical(data, df).   -  person Richie Cotton    schedule 23.10.2013
comment
+1. Спасибо. Итак, это dataframe данные с указанными именами столбцов? Извините, основной концептуальный вопрос. Я только что изучил R, и некоторые концепции поначалу очень сбивают с толку.   -  person chepukha    schedule 23.10.2013
comment
data.frame содержит данные, подобные электронной таблице. Вы можете думать об этом как о matrix, где каждый столбец может быть разного типа, или как о не вложенном list, где каждый элемент является вектором одинаковой длины.   -  person Richie Cotton    schedule 23.10.2013


Ответы (1)


Простое исправление состоит в том, чтобы попеременно размещать метки слева и справа. Я упорядочил набор данных по значению x, а затем по значению y, поэтому ближайшие точки в наборе данных находятся рядом.

library(plyr)
df <- arrange(df, xvalue, yvalue)
offset <- rep(c(-300, 300), length.out = nrow(df))

with(df, plot(xvalue, yvalue,       #as before
    pch=c(16,17)[class],
    col=c("red", "blue", "green")[class],
    main="Tittle",
))

with(df, text(xvalue + offset, yvalue, cex=0.5, sprintf("(%s, %s)", xlabel, ylabel)))

Если вместо этого вы используете решетку или ggplot (а не базовую графику), то в пакете directlabels есть функция direct.label, которая автоматически позиционирует ваши метки.

person Richie Cotton    schedule 23.10.2013
comment
Спасибо, Ричи. Ваше решение уменьшает значительное перекрытие. Тем не менее, есть еще совпадения. Я попробую пакет directlabels, чтобы посмотреть, работает ли он лучше. - person chepukha; 23.10.2013