如何在ggplot中绘制仅含单个变量的Quanteda词频排名图
问题根因
你遇到的绘图无数据问题主要由两个常见原因导致:
- freqs列数据类型错误:你提供的示例数据中freqs是字符型,ggplot无法基于字符类型的y轴绘制折线
- aes内动态计算索引不稳定:在aes映射中直接调用seq_along计算排名,部分场景下会出现映射错位
解决方案
按以下步骤修改代码即可正常出图:
- 先确认freqs列数据类型,转换为数值型
- 提前在数据框中生成排名列,避免在aes内动态计算
完整修正代码(适配你提供的处理流程)
# 前面的语料处理、DFM生成代码保持不变 symptoms_corpus <- corpus(X$TEXT, docnames = X$id ) Symptoms_DFM <- dfm(symptoms_corpus) freqs <- colSums(Symptoms_DFM) words <- colnames(Symptoms_DFM) word_list <- data.frame(words, freqs) word_list <- word_list[order(word_list$freqs, decreasing = TRUE), ] # --- 新增/修正部分开始 --- # 检查freqs列类型,转换为数值型(如果是字符的话) word_list$freqs <- as.numeric(word_list$freqs) # 提前生成排名列 word_list$rank <- 1:nrow(word_list) # 绘图 ggplot(word_list, aes(x = rank, y = freqs)) + geom_line(linewidth = 1.2) + labs(title = "Rank Frequency Plot", x = "Rank", y = "Frequency") + theme_bw() # 可选,替换默认灰色背景,更美观 # --- 新增/修正部分结束 ---
基于你提供的示例数据集的测试代码
first_column <- c("the","patient", "arm", "rash", "tingling", "was", "in", "not") second_column <- c("4116407", "3599537", "2582586", "1323883", "1220894", "1012042", "925339", "822150") word_list2 <- data.frame(first_column, second_column) colnames(word_list2) <- c("word", "freqs") # 修正后绘图 word_list2$freqs <- as.numeric(word_list2$freqs) word_list2 <- word_list2[order(word_list2$freqs, decreasing = T), ] word_list2$rank <- 1:nrow(word_list2) ggplot(word_list2, aes(x = rank, y = freqs)) + geom_line(linewidth = 1.2, color = "#2c3e50") + labs(title = "Rank Frequency Plot", x = "Rank", y = "Frequency") + theme_bw()
优化建议
词频分布符合齐普夫定律,双对数坐标轴下的展示效果更清晰,可在绘图代码中加入对数轴设置:
ggplot(word_list, aes(x = rank, y = freqs)) + geom_line(linewidth = 1.2) + scale_x_log10() + scale_y_log10() + labs(title = "Rank Frequency Plot (Log-Log Scale)", x = "Rank (Log)", y = "Frequency (Log)") + theme_bw()
内容的提问来源于stack exchange,提问作者Magnetar
相关产品推荐
相关产品推荐

