R语言ggplot2自定义双轴柱状图:排序、柱色与数值标签设置
实现方法
针对提出的三项自定义需求,直接对原有代码做对应调整即可,完整可运行代码如下:
library(tidyverse) # 原始数据 df <- data.frame (model = c("A", "B", "C","D","E","F"), share = c(12,20,15,9,60,20), sale = c(16,25,18,14,67,28), cost = c(14,19,28,24,57,28)) # -------------------------- # 需求1:按cost从右到左降序排列柱体 # -------------------------- df <- df %>% arrange(desc(cost)) %>% # 先按cost降序排序数据行 mutate(model = factor(model, levels = rev(model))) # 反转因子水平,实现大值在x轴最右侧 # 转换长表,新增唯一柱子ID用于单独设置填充色 df_long <- df %>% pivot_longer(cols = -model) %>% mutate(bar_id = paste(model, name, sep = "_")) # -------------------------- # 需求2:手动指定每根柱子填充色,可按需替换对应色值 # -------------------------- custom_fill <- c( "E_share" = "#2c5aa0", "E_sale" = "#636363", "C_share" = "#ff8c1a", "C_sale" = "#32a852", "F_share" = "#d92121", "F_sale" = "#804fb3", "D_share" = "#805442", "D_sale" = "#e066b8", "B_share" = "#a6a626", "B_sale" = "#17a2b8", "A_share" = "#f0b429", "A_sale" = "#4caf50" ) ggplot(df_long, aes(x = model, y= value, label=value))+ geom_col( data = filter(df_long, name != "cost"), aes(fill = bar_id), # 填充色映射到单根柱子的唯一ID position = position_dodge(width = 0.8), width = 0.7 )+ # 应用自定义颜色+调整图例仅显示share、sale两个分类 scale_fill_manual( values = custom_fill, breaks = c("A_share", "A_sale"), labels = c("share", "sale") )+ geom_line( data = filter(df_long, name == "cost"), aes(group = 1), color = "red", size = 0.8 )+ geom_point( data = filter(df_long, name == "cost"), color = "red", size = 2.5 )+ # -------------------------- # 需求3:带边框的cost数值标注,替换原geom_text # -------------------------- geom_label( data = filter(df_long, name == "cost"), hjust=0.5, vjust=-0.6, label.size = 0.3, # 控制边框粗细 size = 3.2 )+ scale_y_continuous( name = "Sale and Share", sec.axis = sec_axis(~., name ="Cost") )+ theme_minimal()+ theme(legend.title=element_blank())
关键逻辑说明
- 柱体排序:ggplot分类轴的显示顺序由因子水平决定,先按cost降序排列数据后反转因子水平,即可实现cost最高的类别在x轴最右端,向左数值依次降低
- 单柱自定义颜色:原有代码将填充色映射到
name字段(仅含share/sale两个值),只能统一给两类柱子设色;新增bar_id字段给每根柱子生成唯一标识,将填充色映射到该字段后,即可在scale_fill_manual中为每根柱子单独指定颜色,同时通过breaks参数控制图例仅显示share、sale两个条目,不会出现冗余图例 - 带边框标注:直接使用ggplot内置的
geom_label几何对象,默认生成带白色背景、黑色边框的文本标注,通过label.size调整边框粗细即可,无需额外拼接几何元素
内容的提问来源于stack exchange,提问作者user18937485
相关产品推荐
相关产品推荐

