该内容已被发布者删除 该内容被自由微信恢复
文章于 4月2日 下午 9:10 被检测为删除。
查看原文
被用户删除
其他

R语言绘图 | 三角密度图

小陈的R语言笔记 小陈的R语言笔記 2024-04-02

安装和加载R包

devtools::install_github('marvinschmitt/ggsimplex')  # 安装 ggsimplex 包
library(ggsimplex)  # 载入 ggsimplex 包
library(ggplot2)  # 载入 ggplot2 包

绘图

设置画布

通过设置长宽比、空白主题和绘制三角形边框来设置画布

ggplot() +  # 创建一个空的 ggplot 对象
  coord_fixed(ratio=1,  # 设置坐标轴比例为1
              xlim=c(0, 1),  # 设置 x 轴范围为0到1
              ylim=c(0, 1)) +  # 设置 y 轴范围为0到1
  theme_void() +  # 应用空白主题
  geom_simplex_canvas()  # 添加一个简单六边形

设置数据

library(brms)  # 载入 brms 包
data = rdirichlet(n = 100, alpha = c(1,2,3))  # 生成 Dirichlet 分布的随机数据,其中 n 为样本量,alpha 为分布的参数向量
data = as.data.frame(data)  # 将生成的数据转换为数据框格式
colnames(data) = c("pmp_1""pmp_2""pmp_3")  # 为数据框添加列名

data$pmp = with(data, make_list_column(pmp_1, pmp_2, pmp_3))  # 将 pmp_1、pmp_2、pmp_3 列合并为列表并添加到数据框中的 pmp 列

绘制点图

ggplot() +  # 创建一个空的 ggplot 对象
  coord_fixed(ratio=1, xlim=c(0, 1), ylim=c(0, 1)) +  # 设置坐标轴比例为1,并且设置 x 和 y 轴的范围为0到1
  theme_void() +  # 应用空白主题
  geom_simplex_canvas() +  # 添加一个简单六边形
  geom_simplex_point(data = data, aes(pmp = pmp),  # 添加简单六边形的点,数据来源为 data 数据框,映射 pmp 到 y 轴
                     size = 0.7, color = "firebrick", alpha = 0.8)  # 设置点的大小为0.7,颜色为火砖红,透明度为0.8

绘制密度图

df_dirichlet = data.frame(true_model = 1)  # 创建一个数据框,其中包含一个名为 true_model 的列,并初始化为1
df_dirichlet$Alpha = list(c(1, 2, 3))  # 在数据框中添加一个名为 Alpha 的列表列,列表中包含参数向量 c(1, 2, 3)

ggplot() +  # 创建一个空的 ggplot 对象
  coord_fixed(ratio=1, xlim=c(0, 1), ylim=c(0, 1)) +  # 设置坐标轴比例为1,并且设置 x 和 y 轴的范围为0到1
  theme_void() +  # 应用空白主题
  geom_simplex_canvas() +  # 添加一个简单六边形
  stat_simplex_density(data=df_dirichlet, fun = ddirichlet,  # 在简单六边形上添加 Dirichlet 分布的密度估计
                       args = alist(Alpha=Alpha))  # 设置参数为 Alpha 列的值

点图与密度图叠加

ggplot() +  # 创建一个空的 ggplot 对象
  coord_fixed(ratio=1, xlim=c(0, 1), ylim=c(0, 1)) +  # 设置坐标轴比例为1,并且设置 x 和 y 轴的范围为0到1
  theme_void() +  # 应用空白主题
  geom_simplex_canvas() +  # 添加一个简单六边形
  stat_simplex_density(data=df_dirichlet, fun = ddirichlet,  # 在简单六边形上添加 Dirichlet 分布的密度估计
                       args = alist(Alpha=Alpha)) +  # 设置参数为 Alpha 列的值
  geom_simplex_point(data = data, aes(pmp = pmp),  # 在简单六边形上添加点,数据来源为 data 数据框,映射 pmp 到 y 轴
                     size = 0.7, color = "firebrick", alpha = 0.8)  # 设置点的大小为0.7,颜色为火砖红,透明度为0.8

绘制分面图

mu_1 = c(0, 0)  # 设置第一个组的均值向量
Sigma_1 = matrix(c(1, 0, 0, 1), nrow=2, byrow=TRUE)  # 设置第一个组的协方差矩阵
data_1 = data.frame(true_model = 1,  # 创建包含 true_model 列的数据框,值为1
                    rlogistic_normal(n = 100, mu = mu_1, Sigma = Sigma_1))  # 生成服从 logistic-normal 分布的随机数据

mu_2 = c(0, 0)  # 设置第二个组的均值向量
Sigma_2 = matrix(c(0.3, 0, 0, 0.3), nrow=2, byrow=TRUE)  # 设置第二个组的协方差矩阵
data_2 = data.frame(true_model = 2,  # 创建包含 true_model 列的数据框,值为2
                    rlogistic_normal(n = 100, mu = mu_2, Sigma = Sigma_2))  # 生成服从 logistic-normal 分布的随机数据

mu_3 = c(0, 0)  # 设置第三个组的均值向量
Sigma_3 = matrix(c(0.5, 0.3, 0.3, 1), nrow=2, byrow=TRUE)  # 设置第三个组的协方差矩阵
data_3 = data.frame(true_model = 3,  # 创建包含 true_model 列的数据框,值为3
                    rlogistic_normal(n = 100, mu = mu_3, Sigma = Sigma_3))  # 生成服从 logistic-normal 分布的随机数据

data = rbind(data_1, data_2, data_3)  # 合并三个数据框为一个数据框
colnames(data) = c("true_model""pmp_1""pmp_2""pmp_3")  # 为数据框添加列名
data$pmp = with(data, make_list_column(pmp_1, pmp_2, pmp_3))  # 将 pmp_1、pmp_2、pmp_3 列合并为列表并添加到数据框中的 pmp 列

df_logistic_normal = data.frame(true_model = 1:3)  # 创建一个数据框,其中包含一个名为 true_model 的列,值为1到3
df_logistic_normal$mu = list(mu_1, mu_2, mu_3)  # 在数据框中添加一个名为 mu 的列表列,列表中包含均值向量
df_logistic_normal$Sigma = list(Sigma_1, Sigma_2, Sigma_3)  # 在数据框中添加一个名为 Sigma 的列表列,列表中包含协方差矩阵


ggplot() +  # 创建一个空的 ggplot 对象
  coord_fixed(ratio=1, xlim=c(0, 1), ylim=c(0, 1)) +  # 设置坐标轴比例为1,并且设置 x 和 y 轴的范围为0到1
  theme_void() +  # 应用空白主题
  geom_simplex_canvas() +  # 添加一个简单六边形
  stat_simplex_density(data=df_logistic_normal, fun = dlogistic_normal,  # 在简单六边形上添加 logistic-normal 分布的密度估计
                       args = alist(mu = mu, Sigma = Sigma)) +  # 设置参数为 mu 和 Sigma 列的值
  geom_simplex_point(data = data, aes(pmp = pmp),  # 在简单六边形上添加点,数据来源为 data 数据框,映射 pmp 到 y 轴
                     size = 0.7, color = "firebrick", alpha = 0.3) +  # 设置点的大小为0.7,颜色为火砖红,透明度为0.3
  facet_grid(~true_model, labeller=label_both)  # 根据 true_model 列分面,并使用 label_both 函数标记 facet

参考资料:https://www.marvinschmitt.com/blog/ggsimplex-prerelease



继续滑动看下一个
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存