R语言在地图上绘制月亮图、饼状图数据可视化果蝇基因种群

饼图把一个圆分成多个部分,这些部分的弧长(以及面积)代表一个整体的比例。

由Kaizong Ye,Coin Ge撰写

月亮图也是如此,它把一个圆分成多个部分,这些部分的面积代表整个圆的比例,但在月亮图中,这些部分被画成圆的月牙形,就像月相。 


月亮图和饼图

使用月亮图而不是饼图背后的动机主要是审美的选择。还要注意的是,由于月亮图的各部分是从圆的一侧或另一侧扫过的,所以一般只适合于描述一个或两个群体。

×

画图原理


1.利用R包rworldmap & rworldxtra来作图。


2.已有的map数据中一个国家对应一个坐标,一个国家边界,利用这些已有数据+用户数据构建新的画图数据(其他新添加的图均是如此)。


rworldmap包的介绍


1.如果想查看rworldmap包的情况


help(package="rworldmap")


2.了解high resolution map情况


a


# Map是一个sp对象,SpatialLinesDataFrame类


# 结构如下:


# a@data


# a@polygons


# a@plotOrder


# a@bbox


# a@proj4string


# 我们主要利用a@data和a@polygons


v


colnames(v)


[1] "ne_10m_adm" "ScaleRank"


[3] "LabelRank" "FeatureCla"


[5] "OID_" "SOVEREIGNT"


[7] "SOV_A3" "ADM0_DIF"


[9] "LEVEL" "TYPE"


[11] "ADMIN" "ADM0_A3"


[13] "GEOU_DIF" "GEOUNIT"


[15] "GU_A3" "SU_DIF"


[17] "SUBUNIT" "SU_A3"


[19] "NAME" "ABBREV"


[21] "POSTAL" "NAME_FORMA"


[23] "TERR_" "NAME_SORT"


[25] "MAP_COLOR" "POP_EST"


[27] "GDP_MD_EST" "FIPS_10_"


[29] "ISO_A2" "ISO_A3"


[31] "ISO_N3" "ISO3"


[33] "LON" "LAT"


[35] "ISO3.1" "ADMIN.1"


[37] "REGION" "continent"


[39] "GEO3major" "GEO3"


[41] "IMAGE24" "GLOCAF"


[43] "Stern" "SRESmajor"


[45] "SRES" "GBD"


[47] "AVOIDnumeric" "AVOIDname"


[49] "LDC" "SID"


[51] "LLDC"


# ***这里主要使用***:


# 第11列:类对象属性ID


# 第19列:后期绘图匹配项


# 第33列:绘图时的经度


# 第34列:绘图时的纬度


3.实例操作


1)输入文件格式说明


文件逗号分隔,每列的说明:


1.ID


新的类对象属性ID,自定义,等于原来map中的11列ADMIN


2.Name


后期绘图匹配项,同ID即可,等于原来map中的19列NAME


3.LON


绘图时的经度33列LON


4.LAT


绘图时的纬度34列LAT


注意:这里的经纬度是你自己想要标记饼图的经纬度(起到随意标记点的作用)


5.国家名


和原始map文件中的第11列ADMIN ID对应,每个国家都有一个坐标多边形区域,必须把坐标点画在某个国家内


6.饼图分块-1


7.饼图分块-2


8.legend名字


这里一个饼图只分成2部分,用户可自定义添加更多


2)画图的具体代码如下:


rm(list=ls())


library(rworldmap)


library(rworldxtra)


#———————————


# 读入输入文件


dat


> dat


ADMIN NAME LON LAT rawName P1 P2 legendName


1 Philippines Philippines 121.41825 15.95318 Philippines 0.5 0.5 legendName


2 Bangladesh Bangladesh 90.22658 23.88242 Bangladesh 0.4 0.6 legendName


3 Myanmar Myanmar 96.48873 21.21545 Myanmar 0.2 0.8 legendName


#———————————


# 提取原始high resolution map的数据,作为map对应的新数据


a


rawData


#———————————


# 注意下面的操作,因为我的饼图只区分2块,所以只需要多增加2列数据


rawData[,5]


rawData[,6]


colnames(rawData)


IDname


