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

如何使用R语言绘制随时间变化的唯一国家累计数量统计图?

绘制随时间变化的累计唯一国家数量

我明白你遇到的问题了——用stat_ecdf()得到的是比例而非绝对的国家数量,这是因为这个函数本身是用来计算经验累积分布函数的,Y轴默认展示的是「截至当前年份的样本占总样本的比例」,而非你需要的绝对累计国家数。下面是解决这个问题的完整步骤和代码:

步骤1:预处理数据,提取每个国家首次出现的年份

首先我们需要找出每个国家第一次出现在数据中的年份,因为只有首次出现才会让累计数量增加,后续重复出现的同国家不需要重复计数:

# 加载所需包
library(tidyverse)

# 从你的示例数据中提取每个国家的首次出现年份
first_appear <- mydf %>%
  group_by(Country) %>%
  summarise(first_year = min(Year)) %>%
  ungroup()

步骤2:计算截至每一年的累计唯一国家数

接下来我们需要把首次出现的年份按时间排序,然后生成累计计数。为了让图表在年份间更连贯(比如某一年没有新国家出现时,累计数量保持不变),我们可以生成覆盖所有年份的序列,并填充累计值:

# 获取数据中的年份范围
year_range <- seq(min(first_appear$first_year), max(first_appear$first_year), 1)

# 创建包含所有年份的完整数据框,并填充累计数量
full_cumulative <- tibble(Year = year_range) %>%
  # 匹配有新国家出现的年份的累计数
  left_join(
    first_appear %>%
      arrange(first_year) %>%
      mutate(cumulative_count = row_number()),
    by = c("Year" = "first_year")
  ) %>%
  # 向下填充累计数(没有新国家的年份沿用之前的数量)
  fill(cumulative_count, .direction = "down") %>%
  # 把最早年份之前的累计数设为0
  replace_na(list(cumulative_count = 0))

步骤3:绘制可视化图表

现在我们可以用ggplot2绘制阶跃图(用geom_step()比折线图更贴合数据逻辑,因为累计数量只会在有新国家出现的年份跳跃式增长):

ggplot(full_cumulative, aes(x = Year, y = cumulative_count)) +
  geom_step(color = "#2c3e50", size = 1) +
  labs(
    x = "年份",
    y = "累计唯一国家数量",
    title = "随时间变化的累计唯一国家数量"
  ) +
  theme_minimal()

为什么stat_ecdf()不适用?

再补充解释一下:stat_ecdf()的核心是计算累积概率,比如对于你的数据,它会计算「截至某一年,样本中Year小于等于该年份的比例」,所以Y轴范围是0到1。而我们需要的是「截至某一年,已经出现的不同国家的总数」,这是一个绝对计数,因此必须先对数据进行分组去重、累计计数的预处理,再进行可视化。

内容的提问来源于stack exchange,提问作者anpami

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 12:58:14