如何用ggplot2绘制以每世代宝可梦双类型总数为填充的热力图?
宝可梦类型热力图绘制问题解决
问题背景
我有一份可在Kaggle获取的宝可梦数据集,尝试用ggplot2绘制热力图,想要把每个世代中每种宝可梦类型的总数(统计自Type和Other Type两列)作为填充值,但一直没成功。我尝试的代码如下,无法正常运行:
ggplot(pokemon_mod, aes(x= Generation, y= Type, z= (Type, Other.Type)) + geom_tile()
问题分析
你的代码存在两处关键问题:
aes中z参数的写法完全错误,且geom_tile不需要z参数,填充值需通过fill指定,前提是要先统计好各世代-类型的数量。- 核心问题是未将
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
相关产品推荐
相关产品推荐

