ggplot2中因子型X轴的R风格轴样式设置问题求助
嗨,我来帮你理一理这个问题~
首先,先说说你遇到的两个核心问题:X轴不显示,以及添加base_breaks_x后报错。
为什么加base_breaks_x会报错?
base_breaks_x这类函数是专门给连续数值型变量生成刻度的,它内部依赖pretty()这类需要数值输入的函数。而你的TKV是因子类型,哪怕你写factor(PE_plot5$TKV),它还是因子,不是数值,自然就会抛出attempt to apply non-function的错误——因为函数没法对因子做数值处理。
而且对于离散型的X轴(因子),你根本不需要这类自动生成刻度的函数,因为离散轴的刻度就是每个因子水平,只要数据没问题,这些刻度会自动显示出来。
那原代码里X轴为什么不显示?
大概率是因子水平和标签不匹配导致的:你在scale_x_discrete里写了10个标签,但如果PE_plot5$TKV的因子水平数量不是10个,或者水平顺序和标签对应不上,就可能导致X轴刻度不显示。
给你几个排查和解决的步骤:
先检查并规范因子水平
先确认你的TKV因子水平是否正确,运行下面的代码看看:levels(PE_plot5$TKV) table(PE_plot5$TKV)如果水平数量和你要的10个不对应,或者顺序不对,先重新设置因子水平:
PE_plot5$TKV <- factor(PE_plot5$TKV, # 这里填你原始数据里TKV的真实水平值,要和你想要的顺序一致 levels = c("原始水平1", "原始水平2", ..., "原始水平10"), # 直接把标签在这里设置好,后面绘图就不用重复写了 labels = c("0.6 RPM", "0.8 RPM", "1.0 RPM", "5.0 RPM", "10.0 RPM", "15.0 RPM", "20.0 RPM", "25.0 RPM", "40.0 RPM", "60.0 RPM"))修改绘图代码,去掉不必要的参数
调整后的完整代码如下,我做了几个小优化:TKV_Image <- ggplot(PE_plot5, aes(x = TKV, y = TKV_viscosity)) + # 如果Risk_Group已经是因子类型,不用再套as.factor() geom_boxplot(width = 0.7, alpha = 0.8, aes(fill = Risk_Group)) + # 把base_breaks_y放到scale_y_continuous的breaks参数里,更规范 scale_y_continuous(name = "Viscosity (cP)", labels = label_number(accuracy = 0.01), breaks = base_breaks_y(PE_plot5$TKV_viscosity)) + # 因为已经提前设置了因子标签,这里不用再写labels参数了 scale_x_discrete(name = "Shear rate (1/s)") + scale_fill_manual(values = c("#4271AE", "#FF5A5F"), labels = c("Low Risk", "High Risk")) + theme_bw() + theme(axis.text.x = element_text(colour = "grey20", size = 12, angle = 45, hjust = 1), axis.text.y = element_text(colour = "grey20", size = 12, vjust = 0.4), axis.title = element_text(size = 14), legend.title = element_blank(), legend.position = "top", legend.text = element_text(size = 12), panel.border = element_blank(), panel.grid.major = element_blank(), panel.grid.minor = element_blank())额外排查点
如果调整后X轴还是不显示,检查一下PE_plot5里每个TKV水平是否都有数据——如果某个水平没有对应的箱线图数据,ggplot会自动隐藏这个刻度。可以用table(PE_plot5$TKV)查看每个水平的样本数,确认没有空的水平。
这样应该就能解决你的问题啦~
备注:内容来源于stack exchange,提问作者Muhammed Edib Mokresh

