ggplot geom_bar不显示全部数据子集及透明度失效问题求助
问题与解决方案
一、图表为空的原因
当你使用ggplot(data = chr1[1:4,c(1:3,9,14)]) + geom_bar(aes(x= start,y=V7), stat="identity")绘制图表为空,而前2行正常、添加fill/color后能显示的核心原因如下:
start是连续数值型变量,未指定分组美学时,ggplot会按连续尺度渲染x轴,默认柱子宽度为1。但你的4行数据中start值跨度极大(从858042到5955150),x轴范围被拉得极宽,单个柱子的宽度(1单位)相对于整个轴范围几乎可忽略,因此看起来是空的。- 前2行数据的
start值仅差34,x轴范围极小,柱子宽度1足以显示,所以能正常看到柱状图。 - 添加
fill/color参数后,ggplot会自动按which列分组,此时会自动调整柱子宽度以适配分组,避免被压缩,因此能显示全部柱子。
二、alpha参数不生效的解决方法
你当前的代码中alpha不生效,是因为默认柱子宽度太小,位置相近的柱子无法重叠,透明效果无法显现。无需将start转为factor,只需调整柱子宽度让相邻柱子重叠即可:
ggplot(chr1[1:4,], aes(x=start, y=V7, fill=which, color=which)) + geom_col(alpha=0.2, width=50) + # geom_col等价于geom_bar(stat="identity") theme_minimal()
- 设置
width=50后,前两个start值(差34)的柱子会重叠,透明效果清晰可见;后两个start值同理。 - 若需要更明显的重叠效果,可根据
start的间距进一步调整width参数的数值。
子集数据结构
structure(list(seqnames = c("chr1", "chr1", "chr1", "chr1"), start = c(858042L, 858076L, 5955119L, 5955150L), end = c(858192L, 858155L, 5955238L, 5955257L), V7 = c(22.74576, 8.52652, 10.04841, 7.32666), which = c("sorted", "rep3", "rep3", "sorted")), row.names = c(1707L, 1L, 2L, 1708L), class = "data.frame")
内容的提问来源于stack exchange,提问作者StlCh
相关产品推荐
相关产品推荐

