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

如何通过geom_tile制作环形图?解决离散刻度赋值报错问题

解决离散y轴用ylim报错并实现环形注释图

你遇到的报错核心原因很明确:ylim() 是用来设置连续数值型坐标轴范围的函数,但你的y轴变量 variable 是离散分类类型(对应col1-col4四个类别),类型不匹配所以触发了Discrete value supplied to continuous scale错误。

要实现环形效果,我们不需要用ylim(),而是通过调整离散y轴的显示空间或者添加占位类别来实现,下面给你两种可行的方案:

方案1:通过expand参数增加底部空白,快速实现环形

这个方法最简单,直接在scale_y_discrete()里设置expand参数,给y轴底部添加足够的空白空间,让tile远离中心形成环形:

library(ggplot2)
library(reshape2)

# 你的原始数据处理
examp = data.frame(rep(c("A","B"),each=12), rep(c("C","D"),times=12), rep(c("E","F","G"),each=8), rep(c("E","H","G"),each=8), 1:24)
colnames(examp) = c("col1", "col2", "col3","col4","person")
examp$person = paste0("per.",examp$person)
examp2 <- melt(examp, id.var = 'person')

# 定义你提到的y_breaks和y_labels(补全你代码中缺失的部分)
y_breaks <- c("col1", "col2", "col3", "col4")
y_labels <- c("Column 1", "Column 2", "Column 3", "Column 4")

ggplot(examp2, aes(x=person,y=variable)) + 
  geom_tile(aes(fill = value), colour = "white")+ 
  scale_y_discrete(breaks = y_breaks, labels = y_labels, 
                   expand = expansion(mult = c(0.8, 0)))  # 关键:调整mult参数,0.8是底部空白比例,按需修改
  coord_polar(start = 0) +  # start=0让环形从正右方开始,可选
  theme(panel.background=element_blank(), 
        axis.title=element_blank(), 
        panel.grid=element_blank(), 
        axis.text.x=element_blank(), 
        axis.ticks=element_blank(), 
        axis.text.y=element_text(size=5))

方案2:添加空白类别占位,更精准控制环形大小

如果需要更精准控制中心空白的大小,可以给y轴添加一个额外的空白类别,不显示它的标签,这样就能固定环形的宽度:

library(ggplot2)
library(reshape2)

# 原始数据处理
examp = data.frame(rep(c("A","B"),each=12), rep(c("C","D"),times=12), rep(c("E","F","G"),each=8), rep(c("E","H","G"),each=8), 1:24)
colnames(examp) = c("col1", "col2", "col3","col4","person")
examp$person = paste0("per.",examp$person)
examp2 <- melt(examp, id.var = 'person')

# 添加空白类别到y轴变量中
examp2$variable <- factor(examp2$variable, levels = c("blank", "col1", "col2", "col3", "col4"))

# 定义breaks和labels,跳过空白类别的显示
y_breaks <- c("col1", "col2", "col3", "col4")
y_labels <- c("Column 1", "Column 2", "Column 3", "Column 4")

ggplot(examp2, aes(x=person,y=variable)) + 
  geom_tile(aes(fill = value), colour = "white")+ 
  scale_y_discrete(breaks = y_breaks, labels = y_labels) +
  coord_polar(start = 0) +
  theme(panel.background=element_blank(), 
        axis.title=element_blank(), 
        panel.grid=element_blank(), 
        axis.text.x=element_blank(), 
        axis.ticks=element_blank(), 
        axis.text.y=element_text(size=5))

这样处理后,你就能得到想要的环形注释图了,两种方案可以根据你的需求选择:方案1适合快速调整,方案2适合精准控制环形的内圈大小。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 22:57:39