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

如何在ggplot带“超限”条形的离散轴分布图中添加中位数垂直线?

解决离散x轴添加中位数垂直线的问题

方法一:基于现有离散轴,手动定位垂直线位置

离散x轴的每个条形对应一个从1开始的索引,只需找到中位数所在区间对应的索引位置,即可用geom_vline添加垂直线。

修改后的完整代码:

data <- data.frame(value = runif(1000, min = 0, max = 1000))
data$value <- round(data$value, digits = 0)

median_elapsed <- median(data$value)

bin_breaks <- c(seq(0, 
                    median_elapsed, 
                    length.out = 11), 
                Inf)

bin_labels <- c(seq(0, 
                    median_elapsed - (median_elapsed / 10), 
                    length.out = 10), 
                paste0("> ", median_elapsed)) 

data$bins <- cut(data$value, 
                 breaks = bin_breaks, 
                 labels = bin_labels, 
                 include.lowest = TRUE, 
                 right = FALSE) 

get_home_data_percent <- data %>%
  group_by(bins) %>%
  summarize(count = n()) %>%
  mutate(percentage = count / sum(count) * 100)

# 定位中位数所在区间的离散轴位置
median_bin <- cut(median_elapsed, breaks = bin_breaks, labels = bin_labels, include.lowest = TRUE, right = FALSE)
median_pos <- which(levels(get_home_data_percent$bins) == median_bin)

ggplot(get_home_data_percent, aes(x = bins, y = percentage)) +
  geom_bar(stat = "identity", just = 0) +
  scale_x_discrete(drop = FALSE) +
  # 添加红色虚线作为中位数标记
  geom_vline(xintercept = median_pos, color = "red", linetype = "dashed") +
  labs(x = "Elapsed Time", 
       y = "Percentage", 
       title = "Histogram of Elapsed Time") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

方法二:改用连续x轴,处理“超出限值”区间

将最后一个区间的上限从Inf替换为比数据最大值大的固定值(比如max(data$value) + 100),保持x轴连续,同时自定义刻度标签显示> median_elapsed,这样可直接用中位数数值添加垂直线。

完整代码示例:

data <- data.frame(value = runif(1000, min = 0, max = 1000))
data$value <- round(data$value, digits = 0)

median_elapsed <- median(data$value)
max_val <- max(data$value)

# 替换Inf为固定上限,避免x轴无限延伸
bin_breaks <- c(seq(0, median_elapsed, length.out = 11), max_val + 100)
bin_labels <- c(seq(0, median_elapsed - (median_elapsed / 10), length.out = 10), paste0("> ", median_elapsed))

data$bins <- cut(data$value, 
                 breaks = bin_breaks, 
                 labels = bin_labels, 
                 include.lowest = TRUE, 
                 right = FALSE)

get_home_data_percent <- data %>%
  group_by(bins) %>%
  summarize(count = n(),
            # 计算每个区间的中点作为连续x轴的位置
            x_pos = (bin_breaks[cur_group_id()] + bin_breaks[cur_group_id() + 1]) / 2) %>%
  mutate(percentage = count / sum(count) * 100)

ggplot(get_home_data_percent, aes(x = x_pos, y = percentage, width = median_elapsed/10)) +
  geom_bar(stat = "identity") +
  # 自定义x轴刻度,匹配原离散标签
  scale_x_continuous(breaks = get_home_data_percent$x_pos, labels = bin_labels) +
  # 直接用中位数数值添加垂直线
  geom_vline(xintercept = median_elapsed, color = "red", linetype = "dashed") +
  labs(x = "Elapsed Time", 
       y = "Percentage", 
       title = "Histogram of Elapsed Time") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

两种方法均可满足需求:方法一延续你现有的离散轴逻辑,仅需添加定位垂直线的步骤;方法二切换到连续轴,更贴合传统直方图逻辑,同时完美处理“超出限值”的区间显示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 00:07:12