R语言绘制三元相图(ggtern包)

文章目录

    • 什么是三元相图?
      • 三元相图的绘制
        • 绘制工具
        • 基本语法
        • 数据预处理
        • 初始化三元相图
        • 给三元相图添加点
        • 添加核密度图
        • 制作分组图
      • 制图优化
        • 轴标签的修改
        • 图例的修改
        • 数据标签的添加
        • 主题添加
        • 字体的修改

什么是三元相图?

三元相图是一种由三个组分构成,且三个组分的值之和恒为定值的图形,三元相图中点的位置表示三个组分间的比例关系,延申一下,可以表示三个变量的权重、相对重要性等。

三元相图的绘制

绘制工具

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)

R语言绘制三元相图(ggtern包)_第1张图片

#构造数据
df <- data.frame(x = data$指标一,
                 y = data$指标二,
                 z = data$指标三,
                 city = data$城市,
                 value = data$Value,
                 year = data$年份)

R语言绘制三元相图(ggtern包)_第2张图片

初始化三元相图

运用刚刚讲的基础语法可以绘制出一个三元相图,但这个三元相图是没有任何内容的

#使用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

R语言绘制三元相图(ggtern包)_第3张图片

添加核密度图

添加核密度图用的函数是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

R语言绘制三元相图(ggtern包)_第4张图片
添加完之后我们发现这个颜色有点辣眼睛,那不如修改一下核密度的颜色吧,这里用的方法是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

R语言绘制三元相图(ggtern包)_第5张图片

制作分组图

制作分组图需要有一个用于分类的字段,那么下面我将根据city字段进行分组绘制
这里有几种分组图可以绘制:

  1. 根据颜色进行分组(colour = city)
  2. 根据大小进行分组(size = city)
  3. 根据点的样式进行分组(shape = 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

R语言绘制三元相图(ggtern包)_第6张图片

制图优化

那么这幅图也就大致完成了,再来做些细节上的修改

  1. 轴标签的修改
  2. 图例的修改
  3. 添加数据标签
  4. 主题的添加

轴标签的修改

轴标签的修改用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

R语言绘制三元相图(ggtern包)_第7张图片

图例的修改

要修改图例,就需要先知道图例的来源,例如核密度图的色带图例是来源于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

R语言绘制三元相图(ggtern包)_第8张图片
那么如果我想将图例放在图的下方呢?
那么这个可以通过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

R语言绘制三元相图(ggtern包)_第9张图片

数据标签的添加

数据标签就是在图上显示具体的数据值,那么怎么在图上显示数据标签呢?
这里需要用到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

R语言绘制三元相图(ggtern包)_第10张图片

主题添加

ggplot2跟ggtern中预设了一堆的主题可供我们选择,具体有以下的主题可以选择:
R语言绘制三元相图(ggtern包)_第11张图片
R语言绘制三元相图(ggtern包)_第12张图片

那么这里就挑选其中我最常使用的来展示:
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

R语言绘制三元相图(ggtern包)_第13张图片

字体的修改

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

R语言绘制三元相图(ggtern包)_第14张图片
上面就是我绘制三元相图的过程了,当然还有一些图形分面、图形保存的设置,这些都可以用ggplot2的方法去进行保存,这里就不重复造车轮子了,庆祝一下大功告成!

你可能感兴趣的:(R语言,r语言,经验分享)