三元相图是一种由三个组分构成,且三个组分的值之和恒为定值的图形,三元相图中点的位置表示三个组分间的比例关系,延申一下,可以表示三个变量的权重、相对重要性等。
R语言我比较喜欢用ggplot2这个包来绘图,而ggplot2刚好有一个拓展包ggtern可以用来绘制三元相图,因此这次也是用这个ggtern包来小试牛刀。
运用ggtern函数可以初始化一个三元相图出来
#data最好是dataframe格式
ggtern(data,aes(x,y,z))
构造数据最重要的是x,y,z三列,除此之外,可以有其他的分组字段,但这x、y、z三个字段是必须要有的!
# 读取数据
library(readxl)
data <- read_excel("D:/New Desktop/data.xlsx")
#打印数据前几行
head(data)
#构造数据
df <- data.frame(x = data$指标一,
y = data$指标二,
z = data$指标三,
city = data$城市,
value = data$Value,
year = data$年份)
运用刚刚讲的基础语法可以绘制出一个三元相图,但这个三元相图是没有任何内容的
#使用ggtern包生成三元相图
#首先,在ggtern函数里声明好数据和三相图的三个坐标轴x,y,z
p<- ggtern(data = df,aes(x, y, z))
p
添加点的方法跟ggplot2包一样,这里就不做过多赘述,看下方代码。
p<- ggtern(data = df,aes(x, y, z))+
geom_point(size=1.5) #size是指点对象的大小
p
添加核密度图用的函数是stat_density_tern()
,下面是这个函数在绘制过程中的使用:
p<- ggtern(data = df,aes(x, y, z))+
stat_density_tern(
geom='polygon',
bdl.val = NA,
aes(fill=..level..,alpha = ..level..))+
geom_point(size=1.5)
p
添加完之后我们发现这个颜色有点辣眼睛,那不如修改一下核密度的颜色吧,这里用的方法是ggplot2里的颜色修改函数:scale_fill_gradient(low,high...)
具体使用看代码:
p <- ggtern(data = df,aes(x, y, z))+
stat_density_tern(
geom='polygon',
bdl.val = NA,
aes(fill=..level..,
alpha = ..level..))+
#修改核密度图的颜色
scale_fill_gradient(low = "blue",
high = "red")+
geom_point(size =1.5)
p
制作分组图需要有一个用于分类的字段,那么下面我将根据city
字段进行分组绘制
这里有几种分组图可以绘制:
这里就不一一演示了,感兴趣的话可以替换一下代码里相应的部分
p<- ggtern(data = df,aes(x, y, z))+
stat_density_tern(
geom='polygon',
bdl.val = NA,
aes(fill=..level..,
alpha = ..level..))+
scale_fill_gradient(low = "blue",
high = "red")+
#用city字段给点赋予不同的颜色
geom_point(aes(colour = city))
p
那么这幅图也就大致完成了,再来做些细节上的修改
轴标签的修改用labs()函数来修改,其用法与ggplot里基本相同的,不仅可以修改标注,还可以在labs里添加标题
p<- ggtern(data = df,aes(x, y, z))+
stat_density_tern(
geom='polygon',
bdl.val = NA,
aes(fill=..level..,
alpha = ..level..))+
#修改核密度图的颜色
scale_fill_gradient(low = "blue",
high = "red")+
#修改坐标轴名称并且添加标题
labs(x ="Factor1",y = "Factor2",z = "Factor3",title = "This is my R works")+
#用city字段给点赋予不同的颜色
geom_point(size =1.5,aes(colour = city))
p
要修改图例,就需要先知道图例的来源,例如核密度图的色带图例是来源于scale_fill_gradient
函数(因为它定义了密度的颜色),而点的图例来源于geom_point
函数,这个函数是ggplot2里自带的,因此可以像ggplot2修改图例那样去修改这个点,而最后的那个图例实则是设置了透明度alpha
所产生的。
知道了图例的来源,那么就对症下药,用的药是guides()
函数。
注意:图例名称的修改在labs()
里面。
p<- ggtern(data = df,aes(x, y, z))+
stat_density_tern(
geom='polygon',
bdl.val = NA,
aes(fill=..level..,
alpha = ..level..))+
#修改核密度图的颜色
scale_fill_gradient(low = "blue",
high = "red")+
#修改坐标轴名称并且添加标题
#在labs里修改图例名称
labs(x ="Factor1",y = "Factor2",z = "Factor3",title = "This is my R works",fill = "密度",color = "城市")+
#设置透明度图例为不可见
guides(alpha = "none")+
#用city字段给点赋予不同的颜色
geom_point(size =1.5,aes(colour = city))
p
那么如果我想将图例放在图的下方呢?
那么这个可以通过theme(legend.position)
来控制:
p<- ggtern(data = df,aes(x, y, z))+
stat_density_tern(
geom='polygon',
bdl.val = NA,
aes(fill=..level..,
alpha = ..level..))+
#修改核密度图的颜色
scale_fill_gradient(low = "blue",
high = "red")+
#修改坐标轴名称并且添加标题
#在labs里修改图例名称
labs(x ="Factor1",y = "Factor2",z = "Factor3",title = "This is my R works",fill = "密度",color = "城市")+
#设置透明度图例为不可见
guides(alpha = "none")+
#用city字段给点赋予不同的颜色
geom_point(size =1.5,aes(colour = city))+
theme(legend.position="bottom")
p
数据标签就是在图上显示具体的数据值,那么怎么在图上显示数据标签呢?
这里需要用到geom_label()函数,它的效果就像小卡片一样显示数值,具体看看代码吧!
p<- ggtern(data = df,aes(x, y, z))+
stat_density_tern(
geom='polygon',
bdl.val = NA,
aes(fill=..level..,
alpha = ..level..))+
#修改核密度图的颜色
scale_fill_gradient(low = "blue",
high = "red")+
#修改坐标轴名称并且添加标题
#在labs里修改图例名称
labs(x ="Factor1",y = "Factor2",z = "Factor3",title = "This is my R works",fill = "密度",color = "城市")+
#设置透明度图例为不可见
guides(alpha = "none",position="bottom")+
#用city字段进行标注
geom_label(aes(label = city))+
#用city字段给点赋予不同的颜色
geom_point(size =2,aes(colour = city))+
theme(legend.position = "bottom",
#将点图层背后灰色的背景去掉
legend.key = element_rect(fill = NA))
p
ggplot2跟ggtern中预设了一堆的主题可供我们选择,具体有以下的主题可以选择:
那么这里就挑选其中我最常使用的来展示:
theme_rgbw
p<- ggtern(data = df,aes(x, y, z))+
stat_density_tern(
geom='polygon',
bdl.val = NA,
aes(fill=..level..,
alpha = ..level..))+
#修改核密度图的颜色
scale_fill_gradient(low = "blue",
high = "red")+
#修改坐标轴名称并且添加标题
#在labs里修改图例名称
labs(x ="Factor1",y = "Factor2",z = "Factor3",title = "This is my R works",fill = "密度",color = "城市")+
#设置透明度图例为不可见
guides(alpha = "none",position="bottom")+
#用city字段给点赋予不同的颜色
#geom_label(aes(label = city))+
geom_point(size =2,aes(colour = city))+
theme(legend.position = "bottom",
#将点图层背后灰色的背景去掉
legend.key = element_rect(fill = NA))+
#添加主题
theme_rgbw()
p
ggplot2默认的字体是sans(Arial字体)
,那如果将这个这种字体修改成Times New Roman
呢?
其实方法很简单,只需要在theme里面用text=element_text()
函数来控制即可。
注意,ggplot2中serif
字体就是Times New Roman
p<- ggtern(data = df,aes(x, y, z))+
stat_density_tern(
geom='polygon',
bdl.val = NA,
aes(fill=..level..,
alpha = ..level..))+
#修改核密度图的颜色
scale_fill_gradient(low = "blue",
high = "red")+
#修改坐标轴名称并且添加标题
#在labs里修改图例名称
labs(x ="Factor1",y = "Factor2",z = "Factor3",title = "This is my R works",fill = "密度",color = "城市")+
#设置透明度图例为不可见
guides(alpha = "none",position="bottom")+
#用city字段给点赋予不同的颜色
#geom_label(aes(label = city))+
geom_point(size =2,aes(colour = city))+
theme_rgbw()+
theme(legend.position = "bottom",
#将点图层背后灰色的背景去掉
legend.key = element_rect(fill = NA)),
#设置Times New Roman与字体大小
text=element_text(size=16, family="serif"))
p
上面就是我绘制三元相图的过程了,当然还有一些图形分面、图形保存的设置,这些都可以用ggplot2的方法去进行保存,这里就不重复造车轮子了,庆祝一下大功告成!