2015-10-14 3 views
0

У меня есть простой набор точек для размещения в диаграмме рассеяния в R. Один набор точек - это данные тренировки, другой - одна точка тестовых данных. Я делаю диаграмму рассеянности данных обучения и добавляю тестовую точку данных к одному и тому же сюжету, используя ggplot2(). Я хочу добавить тестовую точку данных к той же легенде, которая уже определена для данных обучения.Добавить легенду о масштабе в ggplot

Во-первых, некоторые данные для тех, кто хочет играть вместе.

A1 <- c(0,0) 
A2 <- c(1,1) 
A3 <- c(2,2) 
B1 <- c(6,6) 
B2 <- c(5.5,7) 
B3 <- c(6.5,5) 
train1 <- data.frame(rbind(A1,A2,A3, B1,B2,B3)) 
names(train1) <- c("X", "Y") 
test_point <- data.frame("X" = 4.0, "Y" = 4.0) # make the test point a df to place nicely with ggplot. 
cl <- factor(c(rep("A",3),rep("B",3))) # class labels 

Теперь давайте создадим диаграмму рассеяния данных поезда и испытания:

ggplot(data = train1) + 
    aes(X, Y, colour = cl) + 
    geom_point(size = 3) + 
    geom_point(data = test_point, aes(X, Y), colour = "NavyBlue", size = 4) + 
    labs(size= "1", x = "X coords", y = "Y coords", 
     title = "Features for KNN", vjust=-10, 
     colour = "Class Labels") + # change the label for legend by variable name in aes() 
    theme(axis.text=element_text(size=16), 
      axis.text.x = element_text(angle=0, vjust=1), 
      axis.title=element_text(size=16), 
      legend.position="bottom", legend.direction = "vertical", #change location and direction of legend 
      legend.text = element_text(colour="blue", size = 16, face = "bold")) + #change style for legend text 
    theme(plot.title = element_text(size = 18)) 

, что делает достаточно приличный сюжет, но не имеет ничего в легенде для test_point NavyBlue.

Scatterplot with nothing in legend for test-point

Кто знает, как добавить test_point к выходу легенды? Я получил его представлять, но не очень красиво, с помощью изменения первой geom_point в

geom_point(data = test_point, aes(X, Y, colour = "Test Data"), size = 4) + 

, который дает это без NavyBlue уточняются. Итак, как сохранить окраску ВМФ Blue с этой формулировкой?

Legend has color name as name

наивности, можно было бы попробовать

geom_point(data = test_point, aes(X, Y, colour = "Test Data"), colour = "NavyBlue", size = 4) + 

но результаты в первом участке, то есть, дополнительный вход легенда уходит.

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

ответ

0

Мне кажется, что единственная причина, по которой вы используете несколько слоев, - это размеры, которые мне кажутся ненужными.

new_df <- rbind(train1, test_point) 
new_df$size <- c(rep(3,6), 4) 
new_df$cl <- c(rep("red", 3), rep("green", 3), "NavyBlue") 

ggplot(new_df, aes(X,Y, colour= cl)) + geom_point(size= 3) + geom_point(aes(size= new_df$size)) + 
     scale_color_manual(values= c("red", "NavyBlue", "green")) + 
    labs(size= "1", x = "X coords", y = "Y coords", 
     title = "Features for KNN", vjust=-10, 
     colour = "Class Labels") + # change the label for legend by variable name in aes() 
    theme(axis.text=element_text(size=16), 
     axis.text.x = element_text(angle=0, vjust=1), 
     axis.title=element_text(size=16), 
     legend.position="bottom", legend.direction = "vertical", #change location and direction of legend 
     legend.text = element_text(colour="blue", size = 16, face = "bold")) + #change style for legend text 
    theme(plot.title = element_text(size = 18)) + 
    scale_size(guide= "none") 

enter image description here

+0

Я ищу способ сделать это с добавлением еще 'geom_point()'. Я мог бы объединить data.frames уже, но я пытаюсь определить, как это сделать с помощью дополнительного элемента. Спасибо за эту мысль. –

0

Вот моя попытка. Если вы хотите нарисовать фигуры ggplot так, как вы описываете, вы можете это сделать. Причина, по которой вы отсутствовали темно-синий, заключается в том, что вы не поместили цвет в aes() для test_point. Я создал новый столбец под названием hue, используя transform(). Затем я добавил часть scale_color_manual(), чтобы расположить легенду.

test_point <- transform(test_point, hue = "Navy blue") 

ggplot(data = train1) + 
aes(X, Y, colour = cl) + 
geom_point(size = 3) + 
geom_point(data = test_point, aes(X, Y, colour = hue), size = 4) + 
labs(size= "1", x = "X coords", y = "Y coords", 
    title = "Features for KNN", vjust=-10, 
    colour = "Class Labels") + # change the label for legend by variable name in aes() 
theme(axis.text=element_text(size=16), 
     axis.text.x = element_text(angle=0, vjust=1), 
     axis.title=element_text(size=16), 
     legend.position="bottom", legend.direction = "vertical", #change location and direction of legend 
     legend.text = element_text(colour="blue", size = 16, face = "bold")) + #change style for legend text 
theme(plot.title = element_text(size = 18)) + 
scale_color_manual(values=c("red", "green", "navy blue"), 
        name="Class labels", 
        breaks = c("A", "B", "Navy blue"), 
        labels=c("A", "B", "Navy blue")) 

enter image description here

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