在ggplot中如何将轴刻度标签映射到数据框指定的标签列?
在数据中已经存在指定标签列的前提下,有没有更简便的方法可以避免单独创建命名向量?
解答
ggplot2的aes()机制是用来将数据列映射到逐观测的图形属性(比如坐标位置、颜色、大小等),而坐标轴刻度标签属于标度的全局配置项,不属于逐观测图形属性,因此不支持直接在scale_*函数内用aes(label = ...)的写法。
不需要单独创建命名向量的简便实现方法有两种:
方法1:映射阶段直接指定因子标签
直接在aes()中将x/y变量转换为因子,同时指定levels为原始编码列、labels为展示标签列,不需要后续修改标度参数:
library(ggplot2) set.seed(2021) my_df <- data.frame( name = c("animal_1", "animal_2", "animal_3"), value = runif(3), label = c("dog", "cat", "zebra") ) ggplot(my_df, aes(x = factor(name, levels = name, labels = label), y = value)) + geom_bar(stat = "identity") + labs(x = "name") # 可选:保留x轴原始名称,不会显示为factor表达式
运行后会直接生成x轴刻度为dog/cat/zebra的图表,和用命名向量得到的效果完全一致。
方法2:标度参数内直接做标签匹配
如果需要保留x轴原始的name值做其他统计或交互操作,不想修改原始映射,可以在scale_x_discrete的labels参数中直接做值匹配,不需要提前存储命名向量:
p <- ggplot(my_df, aes(x = name, y = value)) + geom_bar(stat = "identity") p + scale_x_discrete(labels = ~ my_df$label[match(.x, my_df$name)])
这里的.x是scale函数自动传入的原始刻度值向量,用match函数直接匹配对应标签,一行即可完成配置。
内容的提问来源于stack exchange,提问作者Emman
相关产品推荐
相关产品推荐

