ggplot2 geom_line () должен указывать на указанное значение - PullRequest
5 голосов
/ 29 апреля 2011

Я написал следующий код:

library(ggplot2)

data <- structure(list(x = c(1L, 6L, 3L, 4L, 2L, 3L, 6L, 1L, 5L, 2L, 
                    1L, 5L), y = c(1L, 7L, 5L, 6L, 3L, 4L, 6L, 2L, 5L, 6L, 5L, 2L
            ), year = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
                            2L, 2L), .Label = c("2010", "2011"), class = "factor"), matching = structure(c(1L, 
                            2L, 3L, 4L, 5L, 6L, 1L, 2L, 3L, 4L, 5L, 6L), .Label = c("person1", 
                            "person2", "person3", "person4", "person5", "person6"), class = "factor")), .Names = c("x", 
            "y", "year", "matching"), row.names = c(NA, -12L), class = "data.frame")

data$year <- factor(data$year)

colors <- c("#4cb5ee", "#a0d099", "red")

p <- ggplot(data, aes(x=x, y=y)) +
    geom_point(aes(colour=year), shape=16, size=6) +
    geom_line(aes(group=matching), arrow=arrow(length=unit(0.15,"cm")), colour="black", size=1) +
    xlab("x") + ylab("y") +
    scale_colour_manual("year", values=colors) +
    scale_x_continuous(limits=c(1,7), breaks=seq(1,7, by=1)) +
    scale_y_continuous(limits=c(1,7), breaks=seq(1,7, by=1))

print(p)

Это дает следующий вывод: plot

Но я хочу, чтобы geom_line () делал так: всегда указывает на точку, где год = 2011. Я не могу понять, почему стрелка линии иногда указывает на точку, которая ссылается на в год = 2010 и иногда указывает на точку, где год = 2011.

Я обнаружил, что стрелка принимает несколько аргументов:

arrow(angle = 30, length = unit(0.25, "inches"), ends = "last", type = "open") 

Чтобы я мог сказать ends="first". Но я не могу обобщить, что ends всегда first или всегда last.

Я попытался добавить столбец в свой data.frame, в котором есть информация, должна ли стрелка заканчиваться первой или последней, но это не дает мне желаемого результата.

Каждая помощь высоко ценится: -)

Заранее спасибо!

Ответы [ 2 ]

11 голосов
/ 29 апреля 2011

geom_path должен сделать трюк:

p <- ggplot(data, aes(x=x, y=y)) +
    geom_point(aes(colour=year), shape=16, size=6) +
    geom_path(aes(group=matching), 
                  arrow=arrow(length=unit(0.15,"cm")),
                  colour="black", size=1) +
    xlab("x") + ylab("y") +
    scale_colour_manual("year", values=colors) +
    scale_x_continuous(limits=c(1,7), breaks=seq(1,7, by=1)) +
    scale_y_continuous(limits=c(1,7), breaks=seq(1,7, by=1))

print(p)

geom_path plot

4 голосов
/ 29 апреля 2011

Вероятно, есть более эффективный способ сделать это, но один из подходов заключается в использовании geom_segment() вместо geom_line(). Это позволит вам с легкостью указать начальную и конечную точки линии. Мы должны реструктурировать данные, чтобы мы могли указать x, y, xend и yend. Я реструктурирую с помощью слияния, хотя вы, вероятно, могли бы сделать это с помощью приведения или изменения формы.

zz <- merge(data[data$year == 2010 ,], data[data$year == 2011 ,]
  , by = "matching", suffixes = 1:2) 

  matching x1 y1 year1 x2 y2 year2
1  person1  1  1  2010  6  6  2011
2  person2  6  7  2010  1  2  2011
3  person3  3  5  2010  5  5  2011
4  person4  4  6  2010  2  6  2011
5  person5  2  3  2010  1  5  2011
6  person6  3  4  2010  5  2  2011

Затем мы будем использовать два набора данных в нашем вызове ggplot:

ggplot() +                                                       #Blank call to ggplot
  geom_point(data = data, aes(x=x, y=y, colour=year), shape=16, size=6) +    #Points
  geom_segment(data = zz, aes(x = x1, y = y1, xend = x2, yend = y2),         #Segments
    arrow = arrow(length = unit(0.15, "cm")), colour = "black", size = 1) +
  xlab("x") + ylab("y") +
  scale_colour_manual("year", values=colors) +
  scale_x_continuous(limits=c(1,7), breaks=seq(1,7, by=1)) +
  scale_y_continuous(limits=c(1,7), breaks=seq(1,7, by=1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...