专栏首页数据小魔方数据地图多图层对象的颜色标度重叠问题解决方案

数据地图多图层对象的颜色标度重叠问题解决方案

一篇旧文,解决一个困扰已经的小技术问题,权当是学习ggplot2以来的整理回顾与查漏补缺。


今天这一篇是昨天推送的基础上进行了进一步的深化,主要讲如何在离散颜色填充的地图上进行气泡图图层叠加。

为了使得案例前后一致,仍然使用昨天的数据集。

加载包:

library("ggplot2") library("plyr") library("maptools") library("sp") library("ggthemes")

导入中国省界地图:

china_map<-readShapePoly("D:/R/rstudy/CHN_adm/bou2_4p.shp") data1<- china_map@data data2<- data.frame(id=row.names(data1),data1)

数据格式转化及业务数据合并:

china_map1 <- fortify(china_map) china_map_data <- join(china_map1,data2, type = "full") mydata <- read.csv("D:/R/rstudy/Province/geshengzhibiao.csv") china_data <- join(china_map_data, mydata, type="full")

各省省会城市经纬度数据:

province_city <- read.csv("D:/R/rstudy/Province/chinaprovincecity.csv")

###根据自己的数据量级和具体业务需要设置分割点

mydata<-mydata[,-c(5,6)] mydata$zhibiao<-rnorm(33,100,50) mydata$zhibiao<-abs(mydata$zhibiao) mydata$zhibiao2<-round(mydata$zhibiao,0) mydata$fau <- cut(mydata$zhibiao, breaks = c(0,50,100,150,200,250))

###将转换的分段因子变量重新命名为我们需要的分段阀值:

mydata$fam<-factor(mydata$fau,levels=c('(0,50]','(50,100]','(100,150]','(150,200]','(200,250]'),labels=c('0~50','50~100','100~150','150~200','200~250'),order=TRUE)

#将业务数据与地理信息数据合并:

china_data <- join(china_map_data, mydata, type="full") windowsFonts(myFont = windowsFont("微软雅黑"))

离散标度填充:

ggplot(china_data, aes(x = long, y = lat, group = group,fill =fam)) + geom_polygon(colour="white")+ scale_fill_brewer(palette="Blues") + ###Blues&Greens coord_map("polyconic") + ggtitle("某公司2015~2016年度营业状况分布图")+ guides(fill=guide_legend(reverse=TRUE,title=NULL))+ theme_map() %+replace% theme(legend.position = c(0.08,0.4),legend.text.align=1)

在离散颜色标度的基础上添加各省份散点图:

ggplot() + geom_polygon(data=china_data, aes(x=long,y=lat,group=group,fill=fam),colour="white")+ geom_point(data=province_city,aes(x=jd,y=wd),colour="red")+ scale_fill_brewer(palette="Blues") + ###Blues&Greens coord_map("polyconic") + ggtitle("某公司2015~2016年度营业状况分布图")+ #写入标题 guides(fill=guide_legend(reverse=TRUE,title=NULL))+ theme_map() %+replace% theme(legend.position = c(0.08,0.4),legend.text.align=1)

更该散点图为气泡图:

province_city$PerforamA<-round(rnorm(34,100,30),0) province_city$PerforamB<-round(rnorm(34,100,30),0)

ggplot() + geom_polygon(data=china_data, aes(x=long,y=lat,group=group,fill=fam),colour="white")+ geom_point(data=province_city,aes(x=jd,y=wd,size=PerforamA),shape=21,fill="#8E0F2E",colour="black",alpha=0.6)+ scale_fill_brewer(palette="Blues") + ###Blues&Greens scale_size_area(max_size=6)+ coord_map("polyconic") + ggtitle("某公司2015~2016年度营业状况分布图")+ #写入标题 guides(fill=guide_legend(reverse=TRUE,title=NULL),size=guide_legend(reverse=TRUE,title=NULL))+ theme_map() %+replace% theme(legend.position = c(0.08,0.4),legend.text.align=1)

本来打算再继续在气泡图的基础上进行颜色渐变填充呢,可以试了一下,这样的话前面的底图离散颜色标度填充的的时候已经使用过了一个fill属性设置选项,而要对气泡图进行颜色渐变填充就要再使用一次fill属性,可是目前为止我还不知道如何在多图层中出现多个fill属性的时候如何识别并分别进行标度设置,当我运行如下代码时,软件无法识别两个颜色标度设置分别对应的指标,因而图表无法跑出来:

ggplot() + geom_polygon(data=china_data, aes(x=long,y=lat,group=group,fill=fam),colour="white")+ scale_fill_brewer(palette="Blues") + ###Blues&Greens geom_point(data=province_city,aes(x=jd,y=wd,size=PerforamA,fill=PerforamB),shape=21,fill="#8E0F2E",colour="black",alpha=0.6)+ scale_size_area(max_size=6)+ scale_fill_gradient2(low="DarkCyan", mid="Azure", high="Sienna", midpoint=median(province_city$PerforamB))+ coord_map("polyconic") + ggtitle("某公司2015~2016年度营业状况分布图")+ #写入标题 guides(fill=guide_legend(reverse=TRUE,title=NULL),size=guide_legend(reverse=TRUE,title=NULL))+ theme_map() %+replace% theme(legend.position = c(0.08,0.4),legend.text.align=1)

Scale for 'fill' is already present. Adding another scale for 'fill', which will replace the existing scale. Error: Discrete value supplied to continuous scale

实在是太遗憾了,不知道哪位大神知道如何处理多图层相同的fill属性,可以告知在下,这里先行谢过了。

