R中plot函数type="h"设大lwd时小数值条形高度失真问题
解决Base R中
type="h"宽条形高度失真问题 问题根源
使用plot(..., type="h")时,lwd参数控制的是垂直线的线条宽度(像素单位)。当线条宽度过大时,垂直线的顶端会向上下扩展,视觉上的条形高度会包含线条宽度的一半。对于极小的概率值(比如P(X=8)=0.00145),其实际对应的像素高度可能远小于线条宽度的一半,此时视觉上的高度就会被强制拉到线条宽度对应的高度,导致严重失真。
解决方案
方法1:改用barplot()绘制(推荐)
barplot()是专门的条形图函数,宽度设置不会干扰高度的准确性,同时还能更灵活地调整条形样式:
# 计算完整的二项分布概率(包含X=0到X=10) probs <- dbinom(0:10, size = 10, prob = 0.3) # 绘制条形图 barplot( probs, names.arg = 0:10, # 设置X轴标签为取值0-10 width = 0.8, # 条形宽度 space = 0.2, # 条形间距 ylim = c(0, max(probs)*1.1), # 调整Y轴范围,避免顶部被截断 col = "steelblue", # 条形颜色 main = "Binomial(10, 0.3) 概率分布", ylab = "概率" )
注:原代码只计算了1:10的概率,漏掉了X=0的取值(P(X=0)=0.0282),使用barplot时建议包含完整的分布取值。
方法2:限制lwd参数大小(仅适用于type="h")
如果一定要用plot(type="h"),需确保lwd的数值不要过大,使得线条宽度对应的像素数小于最小概率值对应的像素高度。例如将lwd调整为较小的值:
probs <- dbinom(0:10, 10, 0.3) plot( probs, type = "h", lend = 2, lwd = 5, # 减小线条宽度 yaxs = "i", xaxt = "n", # 自定义X轴标签 main = "Binomial(10, 0.3) 概率分布", ylab = "概率" ) axis(1, at = 1:11, labels = 0:10) # 设置X轴为0-10
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

