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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 09:30:54