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

如何在ggplot中基于类别名称设置条件化尺寸比例尺?

按类别设置条件化尺寸比例尺的解决方案

可以实现,核心思路是先对不同类别的数值做独立归一化,再将归一化后的值映射到各自的尺寸范围,以此避免大数量级数值掩盖小数值的差异。

修改后的代码

library(tidyverse)

test_df = data.frame(lg_chr = c(100000, 150000, 190000),
                     mid_chr = c(50, 90, 70),
                     sm_chr = c(15, 10, 5), 
                     names = c("location_1", "location_2", "location_3"))

# 重新格式化数据并按类别归一化数值
test_df_long <- test_df %>% 
  pivot_longer(!names, names_to = "category", values_to = "value") %>%
  group_by(category) %>%
  # 对每个类别的value做0-1归一化
  mutate(norm_value = (value - min(value)) / (max(value) - min(value))) %>%
  ungroup() %>%
  # 按类别设置对应的尺寸范围,可自定义每个类别的最小/最大尺寸
  mutate(size_scaled = case_when(
    category == "lg_chr" ~ norm_value * (50 - 20) + 20,  # Lg_chr用20-50的尺寸范围
    category == "mid_chr" ~ norm_value * (30 - 10) + 10, # Mid_chr用10-30的尺寸范围
    category == "sm_chr" ~ norm_value * (20 - 5) + 5     # Sm_chr用5-20的尺寸范围
  ))

# 绘制图形
ggplot(test_df_long,
       aes(x = str_to_title(category), 
           y = str_to_title(names),
           colour = str_to_title(names),
           size = size_scaled)) +
  geom_point() +
  geom_text(aes(label = value), 
            colour = "white", 
            size = 3) +
  scale_x_discrete(position = "top") +
  # 直接使用手动计算好的尺寸值
  scale_size_identity() + 
  scale_color_manual(values = c("blue", "red", "orange"))  +
  labs(x = NULL, y = NULL) +
  theme(legend.position = "none",
        panel.background = element_blank(),
        panel.grid = element_blank(),
        axis.ticks = element_blank())

关键说明

  • 先通过group_by(category)对每个性状类别单独做归一化,确保每个类别内的数值都映射到0-1区间,消除数量级差异的影响。
  • 用case_when为每个类别指定独立的尺寸范围,你可以根据可视化需求自由调整各区间的数值。
  • 最后用scale_size_identity()让ggplot直接使用我们计算好的size_scaled值,而非自动映射,以此实现不同类别用不同的尺寸比例尺。

处理后,Location_3的Mid_chr(70)和Sm_chr(5)的气泡大小差异会清晰可见,同时保留每个类别内部数值的相对大小关系。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 21:25:13