TraMineR 2.2-7中seqfplot()的yaxis="pct"参数失效,如何恢复原有功能?
解决TraMineR 2.2-7版本seqfplot()无法显示百分比y轴的问题
在TraMineR 2.2-7版本中,原通过seqfplot(actcal.seq, yaxis = "pct")显示百分比y轴的方式会抛出错误If not logical, yaxis should be one of "all" or "left",而直接调用plot.stslist.freq虽能实现百分比y轴,却无法保留seqfplot的分组、自动图例等高级特性。以下提供两种可行解决方案:
方案1:手动修改现有绘图的y轴标签
先调用seqfplot生成基础频率图,再将y轴计数值转换为百分比:
# 生成基础频率图(支持分组) seqfplot(actcal.seq) # 获取当前y轴刻度的计数值 y_counts <- axTicks(2) # 计算百分比并格式化(保留1位小数) y_pct <- round(y_counts / nrow(actcal.seq) * 100, 1) # 替换y轴标签为百分比格式 axis(2, at = y_counts, labels = paste0(y_pct, "%"))
若存在分组,只需在seqfplot中传入group参数,再对每个子图重复y轴标签替换操作即可。
方案2:自定义封装函数,保留seqfplot特性+百分比y轴
以下函数复刻seqfplot的分组、自动图例功能,同时支持百分比y轴:
seqfplot_pct <- function(x, group = NULL, legend.pos = "right", cex.legend = 1, ...) { # 获取序列的状态颜色与标签 state_colors <- attr(x, "cpal") state_labels <- attr(x, "labels") if (!is.null(group)) { # 按分组拆分序列 grouped_seqs <- split(x, group) n_groups <- length(grouped_seqs) # 设置子图布局(横向排列分组图) par(mfrow = c(1, n_groups), mar = c(4, 4, 2, 1)) # 逐个绘制分组的百分比频率图 for (i in seq_along(grouped_seqs)) { freq_tab <- seqtab(grouped_seqs[[i]]) plot(freq_tab, yaxis = "pct", col = state_colors, main = names(grouped_seqs)[i], ...) } # 添加统一图例 legend(legend.pos, legend = state_labels, fill = state_colors, cex = cex.legend, bty = "n") # 恢复默认绘图参数 par(mfrow = c(1, 1), mar = c(5, 4, 4, 2) + 0.1) } else { # 无分组场景绘制百分比频率图 freq_tab <- seqtab(x) plot(freq_tab, yaxis = "pct", col = state_colors, ...) legend(legend.pos, legend = state_labels, fill = state_colors, cex = cex.legend, bty = "n") } }
调用示例:
# 无分组的百分比频率图 seqfplot_pct(actcal.seq) # 按sex分组的百分比频率图(图例置于底部) seqfplot_pct(actcal.seq, group = actcal$sex, legend.pos = "bottom", cex.legend = 0.8)
原理说明
TraMineR 2.2-7版本对seqfplot的yaxis参数新增了合法性检查,仅允许"all"或"left"值,但底层调用的plot.stslist.freq仍支持"pct"参数。上述方案要么手动修改绘图元素,要么绕过seqfplot的参数检查,直接调用底层绘图函数并保留seqfplot的附加特性。
内容的提问来源于stack exchange,提问作者Henrik
相关产品推荐
相关产品推荐

