前言
上一节我们学习了leaflet包是如何添加底图、修改底图、在底图上添加图标、绘制点、添加地图数据,在上一节的结尾,我们小科普了一个名为RColorBrewer包的配色包,说到颜色,令我好奇的是如何在leaflet包里实现从属性到颜色的映射。
Leaflet包中的颜色
那么接下来就介绍一下leaflet包里关于颜色的设置:
leaflet中设置颜色的方法很简单,首先你得有一个“颜色盒子",这个颜色盒子里面装着你喜欢的颜色,还有一些关于颜色透明度的说明、颜色范围的设置,怎么创建一个属于自己的颜色盒子呢?
Colorbox颜色盒子
leaflet中有4个函数可以生成这种颜色盒子,分别是colorNumeric()、colorBin、
colorQuantile()、colorFactor(),那么这四个盒子可以用来涂不同的东西,比如前三个函
数生成的盒子用来涂数值型的东西,最后一个函数colorFactor()用来渲染类别型的东西
效果最佳。
创建颜色的方法很简单:
colorbox1 <- colorNumeric() #使用colorNumeric()函数创建我的色彩盒
colorbox2 <- colorBin() #使用colorBin()函数创建我的色彩盒
colorbox3 <- colorQuantile() #使用colorQuantile()函数创建我的色彩盒
colorbox4 <- colorFactor() #使用colorFactor()函数创建我的色彩盒
用上述的方法创建完之后会得到一个空的颜色盒子,因为你盒子里面的颜色还没定义,
那么下一步就是把你喜欢的颜色装进这个colorbox里面去,怎么装进去呢?leaflet包里提
供了一个palette的参数,把这个参数放在上面四个函数里面,接收用户喜欢的颜色,形
如:
colorbox1 <- colorNumeric( palette = "我喜欢的颜色")
这里的颜色可以是来自其他包里的色带,例如你看上了RColorBrewer包里面的某一款色
带,那么你可以这样写:
#使用RColorBrewer包中的YIOrRd色带作为我喜欢的颜色,存放在我的色彩盒子里
colorbox1 <- colorNumeric( palette = "YIOrRd")
也可以是自己定义的颜色向量:c("yellow","black","orange","red")
也可以是R语言提供的调色板:heat.colors,rainbow
其他参数的设置
除了颜色的选择,还有一些关于颜色的范围、透明度、颜色排序的设置,形如:
olorbox1 <- colorNumeric( palettr = "YIOrRd",domain = "颜色范围",alpha =
"透明度",reverse = "颜色排序")
- domain — 颜色的值域,例如规定了色彩对应的值域为0:100,那么如果是一个0到60
的数值型数据,该数据最终的色域将会占据该色带的前3/5;如果设置domain为NULL,则被着色的值跨越整个色域。- reverse—调色板中的颜色(或颜色功能)是否应以相反的顺序使用。例如,如果调色
板的默认顺序从蓝色变为绿色,则reverse = TRUE将导致颜色从绿色变为蓝色
应用示例
#导入实验数据
library("rgdal")
data <- readOGR("zhongshan2.shp",stringsAsFactors = FALSE)
#定义几个颜色小盒子,装着我想要的颜色,默认颜色范围为整个色带
colorbox1 <- colorNumeric(palette = "PuBu",
domain = Null)
colorbox2 <- colorNumeric(palette = c("orange","blue","yellow","grey"),
domain = NULL)
colorbor3 <- colorNumeric(palette = "rainbow(10)",
domain = NULL)
colorbor4 <- colorNumeric(palette = heat.colors(10),
domain = NULL)
leaflet(data) %>%
addTiles() %>%
addPolygons(
stroke = TRUE, #是否描边
smoothFactor = 0.3, #简化折线的等级
illOpacity = 0.8, #填充透明度
color = ~colorbox1(data$F2) )
需要注意的是
- ColorNumeric是用来渲染连续型的数据,例如1~100的数据。
- ColorBin可以用于数据切片分箱,可以指定breaks分割点来分箱,也可以通过bin参数指定分箱数量来分箱。如果pretty = TRUE(默认),将得到nice round的分割点,但是可能分箱数并不非你指定的。
- ColorQuantile也用于数据切片分箱,与ColorBin不同的是,它的数据分箱是通过分位数来实现,默认是4个箱子,5个间断点breaks。
- ColorFactor用于类别型数据渲染,也就是需要根据一个字符型向量来指定渲染颜色,如果指定的类别数量与实际数据的类别不符合,它会使用内插法进行类别的颜色渲染。
添加图例
leaflet包中添加图例的方法比较简单,使用addlegend函数添加即可。
addlegend中关键的参数有两个,一个是values的设置,用于从palette参数中生成颜色的值,一个是pal的设置,用于调用我们颜色盒子来作为图例的样式
例如:
#创建一个分位数分箱的颜色盒子,设置箱子数为7
colorbox5 <- colorQuantile(palette = rainbow(10),
domain = NULL,n = 7)
leaflet(data) %>%
addTiles() %>%
addPolygons(
stroke = TRUE, #是否描边
smoothFactor = 0.3, #简化折线等级
fillOpacity = 0.8, #填充透明度
color = ~colorbox5(data$F2) ) %>%
addLegend(
position = "topleft",
pal = colorbox5,values = data$F2,group = "data$F2")%>%
addLayersControl(overlayGroups = "data$F2")
#创建一个连续型颜色盒子,采用彩虹配色
colorbox6 <- colorNumeric(palette = rainbow(10),
domain = NULL),
#创建一个分箱型颜色盒子,采用heat.colors配色,分箱数为7
colorbox7 <- colorBin(palette = rainbow(5),
domain = data$F2,bins = 7)
#创建一个分位数颜色盒子,采用topo.color配色,分箱数为5
colorbox8 <- colorNumeric(palette = rainbow(10),
domain = NULL)
leaflet(data) %>%
addTiles() %>%
addPolygons(
stroke = TRUE, #是否描边
smoothFactor = 0.3, #简化折线等级
fillOpacity = 0.8, #填充透明度
color = ~colorbox6(data$F2)) %>%
addLegend( #添加ColorNumeric颜色的图例
position = "topleft",
pal = colorbox6,
values = ~F2)%>%
addLegend( #添加ColorBin颜色的图例
position = "topright",
pal = colorbox7,
values = ~F2)%>%
addLegend( #添加ColorQuantiel颜色的图例
position = "bottomleft",
pal = colorbox8,
values = ~F2)
图例的美化
1. 位置的修改(position)
图例的位置包括四个:topleft(左上角)、topright(右上角)、bottomleft(左下角)、bottomright(右下角)
2. 缺省值的设置
在图例上,缺省值的表示可以自定义设置
na.label = NA
3. 标题的添加
使用title添加图例的标题
4. 修改图例标注
图例标注的修改可以使用labFormat = labelFormat()参数进行修改,在labelFormat()这个函数里面,提供了若干个参数,例如:
- prefix、suffix ——前/后缀的修改,
- between——中间分隔符的修改
5. 数据格式的转化
使用transform = function(x)的方法进行数据的处理,其中function(x)可以由用户自定义。
实验代码如下:
#创建一个连续型颜色盒子,采用彩虹配色
colorbox6 <- colorNumeric(palette = rainbow(10),
domain = NULL)
leaflet(data) %>%
addTiles() %>%
addPolygons(
stroke = TRUE, #是否描边
smoothFactor = 0.3, #简化折线等级
fillOpacity = 0.8, #填充透明度
color = ~colorbox5(data$F2) ) %>%
addLegend(
position = "bottomleft", #位置设置为左下角
pal = colorbox6, #采用colorbox6作为图例配色
values = data$F2,
group = "data$F2",
title = "中山市某年镇域人口分布",
opacity = 0.5, #不透明度设置
labFormat = labelFormat(
prefix = " ",
suffix = "(万人)", #添加标注后缀
between = "~",
transform = function(x) {
x =
x/10000 #定义funcyion函数}))
结语
leaflet包中有关颜色和图例的设置也就差不多齐全了,当然这些也只是入门的基础知识,但everything moves with The Times, so does knowledge, and so should you,在实践中发挥自己的创意,找寻更多关于leaflet包的美吧!