在ggplot2中用str_wrap包裹y轴标签时保留李克特数据的因子顺序
解决likert热力图y轴标签换行同时保留原始因子顺序的问题
问题核心是:单独用scale_y_discrete(labels = str_wrap)时,ggplot会自动把标签转成字符型并按字母排序,打乱了原因子的顺序。要解决这个问题,只需在scale_y_discrete里同时指定breaks和labels参数:
breaks:设为原始因子的水平,强制轴刻度保留原顺序labels:用str_wrap处理标签实现换行
完整可运行代码
library(likert) library(ggplot2) library(stringr) library(dplyr) # 提取原始因子水平,用于固定y轴顺序 original_cut_levels <- levels(diamonds$cut) diamonds %>% select(cut) %>% as.data.frame() %>% likert() %>% plot(type = "heat") + scale_y_discrete( breaks = original_cut_levels, labels = function(x) str_wrap(x, width = 5) )
原理说明
只设置labels时,ggplot会忽略原因子的顺序,默认按字符字母顺序排列刻度。而breaks参数的作用是定义y轴刻度的顺序和取值,指定为原始因子水平后就能锁定顺序;labels只是给每个刻度替换成换行后的文本,不会改变顺序。
这样处理后,y轴标签会按Fair → Good → Very Good → Premium → Ideal的原始因子顺序排列,同时每个标签会按指定宽度自动换行。
内容的提问来源于stack exchange,提问作者TarJae
相关产品推荐
相关产品推荐

