You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用R复现帖子互动量与发布数量的双对数散点图

核心问题说明

你现在的代码存在两处核心问题,导致结果和参考图不符:

  1. 测试数据分布不符合真实社交场景互动特征:你用正态分布生成点赞/评论值,这类分布数值集中在均值附近,无头部高互动样本;而真实社交平台的互动量是典型的重尾分布,少量头部帖子贡献绝大多数互动量,这是你得到两条平行直线的核心原因。
  2. 数据处理逻辑遗漏排序步骤:你直接取原始数据集前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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 08:24:00