for(i in 1:length(a@plotOrder)){IDname[i]


#———————————


# 将新数据data覆盖原始的数据data


rawData


a@data


#———————————


# 添加新加入的城市对应的对象属性polygons,添加一个对象到list中


# polygons是一个list;每个成员是一个sp


# 每个sp的polygons又是一个list,每个成员是一个sp


# 每个sp都有其自己的对象属性,相同或不同


#


for(i in 1:dim(dat)[1])


{

index


tmpPolygon


tmpPolygon@labpt


tmpPolygon@ID


a@polygons


# 相当于把新坐标点的polygon信息添加到map中


# 新坐标点的polygon取所在国家的polygon


}


#———————————


# plot map pie


par(oma=c(0,0,0,0),


mar=c(0,0,0,0),


fig=c(0,1,0,1),


mai=c(0,0,0,0)


)


# 因为我的饼图只区分2块,所以只需要2个颜色


color_array


mapPies(a,


nameZs = c(colnames(a@data)[5],


colnames(a@data)[6]), # 用作画图的两列


zColours=color_array, # 不同比例的颜色


symbolSize = 0.5, # pie的大小


addCatLegend=F, # 不添加默认的legend


oceanCol = "lightblue",


landCol = "wheat")


legend(60,0, # legend所在的横纵坐标/经纬度


legend = c(colnames(a@data)[5],


colnames(a@data)[6]), # legend中的指示文字


fill = color_array, # legend 指示box的颜色,要求顺序同上zColours


title = dat[1,8], # legend title


bty="n", # 不做legen的背景框


title.adj = c(1)


)


月亮图与Kosara(2019)1的 “圆形切片 “图类似。在研究受试者对不同图表类型中百分比的感知时,”圆形切片 “的表现与饼图类似。月亮图与 “圆形切片 “的不同之处在于,后者是在一个基础圆上滑动第二个同样大小的圆盘,更像是月食而不是月相。然而,两者都依赖面积作为视觉线索。

用法

ggplot2数据可视化包,为R语言中的月亮图提供支持。它们的绘制方式与ggplot2中的点最为相似:它们的位置由一个x和一个y坐标定义,它们的大小与坐标系无关,所以它们总是保持圆形。


课程

R语言数据分析挖掘必知必会

从数据获取和清理开始,有目的的进行探索性分析与可视化。让数据从生涩的资料,摇身成为有温度的故事。

立即参加

ggplot(data.frame(x = 1:5, y = 1)) +
  geom_point(y = 2) +
  scale_size(range = c(5, 10))+

两个新的美学在geom_moon中也很重要:比例和填充

比例美学

比率控制要绘制的月亮的比例。它必须在0("新月",实际上什么都没画)和1("满月",即一个圆)之间。

ggplot(data.frame(x = 1:5, y = 0, ratio = 0:4 * 0.25), aes(x = x, y = y),ratio = ratio), size = 20, fill = "black") +
  geom_text(aes(y = y + 1, label = ratio)) +

用两种颜色制作一个 “完整 “的月亮的一种方法是用right = TRUE表示一种颜色,用right = FALSE表示另一种颜色,比例互补。

ggplot( moons) +
  geom(aes(x, y, ratio = ratio, right = right, fill = right)) +

图例关键字

三个关键字,用于不同类型的图例:默认值,绘制一个右边的悬臂月(见上文)。

left从左边画出一个新月,与长臂月互补,这对组合图例很有用。


R语言空间可视化:绘制英国脱欧投票地图

阅读文章


ggplot(aes(x, y, ratio = ratio, right = right, size = 2^x)) +
  geom(data = subset(moons, right)) +
  geom(
    key = left
  )

key画的是一个圆。它类似于 “点 “的形状,但计算方式略有不同,所以如果你想让图例月亮的尺寸和月亮的尺寸相匹配,就更合适。


随时关注您喜欢的主题


ggplot(tidymoons) +
  geom(key = full
  ) +

工作实例

地图上的月亮图

多饼图的一个常见用途是表示地图上不同坐标处的比例。x和y维度已经致力于地图坐标,所以像柱状图这样的比例可视化就比较困难。这是一个尝试月形图的绝佳机会!

饼图地图在人口遗传学中很流行,所以让我们看一下该领域的一个例子。

数据包含果蝇种群中Adh基因的两个变体的频率。这些种群中有许多都很接近,所以我们必须处理过度绘制的问题,我们在下面手动处理。

moonmap <- ggplot(da, aes(long, lat)) +
  geom_polygon(
    data = map_data(
      "world"),
    aes(group = group),
  ) +

如果我们想在图例中明确标注等位基因,那么我们需要将它们映射到一个组中,这就要求我们将数据重新排列成一个 “较长”(”整齐”)的格式。

 reshape(
  v.names = "percent",
  times = c("dhF", "dhS"),
  direction = "long"
)

月球数据

有时你只是想绘制月球的文字表述。改编自NASA的月球数据,包含了2019年每天从地球到月球的距离,以及月球四个主要阶段每次出现的日期(UTC)。我们可以用月球图(在这种情况下与饼图相同)绘制这些主要阶段。

ggplot(lunardist, aes(date, distance)) +
  geom_line() +
  # 将下层绘制成一个完整的圆
  geom(data = phase, ratio = 1, size = 5, fill = "black") +

Harvey balls哈维球分析法

“哈维球 “本质上是用于定性比较的饼图,通常以表格形式出现。我们可以使用月形图来达到同样的目的。

首先,让我们获取一些数据。

哈维月亮的图表。

# 首先,我们将数据变化为 "长 "格式,以方便绘图。
rest <- reshape(
  restaurants,
  timevar = "Category",
  direction = "long"
)

ggplot(rest, aes(0, 0)) +
  geom(aes(ratio = (Score - 1) / 4), fill = "black") +
  theme(
    panel.grid = element_blank()

参考文献


  • Kosara, R. 2019. Circular Part-to-Whole Charts Using the Area Visual Cue. EuroVis 2019 – Short Papers. https://doi.org/10.2312/evs.20191163↩︎
  • Oakeshott, J.G., et al. 1982. Alcohol dehydrogenase and glycerol-3-phosphate dehydrogenase clines in Drosophila melanogaster on different continents. Evolution, 36(1): 86-96.↩︎

可下载资源

关于作者

Kaizong Ye拓端研究室(TRL)的研究员。在此对他对本文所作的贡献表示诚挚感谢,他在上海财经大学完成了统计学专业的硕士学位,专注人工智能领域。擅长Python.Matlab仿真、视觉处理、神经网络、数据分析。

本文借鉴了作者最近为《R语言数据分析挖掘必知必会 》课堂做的准备。

​非常感谢您阅读本文,如需帮助请联系我们!

 
QQ在线咨询
售前咨询热线
15121130882
售后咨询热线
0571-63341498

关注有关新文章的微信公众号


永远不要错过任何见解。当新文章发表时,我们会通过微信公众号向您推送。

技术干货

最新洞察

This will close in 0 seconds