如何使用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
相关产品推荐
相关产品推荐