那么这个问题真的那么难解决吗,倘若放在半年以前,确实如此,那个时候为此纠结了很久,一直耿耿于怀,可是如今的我,水平已经今非昔比了哈哈哈(容我傲娇一下~)

其实问题是这样的,该图表对象的需要三层颜色标度映射。

  • 最底层的离散填充标度;
  • 气泡图的大小标度:
  • 气泡图的填充标度;

困扰我的问题是,底层的多边形填充使用了一次fill属性,而气泡的颜色填充又使用了一次fill属性,所以两个颜色标度——

撞车了……

软件无法识别两个标度参数:

  • scale_fill_brewer(palette="Blues")
  • scale_fill_gradient2(low="DarkCyan", mid="Azure", high="Sienna")

分别是作用于那个图层的:

  • geom_polygon()
  • geom_point()

所以自己就崩溃罢工了~

当时想的方法是,是否可以给两个fill标度进行组合或者命名,最后也没搞定该如何进行区分。

前不久跟我的一个朋友聊天,聊起这个问题,也没有直接的解决方法, 可以聊天过程中突然发现了一条线索,R语言环境中的形状一共有25种,其中1~20种仅有colour属性而没有fill属性,21~25种既有colour属性又有fill属性,而我平时作图使用气泡图的时候,用惯了21号形状(主要是拥有两个颜色调整参数,比较利于后期属性调整)。

所以针对这个案例,使用21号形状的fill属性进行气泡内颜色标度映射,必然与多边形的fill映射冲撞,那么现在问题就好办了,放弃使用21号形状,选择一个只有colour属性映射的形状编号进行映射。

其中16、19号都符合要求,我随表挑选一个16号吧……

ggplot() + geom_polygon(data=china_data, aes(x=long,y=lat,group=group,fill=fam),colour="white")+ scale_fill_brewer(palette="Greens") + ###Blues&Greens geom_point(data=province_city,aes(x=jd,y=wd,size=PerforamA,colour=PerforamB),shape=16)+ scale_size_area(max_size=6)+ scale_colour_gradient(low="white",high="#D73434")+ coord_map("polyconic") + ggtitle("某公司2015~2016年度营业状况分布图")+ #写入标题 guides(fill=guide_legend(reverse=TRUE,title=NULL),size=guide_legend(reverse=TRUE,title=NULL))+ theme_map() %+replace% theme(legend.position = c(0.08,0.4),legend.text.align=1)

OK,完美的解决了标度重叠问题,现在该地图已经用了三个可用的颜色标度了!

本文分享自微信公众号 - 数据小魔方(datamofang),作者:杜雨

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-06-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • R语言可视化——柱形图美化(簇状、堆积、百分比)

    昨天以最简单的单序列柱形图作为对象详细的讲解了关于套用主题以及图表美化的思路。 今天就我们常用的几种柱形图的衍生图表——簇状柱形图、堆积柱形图、百分比堆积柱形图...

    数据小磨坊
  • ggplot2高阶案例应用——中国家庭金融资产配置变化

    今天浏览新闻,看到一个关于美国居民家庭金融资产配置的调查,主要介绍1974年~2016年美国居民和非居民部门家庭金融资产配置比例分布演变的数据。 ? 数据显示...

    数据小磨坊
  • 离散颜色标度连续化的最佳方案

    数了一下刚好有一周多没有写新文章了,主要是临近毕业琐事比较多,再也没有像之前那样,拥有大把时间可以用来挥霍和消遣,静下心来写代码了。 毕竟要写一篇技术含量很高而...

    数据小磨坊
  • Add Aplayer

    以下是相应的插入代码, 吸底模式可以在 body的任意地方 推荐顶部(效果可在本博客首页左下角查看) , 其他的就是在对应位置 可以在 md文件中插入使用 内联...

    BORBER
  • 环境自动加载工具direnv

    最近在多个项目之间来回切换,其中不同项目需要使用同一个库的不同版本,来回切换太麻烦,于是乎,想到了曾经有同事给我建议的环境自动加载工具direnv,可以使我在命...

    kongxx
  • Python爬虫教程:爬取微博数据【附源码】

    3、将获得的两项内容填入到weibo.py中,替换代码中的YOUR_USER_ID和#YOUR_COOKIE,运行代码。

    python学习教程
  • R in action读书笔记(19)第十四章 主成分和因子分析

    主成分分析(PCA)是一种数据降维技巧,它能将大量相关变量转化为一组很少的不相关变量,这些无关变量称为主成分。探索性因子分析(EFA)是一系列用来发现一组变量的...

    统计学家
  • 松下如何回收废旧家电?机器人一天可处理300台液晶电视

    扔塑料瓶需要分几步,丢垃圾也要看时间,处理旧家电还得花钱……日本资源回收体系虽然复杂,却尽可能地实现了资源利用的最大化。 记者21日应邀参观松下电器产业公司一处...

    机器人网
  • Node.js Stream - 基础篇

    背景 在构建较复杂的系统时,通常将其拆解为功能独立的若干部分。这些部分的接口遵循一定的规范,通过某种方式相连,以共同完成较复杂的任务。譬如,shell通过管道|...

    美团技术团队
  • 南邮也吹“阴间”风!机器人出席毕业典礼,拨穗领证一样不落

    受疫情影响,不少学校的毕业典礼取消,各种PS版的云毕业照层出不穷,更关键的是,多少人错过了四年一遇的表白机会啊!

    大数据文摘

扫码关注云+社区

领取腾讯云代金券