如何在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
相关产品推荐
相关产品推荐

