R语言likert包仅含正向值的Likert图未沿Y轴水平居中
问题描述
使用R语言的likert包绘制Likert图时,若目标变量为仅含正向响应的有序因子,生成的条形图会固定在绘图区域底部,无法沿Y轴(上下方向)居中。
现象对比
- 未居中的Likert图:

- 包含负向响应等级时的正常居中效果:

- 问题细节标注:蓝线为Y轴水平中心线,条形图位于下方,上方存在大量空白区域(黄色高亮):

可复现代码
# 加载likert包 library(likert) # 创建数据框 ben_DF <- data.frame(Farm = factor(c("Small increase in crop farmland", "Small increase in crop farmland", "Small increase in crop farmland", "Large increase in crop farmland", "Small increase in crop farmland", "Large increase in crop farmland", "Small increase in crop farmland", "Small increase in crop farmland"), levels = c("Large decrease in crop farmland", "Small decrease in crop farmland", "No change in crop farmland", "Small increase in crop farmland", "Large increase in crop farmland"), ordered = TRUE)) # 绘制Likert图 plot(likert(ben_DF)) + theme(legend.position = "right", legend.direction = "vertical")
解决方法
由于likert包的绘图基于ggplot2实现,当Y轴仅包含单个类别时,默认离散轴会将条形固定在底部。可通过以下几种方式调整Y轴设置,实现条形垂直居中:
方法1:调整Y轴扩展空白
通过scale_y_discrete的expand参数控制Y轴上下的空白区域,让条形居中:
library(likert) library(ggplot2) ben_DF <- data.frame(Farm = factor(c("Small increase in crop farmland", "Small increase in crop farmland", "Small increase in crop farmland", "Large increase in crop farmland", "Small increase in crop farmland", "Large increase in crop farmland", "Small increase in crop farmland", "Small increase in crop farmland"), levels = c("Large decrease in crop farmland", "Small decrease in crop farmland", "No change in crop farmland", "Small increase in crop farmland", "Large increase in crop farmland"), ordered = TRUE)) # 绘制并调整Y轴空白 plot(likert(ben_DF)) + theme(legend.position = "right", legend.direction = "vertical") + scale_y_discrete(expand = expansion(add = c(2, 2))) # 可根据绘图大小调整add的数值
方法2:手动设置Y轴范围
使用coord_cartesian直接指定Y轴上下限,将单个类别置于中间位置:
plot(likert(ben_DF)) + theme(legend.position = "right", legend.direction = "vertical") + coord_cartesian(ylim = c(0.5, 1.5)) # 原类别Y轴位置为1,上下各扩展0.5实现居中
方法3:自定义绘图数据(进阶)
提取likert对象的绘图数据,手动调整Y轴坐标,实现更灵活的布局控制:
likert_obj <- likert(ben_DF) plot_data <- likert_obj$results plot_data$y <- 1.5 # 将条形的Y轴位置设为中间值 ggplot(plot_data, aes(x = value, y = y, fill = response)) + geom_col(position = "stack") + scale_x_continuous(limits = c(-100, 100)) + # 保持Likert图标准X轴范围 scale_y_continuous(limits = c(0, 3)) + # 设置Y轴范围让条形居中 theme(legend.position = "right", legend.direction = "vertical") + labs(y = "", x = "百分比")
内容的提问来源于stack exchange,提问作者pienkowski
相关产品推荐
相关产品推荐

