饼图把一个圆分成多个部分,这些部分的弧长(以及面积)代表一个整体的比例。
月亮图也是如此,它把一个圆分成多个部分,这些部分的面积代表整个圆的比例,但在月亮图中,这些部分被画成圆的月牙形,就像月相。
月亮图和饼图
可下载资源
使用月亮图而不是饼图背后的动机主要是审美的选择。还要注意的是,由于月亮图的各部分是从圆的一侧或另一侧扫过的,所以一般只适合于描述一个或两个群体。
画图原理
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坐标定义,它们的大小与坐标系无关,所以它们总是保持圆形。
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从左边画出一个新月,与长臂月互补,这对组合图例很有用。
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语言数据分析挖掘必知必会 》课堂做的准备。
非常感谢您阅读本文,如需帮助请联系我们!