如何在R中绘制x轴值无序、按指定列分组且无需额外包的统计图
实现思路
你遇到的x轴无序问题是因为直接用b列作为x坐标时,不同a分组的b值存在穿插重叠,导致同组数据点分散。我们可以通过自定义连续x坐标、手动映射b值为x轴标签的方式解决,全程使用R基础绘图函数,无需安装额外包:
# 原始数据 a <- c(1,1,1,1,1,1,1, 2,2,2,2,2,2,2, 3,3,3,3,3,3,3) b <- c(1,4,5,7,8,10,13, 5,7,10,11,14,17,23, 3,7,11,16,19,26,29) d <- c(.4,.15,.76,.07,.18,.11,.12, .23,.45,.25,.11,.16,.2,.5, .48,.9,.13,.75,.4,.98,.3) df <- data.frame("a" = a, "b" = b, "d" = d) # 步骤1:按a分组、组内按b排序,保证同组数据连续排列 df_sorted <- df[order(df$a, df$b), ] # 生成连续的x坐标,确保同组点相邻 df_sorted$x_pos <- 1:nrow(df_sorted) # 步骤2:绘图,先隐藏默认x轴 plot(df_sorted$x_pos, df_sorted$d, col = df_sorted$a, # 不同分组用不同颜色区分 pch = 16, # 实心圆点样式 xlab = "b", ylab = "d", main = "按a分组的b-d散点图", xaxt = "n") # 关闭默认x轴,后续自定义 # 步骤3:自定义x轴,标签为b的实际取值 axis(side = 1, at = df_sorted$x_pos, labels = df_sorted$b, las = 2) # las=2让标签竖排避免重叠 # 可选:添加分组分隔虚线,更易区分不同a组 group_sep <- cumsum(table(df_sorted$a)) abline(v = group_sep[-length(group_sep)] + 0.5, lty = 2, col = "gray") # 可选:添加图例 legend("topright", legend = paste0("a=", unique(df_sorted$a)), col = unique(df_sorted$a), pch = 16)
运行上述代码后,所有同a组的点会连续排列在x轴上,不会和其他组的点穿插,x轴标签展示的是b列的实际值,不会出现无序波动的问题。如果不需要区分颜色、分隔线或者图例,删掉对应代码即可。
内容的提问来源于stack exchange,提问作者Eva
相关产品推荐
相关产品推荐

