R: возможно ли нарисовать линию geom_segment с цветным градиентом? (или есть другой способ подчеркнуть начало против конца?) - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть два набора переменных широты и долготы для большого количества строк в моем фрейме данных (~ 100 000).Я пытаюсь построить график, который соединяет эти два набора координат (то есть ~ 100 000 линий, которые идут от широта1, долгота1 до широта2, долгота2 ), используя geom_segment, с оченьнизкая альфа, чтобы сделать линии прозрачными, потому что есть так много линий.Я хотел бы подчеркнуть начальные и конечные точки этих линий, и я считаю, что наилучшим способом сделать это было бы иметь цветовой градиент от начала до конца (скажем, от зеленого к красному).

Можно ли нарисовать линию geom_segment с цветным градиентом?Если нет, знаете ли вы другой способ подчеркнуть начало против конца с таким количеством строк?

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

Вот некоторые примеры данных5 строк (но на самом деле у меня ~ 100 000, так что это должно быть несколько вычислительно эффективно):

 example.df <- as.data.frame(matrix(c(1,435500,387500,320000,197000,
                                      2,510500,197500,513000,164000,
                                      3,164500,40500,431000,385000,
                                      4,318500,176500,316000,172000,
                                      5,331500,188500,472000,168000),
                                      nrow=5, ncol=5, byrow = TRUE))
  colnames(example.df) <- c("ID","longitude.1","latitude.1",
                            "longitude.2","latitude.2")

 library(ggforce)
 ggplot(example.df, aes(longitude.1, latitude.1))+
 geom_link(aes(x=longitude.1, y=latitude.1,
               xend=longitude.2, yend=latitude.2, 
               alpha=0.5), col="black")+
 coord_equal()

Это дает следующие пять строк: enter image description here

Мне бы хотелось, чтобы эти линии начинались синим цветом в первой координатной точке долготы-широты и заканчивались красным во второй координатной точке долготы-широты.

1 Ответ

2 голосов
/ 23 апреля 2019

Подход ggforce кажется лучшим подходом к тому, что вы просите. Ваш код был почти тем, что вы искали, но я думаю, что вы, возможно, пропустили оператор colour = stat(index) внутри отображения. Я предполагаю, что index - это статистика, которую geom_link() вычисляет под капотом для интерполяции цветов.

ggplot(example.df, aes(longitude.1, latitude.1))+
  geom_link(aes(x = longitude.1, y = latitude.1,
                xend = longitude.2, yend = latitude.2, 
                colour = stat(index)), lineend = "round") +
  scale_colour_gradient(low = "red", high = "green") +
  coord_equal()

enter image description here

Тем не менее, предупреждающее слово, поскольку вы намерены построить много линий; если вы используете alpha = для geom_link(), вы можете четко увидеть сегментацию строк:

ggplot(example.df, aes(longitude.1, latitude.1))+
  geom_link(aes(x = longitude.1, y = latitude.1,
                xend = longitude.2, yend = latitude.2, 
                colour = stat(index)), lineend = "round", size = 10, alpha = 0.1) +
  scale_colour_gradient(low = "red", high = "green") +
  coord_equal()

enter image description here

В качестве альтернативы вы можете использовать стрелки для обозначения конечных положений следующим образом:

ggplot(example.df, aes(longitude.1, latitude.1)) +
  geom_segment(aes(xend = longitude.2, yend = latitude.2),
               arrow = arrow()) +
  coord_equal()

enter image description here

Потенциальным недостатком является то, что очень короткие сегменты могут быть переоценены стрелками.

Надеюсь, это поможет!

...