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

geom_col绘制对数轴柱状图时布局异常的问题求助

问题描述

我有如下数据集:

library(tidyverse)
library(scales)

meta<- structure(list(valid_name = c("Katsuwonus pelamis", "Thunnus albacares", 
"Thunnus obesus", "Xiphias gladius", "Istiophorus platypterus", 
"Euthynnus affinis", "Coryphaena hippurus", "Acanthocybium solandri", 
"Prionace glauca", "Istiompax indica", "Thunnus alalunga", "Elagatis bipinnulata", 
"Aphareus rutilans", "Isurus oxyrinchus", "Lethrinus microdon", 
"Epinephelus chlorostigma", "Variola louti", "Kajikia audax", 
"Lutjanus argentimaculatus", "Thunnus tonggol", "Lethrinus nebulosus", 
"Lethrinus mahsena", "Scarus ghobban", "Carcharhinus falciformis", 
"Ruvettus pretiosus", "Hexanchus griseus", "Carcharhinus longimanus", 
"Scomberomorus commerson", "Alopias vulpinus", "Sphyrna zygaena", 
"Carcharhinus amblyrhynchos", "Tetrapturus angustirostris", "Auxis thazard", 
"Thunnus maccoyii", "Carcharhinus limbatus", "Lepidocybium flavobrunneum"
), catch_sum_t = c(67611.399067582, 41231.338976487, 7521.951274017, 
3372.17835057, 3125.992929547, 2774.303351886, 2469.5067046969, 
1929.1503508411, 1415.044600755, 890.4079532428, 491.102370364, 
382, 304, 218.977768838, 176, 130, 89, 88.159658003, 73, 59.134772927, 
58, 54, 46, 9.635956749, 0.2936755491, 0.2561460114, 0.1091181203, 
0.06608934, 0.0466742506, 0.0038898787, 0.002847962, 0.0028091134, 
0.002452496, 0.001190259, 0.000695997, 0.0004155168), DemersPelag = c("pelagic-oceanic", 
"pelagic-oceanic", "pelagic-oceanic", "pelagic-oceanic", "pelagic-oceanic", 
"pelagic-neritic", "pelagic-neritic", "pelagic-oceanic", "pelagic-oceanic", 
"pelagic-oceanic", "pelagic-oceanic", "reef-associated", "reef-associated", 
"pelagic-oceanic", "reef-associated", "reef-associated", "reef-associated", 
"pelagic-oceanic", "reef-associated", "pelagic-neritic", "reef-associated", 
"reef-associated", "reef-associated", "reef-associated", "benthopelagic", 
"bathydemersal", "pelagic-oceanic", "pelagic-neritic", "pelagic-oceanic", 
"pelagic-oceanic", "reef-associated", "pelagic-oceanic", "pelagic-neritic", 
"pelagic-oceanic", "reef-associated", "benthopelagic")), row.names = c(NA, 
-36L), class = c("tbl_df", "tbl", "data.frame"))

使用以下代码绘制柱状图:

ggplot(meta) +
  geom_col(aes(reorder(valid_name, catch_sum_t, "sum"),catch_sum_t, fill=DemersPelag))+
  scale_y_log10(labels = scales::label_comma())+
  coord_flip()

绘制出的柱状条布局怪异,且未以零为中心,希望得到正常的柱状图效果。

解决方案

问题核心是对数坐标轴的局限性:对数函数无法处理0值,且极小值在对数尺度下会被过度拉伸,导致柱子视觉上错位。同时reorder()的用法可以简化优化。

修复方案一:使用伪对数坐标轴

伪对数转换可以兼容0和极小值,同时保留对数尺度对大数据的压缩效果,让所有柱子都从底部起始:

ggplot(meta) +
  geom_col(aes(x = reorder(valid_name, catch_sum_t), y = catch_sum_t, fill = DemersPelag)) +
  scale_y_continuous(trans = pseudo_log_trans(), labels = scales::label_comma()) +
  coord_flip() +
  labs(x = "物种", y = "总捕获量(t)") # 可选:添加坐标轴标签

修复方案二:过滤极小值后用普通对数轴

如果不需要展示极小值记录,可以先过滤再绘图:

# 过滤捕获量≥1的记录
meta_filtered <- meta %>% filter(catch_sum_t >= 1)

ggplot(meta_filtered) +
  geom_col(aes(x = reorder(valid_name, catch_sum_t), y = catch_sum_t, fill = DemersPelag)) +
  scale_y_log10(labels = scales::label_comma()) +
  coord_flip()

内容的提问来源于stack exchange,提问作者yuliaUU

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 04:03:11