在R语言ggplot中如何设置两个负值作为ylim参数?
问题原因
这个问题是ggplot2中ylim()函数的工作机制和柱状图的绘制逻辑共同导致的:
ylim()本质是scale_y_continuous(limits = ...)的快捷写法,它会直接剔除所有超出设置范围的观测值,而非仅裁剪可视区域geom_bar(stat = "identity")绘制柱状图时,默认以y=0为基线向对应rating值的方向延伸柱子。当你传入的ylim两个值都为负时,基线y=0完全不在你设置的范围内,会被直接标记为缺失值,柱子失去了绘制的基准,最终图表全空白。- 其他场景不会空白的原因:如果ylim包含0、或范围全为正值,基线要么在可视范围内、要么在可视范围下方,正值柱子从0向上延伸的部分只要和ylim范围有交集就可以正常显示。

解决方法
不要用ylim()设置y轴可视范围,改用coord_cartesian()的ylim参数,这个参数只会裁剪坐标系的可视区域,不会剔除任何原始数据,基线y=0仍然会作为柱子的绘制基准,负值范围的柱子也能正常显示。
修改后的示例代码如下:
a <- -10 b <- -1 df2 <- data.frame(food = c("mac", "bread", "hot dog", "t-rav", "gogurt"), rating = c(-8, -4, 2, -3, 5)) ggplot(df2, aes(food, rating)) + geom_bar(stat = 'identity') + # 替换原来的ylim(a,b)为下面这行 coord_cartesian(ylim = c(a, b))
运行上述代码就可以正常显示y轴范围-10到-1之间的柱子部分。
内容的提问来源于stack exchange,提问作者gturns
相关产品推荐
相关产品推荐

