该内容已被发布者删除 该内容被自由微信恢复。
文章于 4月2日 下午 9:10 被检测为删除。
被用户删除
其他
R语言绘图 | 三角密度图
安装和加载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