如何使用R复现帖子互动量与发布数量的双对数散点图
核心问题说明
你现在的代码存在两处核心问题,导致结果和参考图不符:
- 测试数据分布不符合真实社交场景互动特征:你用正态分布生成点赞/评论值,这类分布数值集中在均值附近,无头部高互动样本;而真实社交平台的互动量是典型的重尾分布,少量头部帖子贡献绝大多数互动量,这是你得到两条平行直线的核心原因。
- 数据处理逻辑遗漏排序步骤:你直接取原始数据集前2^n行求和,正确逻辑是先将所有帖子按对应互动指标(点赞/评论)降序排序,再取前k行计算累计总和,才能反映头部帖子累计互动量随帖子数量增加的变化趋势。
修正后可运行代码
# 加载依赖 library(tidyverse) library(ggplot2) library(scales) # 可复现性设置 set.seed(12345) # 构造符合真实分布的测试数据:用对数正态模拟重尾互动量 df <- tibble( like = floor(rlnorm(200000, meanlog = 6, sdlog = 2)), comment = floor(rlnorm(200000, meanlog = 5, sdlog = 2)) ) # 先按互动指标降序排序 df_sorted_like <- df %>% arrange(desc(like)) df_sorted_comment <- df %>% arrange(desc(comment)) # 计算累计互动量 df_new <- lapply( 1:14, function(n) { k <- 2^n # 计算前k条的累计点赞、累计评论 tibble( No_of_rows = k, like = sum(df_sorted_like$like[1:k]), comment = sum(df_sorted_comment$comment[1:k]) ) } ) %>% bind_rows() # 归一化处理(如果参考图Y轴是占总互动量的比例,可开启这段) # total_like <- sum(df$like) # total_comment <- sum(df$comment) # df_new <- df_new %>% mutate( # like = like / total_like, # comment = comment / total_comment # ) # 绘图 df_new %>% pivot_longer(-No_of_rows, names_to = "Variable", values_to = "Value") %>% ggplot(aes(x = No_of_rows, y = Value, color = Variable))+ geom_point() + geom_line() + scale_x_log10(breaks = trans_breaks("log10", function(x) 10^x), labels = trans_format("log10", math_format(10^.x))) + # 如果用了归一化,Y轴可以换成百分比格式 # scale_y_continuous(labels = percent_format()) + scale_y_log10(breaks = trans_breaks("log10", function(x) 10^x), labels = trans_format("log10", math_format(10^.x))) + labs(x = "帖子数量", y = "累计互动量", color = "指标") + theme_bw()
补充说明
如果参考图的X轴是单条帖子的互动量、Y轴是对应互动量的帖子数量(即分布直方图),可以调整统计逻辑为按互动量区间统计帖子数后绘图,可根据你参考图的实际轴定义调整上述代码的指标映射。
内容的提问来源于stack exchange,提问作者AneesBaqir
相关产品推荐
相关产品推荐

