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

如何用ggplot2绘制以每世代宝可梦双类型总数为填充的热力图?

宝可梦类型热力图绘制问题解决

问题背景

我有一份可在Kaggle获取的宝可梦数据集,尝试用ggplot2绘制热力图,想要把每个世代中每种宝可梦类型的总数(统计自Type和Other Type两列)作为填充值,但一直没成功。我尝试的代码如下,无法正常运行:

ggplot(pokemon_mod, aes(x= Generation, y= Type, z= (Type, Other.Type)) +
  geom_tile()

问题分析

你的代码存在两处关键问题:

  1. aes中z参数的写法完全错误,且geom_tile不需要z参数,填充值需通过fill指定,前提是要先统计好各世代-类型的数量。
  2. 核心问题是未将Type和Other Type两列整理为统一的长格式数据,无法直接统计每种类型的总数。

解决步骤

1. 加载依赖包并整理数据为长格式

先把双类型列合并为单列,保留世代信息,同时剔除无第二属性的缺失值:

library(tidyr)
library(dplyr)
library(ggplot2)

# 转换为长格式数据
pokemon_long <- pokemon_mod %>%
  select(Generation, Type, Other.Type) %>%
  pivot_longer(cols = c(Type, Other.Type), 
               names_to = "Type_Category", 
               values_to = "Pokemon_Type") %>%
  filter(!is.na(Pokemon_Type))

2. 统计各世代-类型的数量

按世代和类型分组,计算每组的宝可梦数量:

type_counts <- pokemon_long %>%
  group_by(Generation, Pokemon_Type) %>%
  summarise(Count = n(), .groups = "drop")

3. 绘制热力图

用统计好的数据绘制热力图,指定填充值为数量,添加边框和美观的配色:

ggplot(type_counts, aes(x = Generation, y = Pokemon_Type, fill = Count)) +
  geom_tile(color = "white") +
  scale_fill_viridis_c(option = "plasma") +
  labs(title = "各世代宝可梦类型数量热力图",
       x = "世代",
       y = "宝可梦类型",
       fill = "数量") +
  theme_minimal()

补充提示

如果数据集里Other.Type的列名带空格(比如Other Type),记得用反引号包裹列名,例如Other Type。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 21:15:49