2016-07-04 2 views
1

Следующего кодомggplot2 с точками и линиями с различными легендами

p <- ggplot()+ 
    geom_point(aes(v3,v2,color=factor(v1)),myData)+ 
    scale_colour_manual(values = gradient,name="Property A")+ 
    xlab("X Values")+ 
    ylab("Y Values")+ 
    theme(legend.position="bottom") 

производит этот участок с точками, разделенных свойством А Resulting plot Я хочу соединить точки обмена другой собственности B. Это должно выглядеть примерно так это:

Desired Result

Я уже пытались добавить

geom_line(aes(v3,v2,color=factor(v4)),myData) 

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

Edit: dput() из MyData

structure(list(v1 = c(1L, 1L, 1L, 2L, 2L, 2L), v2 = c(8348.97159577052, 
7681.30540986381, 6826.40361652663, 10795.9750463179, 10765.5654460646, 
9444.74166746195), v3 = c(0.349130695948487, 0.338453160875985, 
0.319725370654182, 0.621362929529391, 0.619078094211563, 0.616495725056279 
), v4 = c(0.995, 0.95, 0.9, 1, 0.995, 0.99)), .Names = c("v1", 
"v2", "v3", "v4"), row.names = c(NA, 6L), class = "data.frame") 
+0

Вы могли бы добавить данные? Dput() ваших данных, чтобы обеспечить воспроизводимый пример. – loki

+0

Конечно, я отредактировал мое сообщение. Это то, что вы имели в виду? – jasdefer

+0

Да, это то, что я имел в виду. Тем не менее, 'dput (head (++ yourObject ++))' yould be enaugh, я думаю – loki

ответ

2

С комментарием от @ kitman0804 вы можете также добавить linetype = factor(v4) к aes()

p <- ggplot()+ 
    geom_point(aes(v3,v2,color=factor(v1)),myData)+ 
    scale_colour_manual(values = c(1,2,3,4,5,6),name="Property A")+ 
    scale_linetype_discrete(name = "Property B") + 
    xlab("X Values")+ 
    ylab("Y Values")+ 
    theme(legend.position="bottom") 
p + geom_line(aes(v3, v2, group=factor(v4), linetype = factor(v4)), myData) 

enter image description here

UPDATE: Добавить аннотации вместо разных типов линий

Сначала вы создаете data.frame, который содержит все значения min (или max), используя эту функцию. Вы также можете настроить значения x и y значений с параметрами adjustx и adjusty.

xyForAnnotation <- function(data, xColumn, yColumn, groupColumn, 
          min = TRUE, max = FALSE, 
          adjustx = 0.05, adjusty = 100) { 
    xs <- c() 
    ys <- c() 
    is <- c() 
    for (i in unique(data[ , c(as.character(groupColumn))])){ 
    tmp <- data[data[, c(groupColumn)] == i,] 
    if (min){ 
     wm <- which.min(tmp[, c(xColumn)]) 
     tmpx <- tmp[wm, c(xColumn)] 
     tmpy <- tmp[wm, c(yColumn)] 
    } 
    if (max){ 
     wm <- which.max(tmp[, c(xColumn)]) 
     tmpx <- data[wm, c(yColumn)] 
     tmpy <- data[wm, c(yColumn)] 
    } 

    xs <- c(xs, tmpx) 
    ys <- c(ys, tmpy) 
    is <- c(is, i) 
    } 
    df <- data.frame(lab = is, x = xs, y = ys) 
    df$x <- df$x + adjustx 
    df$y <- df$y + adjusty 
    df 
} 

df <- xyForAnnotation(myData, "v3", "v2", "v4") 

p <- ggplot()+ 
    geom_point(aes(v3,v2,color=factor(v1)),myData)+ 
    scale_colour_manual(values = c(1,2,3,4,5,6, 7, 8, 9),name="Property A")+ 
    scale_linetype_discrete(guide = F) + 
    xlab("X Values")+ 
    ylab("Y Values")+ 
    theme(legend.position="bottom") + 
    geom_line(aes(v3, v2, group=factor(v4)), myData) 
p + annotate("text", label = as.character(df$lab), x = df$x, y = df$y) 

Сюжет будет выглядеть следующим образом:

enter image description here

Как уже упоминалось выше, вы можете отрегулировать положение аннотаций.

+0

Спасибо, это работает, но 8 разных пунктирных линий очень трудно отличить. @ kitman0804 предложил использовать аннотатный метод, но для этого требуется ручное позиционирование всех меток. Есть ли способ лучше? – jasdefer

+1

Я добавил функцию; надеюсь, это поможет – loki

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