【R语言】使用leaflet绘制沈阳地铁线路图——R实训第六次作业

参考:
一、惭愧惭愧,基本都是抄自这个大牛学长,自己做了一部分改进——R语言绘制沈阳地铁线路图
二、这个发布的时间比学长还要早(学长可能也借鉴过)——上海地铁数据可视化
三、这个是真正的大牛,从他的文章里我学了好多leaflet的知识,但是他的文章不能直接让你完成这个作业,所以心急的就别看了——R语言在线地图神器:Leaflet for R包(一)~(六)

百度地图——沈阳地铁图
在这里插入图片描述

title: “R实训第六次作业”
output: html_notebook

1. 使用leaflet绘制地铁线路图,要求

1) 图中绘制地铁线路

导入包

library(leaflet)  #map
library(dplyr)    #arrange()
library(lubridate)#period_to_seconds()
library(sqldf)    #sqldf

导入数据

stations <-
  read.csv("D:\\张志浩\\大数据班\\R语言实验-徐娇\\R第5次实训\\数据\\systation.csv")

按照line(线路编号), line_id(站编号)进行排序

stations <- arrange(stations, line, line_id)

地铁颜色,从上海地铁官网获取
一号线为红色(red):#FF0000 二号线为金色(gold):#FFD700

lines_color <-
  data.frame("line" = c(1, 2),
             "color" = c("#FF0000", "#FFD700"))

使用该addProviderTiles()函数添加许多流行的免费第三方底图

Shenyang  <- leaflet() %>%
  setView(lng = 123.44, lat = 41.81, zoom = 11) %>% addProviderTiles("CartoDB.Positron")

在地图地图上把地铁站标记出来

for (line in unique(stations$line)) {
  line_color <- lines_color[lines_color$line == line,]$color
  line_data <- stations[stations$line == line,]
  Shenyang <- Shenyang  %>%
    addPolylines(lat = line_data$gps_lat,
                 lng = line_data$gps_lon,
                 color = line_color)
}

为添加地铁站名做准备有的地铁站为两条地铁线路的交叉点,在点击该点时我需要将两条线路都标明,例如:青年大街站,1/2

stations_no <- nrow(stations)
for (i in 1:stations_no) {
  s <- stations$station[i]
  stations$lines[i] <-
    paste(stations[stations$station == s, ]$line, sep = "", collapse = "/")
}

添加地铁站名

pal <-
  colorFactor(as.character(lines_color$color), domain = stations$line)
Shenyang  <- Shenyang  %>%
  addCircleMarkers(
    stations$gps_lon,
    stations$gps_lat,
    popup = paste(stations$station, stations$lines, sep = ","),
    color = pal(stations$line),
    radius = 1.5
  ) %>%
  addLegend(pal = pal, values = stations$line)
Shenyang

在这里插入图片描述

2) 各站点展示进站流量(08:00:00-08:05:00间的数据),流量的大小用标记的大小表示,并且提示线路、站点、流量的具体数值。

最好的办法就是将第五次实验的数据用在这里(我没有使用,因为时间不够了,我打算周末去完善)

stadata <-
  read.csv("D:\\张志浩\\大数据班\\R语言实验-徐娇\\R第5次实训\\数据\\SY-20150401.csv")

选取08:00:00-08:05:00间的数据
更好的办法是把第五次实训的数据(将数据处理成每条数据处于一天中的第几个5分钟)
确定08:00:00-08:05:00属于第几个五分,然后直接从第五次实训生成的数据中获取

stadata$se <- period_to_seconds(hms(stadata$V3))
stadata <- filter(stadata, V6 == 0 & se >= 28800 & se <= 29100)
getR <- function(quakes) {
  sapply(quakes$count, function(count) {
    count / 40
  })
}
stad <- substring(stadata['V4'][, ], 4)
stad <- data.frame(stad)

按照地铁名排序并计算流量

names(stad)[1] <- 'station'
stations <- stations[order(stations$station), ]
count <- sqldf("select station, count(*) from stad group by station")
s <- merge(count, stations, by = "station")
names(s)[2] <- c('count')

绘制流量图

Shenyang %>% addCircleMarkers(
  s$gps_lon,
  s$gps_lat,
  popup = paste(s$station, s$lines, sep = ","),
  color = pal(s$line),
  radius = getR(s),
  label = as.character(s$count)
)  %>% setView(lng = 123.44, lat = 41.81, zoom = 11)%>%addTiles()

在这里插入图片描述

2.使用plotly绘制(17:00:00-17:05:00)出站流量最多的五个站点的出站流量(柱状图)。

library(plotly)
stadata <-
  read.csv("D:\\张志浩\\大数据班\\R语言实验-徐娇\\R第5次实训\\数据\\SY-20150401.csv")

获取17:00:00-17:05:00的数据

stadata$se<-period_to_seconds(hms(stadata$V3))
stadata<-filter(stadata,V6!=0 & se>=61200 & se<=61500)
stad<-substring(stadata['V4'][,],4)
stad<-data.frame(stad);
names(stad)[1]<-'station'

按站名排序并计算流量

stations<-stations[order(stations$station),]
count<-sqldf("select station, count(*) from stad group by station")
s<-merge(count,stations,by="station")

青年大街是1号线和2号线相交站,额外处理

names(s)[2] <- c('count')
s[17, 2] <- s[17, 2]*2

画图

st <- s[-18,]

st <- st[order(-s$count),]

st<-st[1:5, 1:2]

plot_ly(st, x =  ~ station, y = ~ count)%>%add_bars()

在这里插入图片描述

posted @ 2019-12-12 20:45  爱做梦的子浩  阅读(557)  评论(0编辑  收藏  举报