You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言ggridges脊线图x轴对齐及间距优化技术问询

解决ggridges脊线图横向排列时x轴不对齐、间距过大的问题

问题概述

使用ggridges包的stat_density_ridges()绘制纬度、经度两幅脊线图,单独显示正常,但通过cowplot::plot_grid()横向排列时,出现x轴未对齐且图间距过大的问题,调整bandwidth参数无法解决。

原代码

#load the necessary libraries
library(readr)
library(ggplot2)
library(ggridges)
library(cowplot)
library(RColorBrewer)

#load the data into a data.frame object
data <- as.data.frame(read_csv(file.choose()))
#View(data)

#calculate min and max latitude and longitude
minlat <- min(data$lat)
maxlat = max(data$lat)
minlon <- min(data$lon)
maxlon = max(data$lon)

#define the color palette to match the number of groups in the dataset
nb.cols <- 18
mycolors <- colorRampPalette(brewer.pal(9, "YlGnBu"))(nb.cols)

#make the latitude ridgeplot
r.plot.lat <- 
  ggplot(data, aes(x = lat, y = species_group, fill = species_group)) +
  stat_density_ridges(
    alpha = 0.75,
    scale = 5,
    panel_scaling = T,
    size = 0.6,
    linetype = 1,
    colour = "darkgrey",
    quantile_lines = F,
    rel_min_height = 0.01
  ) +
  theme_ridges(font_size = 18) +
  theme(legend.position = "none") +
  xlab("Latitude") +
  ylab("") +
  scale_fill_manual(values = mycolors) +
  scale_x_discrete(limits=seq(round(minlat,0),round(maxlat,0), 2))

r.plot.lat

#make the longitude ridgeplot
r.plot.lon <- 
  ggplot(data, aes(x = lon, y = species_group, fill = species_group)) +
  stat_density_ridges(
    alpha = 0.75,
    scale = 5,
    panel_scaling = T,
    size = 0.6,
    linetype = 1,
    colour = "darkgrey",
    quantile_lines = F,
    rel_min_height = 0.01
  ) +
   theme_ridges(font_size = 18) +
  theme(legend.position = "none") +
  xlab("Longitude") +
  ylab("")+ 
  theme(axis.text.y=element_blank()) +
  scale_fill_manual(values = mycolors) +
  scale_x_discrete(limits=seq(round(minlon,1),round(maxlon,1), 5))

r.plot.lon

#arrange the plots horizontally
plot_grid(r.plot.lat, NULL, r.plot.lon, align = "hv", labels=c("AUTO"), rel_widths = c(3, 0, 3), nrow=1)

补充数据集

structure(list(species_group = c("Species_1", "Species_2", "Species_3", 
"Species_4", "Species_5", "Species_2", "Species_6", "Species_7", 
"Species_2", "Species_2", "Species_8", "Species_9", "Species_8", 
"Species_9", "Species_8", "Species_10", "Species_2", "Species_6", 
"Species_3", "Species_1", "Species_1", "Species_1", "Species_10", 
"Species_8", "Species_2", "Species_2", "Species_11", "Species_2", 
"Species_2", "Species_3", "Species_3", "Species_2", "Species_2", 
"Species_1", "Species_5", "Species_6", "Species_3", "Species_11", 
"Species_5", "Species_8", "Species_2", "Species_2", "Species_8", 
"Species_2", "Species_11", "Species_12", "Species_9", "Species_3", 
"Species_5", "Species_13", "Species_11", "Species_9", "Species_3", 
"Species_2", "Species_1", "Species_5", "Species_1", "Species_3", 
"Species_7", "Species_3"), lat = c(39.29652333333, 38.69591833333, 
43.78736, 42.88574333333, 38.51973, 40.06572, 37.36825, 41.06519666667, 
38.18816166667, 36.31976333333, 42.37949166667, 38.66838666667, 
40.72673833333, 36.75656833333, 40.47298333333, 41.720205, 36.14439333333, 
36.64385666667, 35.40855333333, 40.5198, 42.94889333333, 35.99670666667, 
39.967185, 39.37684333333, 39.68108666667, 35.84022166667, 39.45906833333, 
38.6217, 36.79680166667, 39.819615, 36.36867666667, 40.399535, 
36.28853, 42.11886, 40.43070833333, 39.200125, 36.90197, 37.47650833333, 
38.10325666667, 41.64378333333, 34.68400166667, 40.42848333333, 
38.52368166667, 36.15304166667, 36.88089333333, 38.7511, 37.15612666667, 
41.83358833333, 39.90101833333, 39.90281, 36.207415, 44.05422166667, 
44.02940666667, 36.873425, 39.91606166667, 42.93375166667, 39.68787833333, 
38.57978166667, 39.72445333333, 38.77966), lon = c(5.92169333333, 
10.60350166667, 9.29786666667, 7.91347833333, 17.63931166667, 
3.12386166667, 23.40353, 12.51722833333, 11.13067333333, -6.91365, 
15.645445, 10.63217166667, 1.70525666667, -1.71539666667, 1.47485833333, 
3.81735666667, -2.61197833333, -7.662125, 12.72044666667, 5.24996, 
10.23093833333, -5.369945, 17.42619666667, 4.91467166667, 1.518235, 
-6.721575, 0.70451333333, 19.47572333333, -1.51764666667, 17.444935, 
-6.83558166667, 6.89818, -6.96372, 6.03615833333, 3.20266, 0.79276166667, 
-0.75958833333, 2.97557333333, 1.92862666667, 19.300375, 29.77435166667, 
6.52557, 19.43436333333, -4.59611666667, 0.77969, 2.05171833333, 
-0.81246833333, 7.34824, 1.64478333333, 11.36721, -3.84277166667, 
8.53026833333, 9.25958, 0.78068, 1.62469, 3.64922666667, 0.81624166667, 
17.63248166667, 10.09109666667, 10.969315), type = c("groups", 
"groups", "species", "species", "groups", "groups", "species", 
"groups", "groups", "groups", "groups", "groups", "groups", "groups", 
"groups", "groups", "groups", "species", "species", "groups", 
"groups", "groups", "groups", "groups", "groups", "groups", "groups", 
"groups", "groups", "species", "species", "groups", "groups", 
"groups", "groups", "species", "species", "groups", "groups", 
"groups", "groups", "groups", "groups", "groups", "groups", "groups", 
"groups", "species", "groups", "species", "groups", "groups", 
"species", "groups", "groups", "groups", "groups", "species", 
"groups", "species")), row.names = c(NA, -60L), class = "data.frame")

