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

如何用geom_bar绘制每年受害Top5的国家赞助网络攻击柱状图

解决年度Top5网络攻击受害者的柱状图绘制问题

我手头有一份记录国家赞助网络攻击的DataFrame,核心字段是年份(Year)、发起国(Sponsor_sep)和受害方(Victims_sep)。想要用geom_bar绘制柱状图,展示每年遭受攻击次数最多的前5个受害方,但目前的代码只能展示全局Top5,没法体现不同年份受害目标的变化。

现有代码:

cyber%>%
  filter(Sponsor_sep == "China" & 
         Victims_sep %in% c("United States", "China", "Japan", "South Korea", "India"))%>%
  ggplot() + 
  geom_bar(mapping = aes(x = Year, fill = Victims_sep))

解决方案

要实现按年份展示Top5受害方,需要先对数据做分组统计和筛选,再绘图,具体步骤如下:

  • 按年份+受害方分组,统计每组的攻击次数
  • 针对每个年份,筛选出攻击次数最多的前5个受害方
  • 用处理后的数据绘制并列柱状图,直观对比年度差异

完整代码(含示例数据集):

library(tidyverse)

# 示例数据集
cyber <- tibble::tibble(
  Year = rep(c("2020", "2015", "2010", "2005"), c(73L, 53L, 9L, 4L)),
  Sponsor_sep = rep("China", 139L),
  Victims_sep = c(
    "Japan", "Australia", "Asia", "Australia", "Asia", "China",
    "China", "China", "United States", "United States", "China",
    "Japan", "Australia", "Australia", "Australia", "India", "Kazakhstan",
    "Kyrgyzstan", "Malaysia", "Russia", "Ukraine", "China", "United States",
    "United States", "Vietnam", "United States", "United States",
    "China", "China", "Malaysia", "Vietnam", "Asia", "China", "South Korea",
    "Myanmar", "China", "Myanmar", "United States", "China", "Vatican City",
    "China", "Vatican City", "China", "Japan", "Russia", "South Korea",
    "Japan", "Russia", "South Korea", "Japan", "Russia", "South Korea",
    "China", "International Organisations", "International Organisations",
    "Japan", "China", "United States", "United States", "United States",
    "United States", "United States", "Japan", "Russia", "South Korea",
    "International Organisations", "International Organisations",
    "Mongolia", "Mongolia", "Japan", "Asia", "Asia", "Mongolia",
    "India", "Thailand", "South Korea", "Saudi Arabia", "Malaysia",
    "United States", "Vietnam", "Cambodia", "Indonesia", "Myanmar",
    "China", "Laos", "Singapore", "Phillipines", "India", "Thailand",
    "South Korea", "Saudi Arabia", "Malaysia", "United States", "Vietnam",
    "Cambodia", "Indonesia", "Myanmar", "China", "Laos", "Singapore",
    "Phillipines", "Vietnam", "Vietnam", "Anthem", "United States",
    "United Kingdom", "China", "United States", "United Kingdom",
    "France", "United States", "United Kingdom", "France", "Thailand",
    "United States", "United States", "United States", "United States",
    "Malaysia", "Philippines", "India", "Indonesia", "United States",
    "United States", "United States", "Australia", "United States",
    "Asia", "India", "Australia", "United States", "United States",
    "International Organisations", "United States", "International Organisations",
    "United States", "United Kingdom", "United States", "United Kingdom"
  ),
)

# 数据处理 + 可视化
cyber %>%
  filter(Sponsor_sep == "China") %>%
  group_by(Year, Victims_sep) %>%
  summarise(attack_count = n(), .groups = "drop") %>%
  group_by(Year) %>%
  slice_max(order_by = attack_count, n = 5) %>%
  ggplot(aes(x = Year, y = attack_count, fill = Victims_sep)) +
  geom_col(position = "dodge") +
  labs(title = "每年遭受中国发起网络攻击次数最多的前5个受害方",
       x = "年份",
       y = "攻击次数",
       fill = "受害方") +
  theme_minimal()

代码关键说明

  • group_by(Year, Victims_sep) %>% summarise(attack_count = n()):统计每年每个受害方的攻击次数
  • slice_max(order_by = attack_count, n = 5):按年份筛选出攻击次数Top5的受害方
  • geom_col(position = "dodge"):用预统计好的数值绘制并列柱状图,避免geom_bar自动计数的重复操作,同时让同一年份的不同受害方柱子并列展示,便于对比

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 03:05:26