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

如何在R直方图中实现ThinkCell式刻度截断展示稀疏正样本

嘿,这个不平衡分类数据的可视化痛点我太懂了!900个0和50个1的差距确实会让正事件的柱子缩成小斑点,完全看不清。下面给你几个实用的解决方案,既有你想要的类似ThinkCell的刻度截断功能,也有更适合这类数据的可视化思路:

方案1:实现刻度截断效果(用ggbreak包)

R的基础绘图功能没法直接做刻度截断,但ggbreak包专门解决这个问题,能像ThinkCell那样在坐标轴上添加截断标记,同时调整上下段的刻度比例,让小频数的柱子清晰展示。

首先准备你的数据(先修正下原代码的小问题):

a <- data.frame("Changed" = rep(0, 900))
b <- data.frame("Changed" = rep(1, 50))
example <- rbind(a, b) # 直接合并两个数据框即可,无需再嵌套data.frame

然后安装并使用ggbreak绘制截断的条形图(这里用条形图替代直方图更合理,因为你的变量是二元分类):

# 安装包(首次使用时运行)
install.packages("ggbreak")

library(ggplot2)
library(ggbreak)

ggplot(example, aes(x = factor(Changed))) +
  geom_bar(width = 0.5, fill = "#2E86AB") +
  # 在y轴100到800的区间截断,上下段用相同的刻度比例
  scale_y_break(c(100, 800), scales = c(1, 1)) +
  labs(x = "Changed", y = "Frequency", title = "Truncated Bar Plot for Imbalanced Data") +
  theme_minimal()

这段代码会在y轴中间添加波浪线截断标记,下方刻度聚焦0-100区间(刚好能看清50的柱子),上方展示800-900区间,完美兼顾两类数据的展示。

方案2:更合理的可视化替代(避免截断带来的误解)

其实你的Changed是二元分类变量,直方图是为连续变量设计的,用以下几种可视化方式会更直观,也不用依赖截断功能:

带数值标签的条形图

直接在每个柱子上方标注频数,即使0的柱子很高,读者也能一眼看到两类的具体数值:

ggplot(example, aes(x = factor(Changed))) +
  geom_bar(width = 0.5, fill = "#2E86AB") +
  # 自动计算频数并标注在柱子上方
  geom_text(stat = 'count', aes(label = ..count..), vjust = -0.5, size = 4) +
  labs(x = "Changed", y = "Frequency", title = "Bar Plot with Frequency Labels") +
  theme_minimal()

百分比条形图

如果更关注两类的比例关系,可以转换为百分比展示:

library(dplyr)

# 先统计各类别的频数和占比
example_summary <- example %>%
  count(Changed) %>%
  mutate(percent = n / sum(n) * 100)

ggplot(example_summary, aes(x = factor(Changed), y = percent)) +
  geom_bar(stat = "identity", width = 0.5, fill = "#2E86AB") +
  geom_text(aes(label = paste0(round(percent, 1), "%")), vjust = -0.5, size = 4) +
  labs(x = "Changed", y = "Percentage", title = "Percentage Bar Plot for Imbalanced Data") +
  theme_minimal()

克利夫兰点图

这种图完全避免了柱子高度的干扰,用点和数值直接展示频数,非常适合不平衡数据:

ggplot(example_summary, aes(x = n, y = factor(Changed))) +
  geom_point(size = 4, color = "#2E86AB") +
  geom_text(aes(label = n), hjust = -0.5, size = 4) +
  labs(x = "Frequency", y = "Changed", title = "Cleveland Dot Plot for Imbalanced Data") +
  theme_minimal()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:26:09