解决方案

1. 修复x轴对齐问题

原代码错误地将连续型经纬度变量用scale_x_discrete()处理,导致x轴刻度逻辑混乱,引发对齐问题。需替换为scale_x_continuous(),通过breaks参数指定刻度:

  • 纬度图x轴修改:
scale_x_continuous(breaks = seq(round(minlat,0), round(maxlat,0), 2))
  • 经度图x轴修改:
scale_x_continuous(breaks = seq(round(minlon,1), round(maxlon,1), 5))

2. 缩小图间距

原plot_grid()中加入NULL占位并设置rel_widths = c(3, 0, 3)是间距过大的直接原因,移除多余参数并直接排列两幅图:

plot_grid(r.plot.lat, r.plot.lon, align = "hv", labels = c("AUTO"), nrow = 1)

如需微调间距,可添加gap参数,例如gap = unit(0.3, "cm")。

3. 统一y轴高度

经度图隐藏y轴文本后,可进一步隐藏y轴刻度线,确保两幅图面板高度一致:

theme(axis.text.y = element_blank(), axis.ticks.y = element_blank())

修正后完整代码

# 加载所需包
library(readr)
library(ggplot2)
library(ggridges)
library(cowplot)
library(RColorBrewer)

# 使用提供的示例数据集
data <- structure(list(species_group = c("Species_1", "Species_2", "Species_3", 
"Species_4", "Species_5", "Species_2", "Species_6", "Species_7", 
"Species_2", "Species_2", "Species_8", "Species_9", "Species_8", 
"Species_9", "Species_8", "Species_10", "Species_2", "Species_6", 
"Species_3", "Species_1", "Species_1", "Species_1", "Species_10", 
"Species_8", "Species_2", "Species_2", "Species_11", "Species_2", 
"Species_2", "Species_3", "Species_3", "Species_2", "Species_2", 
"Species_1", "Species_5", "Species_6", "Species_3", "Species_11", 
"Species_5", "Species_8", "Species_2", "Species_2", "Species_8", 
"Species_2", "Species_11", "Species_12", "Species_9", "Species_3", 
"Species_5", "Species_13", "Species_11", "Species_9", "Species_3", 
"Species_2", "Species_1", "Species_5", "Species_1", "Species_3", 
"Species_7", "Species_3"), lat = c(39.29652333333, 38.69591833333, 
43.78736, 42.88574333333, 38.51973, 40.06572, 37.36825, 41.06519666667, 
38.18816166667, 36.31976333333, 42.37949166667, 38.66838666667, 
40.72673833333, 36.75656833333, 40.47298333333, 41.720205, 36.14439333333, 
36.64385666667, 35.40855333333, 40.5198, 42.94889333333, 35.99670666667, 
39.967185, 39.37684333333, 39.68108666667, 35.84022166667, 39.45906833333, 
38.6217, 36.79680166667, 39.819615, 36.36867666667, 40.399535, 
36.2
相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 15:47:10