【问题标题】:How to get a "perfect " Y-axis for hist(nclass=nclass.scott)?如何获得 hist(nclass=nclass.scott) 的“完美” Y 轴?
【发布时间】:2017-05-24 13:28:10
【问题描述】:

有时hist(..., nclass=nclass.scott) 会生成一个直方图,其中最大条形延伸到 y 轴的顶部。你可以试试这个例子几次:

x <- sample(1000000, 500, replace=TRUE)
h <- hist(x,nclass=nclass.scott)
text(x=h$mids, y=h$counts, labels=h$counts, pos=3, col="red")

例如:

有时无法显示最高条上的红色数字,因为它似乎被绘图区域剪裁了。我可以添加ylim=...,但要获得条形的最大高度非常棘手。

即使知道最大高度,ylim=(0, max)也存在max可能会被忽略的问题:例如最大值为527时,则上显示的y轴标签为500,即使指定了ylim=(0, 527) .当使用600 代替时,它可以工作,但是y 轴有点太长了......

如果这不是 R (3.3.3) 的错误,那么什么是优雅(简约)的解决方案?

【问题讨论】:

    标签: r histogram scale


    【解决方案1】:

    我认为您需要在图表中设置 par(xpd= T) 以避免修剪。

    ?par
    

    xpd

    一个逻辑值或 NA。如果为 FALSE,则所有绘图都被剪裁到 绘图区域,如果为 TRUE,则所有绘图都被剪裁到图形区域, 如果不适用,则所有绘图都被裁剪到设备区域。也可以看看 剪辑。

    您可以通过与usr 选项和xpd 合作来做得更好。根据观察,条形图似乎超出了图表范围,但不是条形图超出了图表,而是轴被限制在标签中。因此,要修复标签,我们可以选择使用usr。如果有人想玩margin,也可以使用mar

    library(RColorBrewer)
    par(mfrow=c(1,1),xpd=T,yaxs="i")
    x <- sample(1000000, 500, replace=TRUE)
    h <- hist(x,nclass=nclass.scott,axes=FALSE,col=brewer.pal(10,"Set3"))
    # usr <- par("usr")
    at <- c(0, 10,30, par("usr")[4])
    axis(2,at=at,labels = round(at))
    text(x=h$mids, y=h$counts, labels=h$counts, pos=3, col="red")
    

    用户

    形式为 c(x1, x2, y1, y2) 的向量,给出了 绘图区域的用户坐标。当对数刻度是 在使用中(即 par("xlog") 为真,见下文),则 x 限制将 为 10 ^ par("usr")[1:2]。对于 y 轴也是如此。

    你可能想运行它几次,我已经运行了很多次,条形图现在似乎不会超出图表。

    输出

    【讨论】:

    • par 中的小小帮助总是让我惊叹
    • 实际问题是条形超出轴;剪辑只是次要效果。我希望看到主要效果的修复。
    • @U.Windl 看到我的编辑。我希望这能解决您的问题
    • @PKumar:您的“解决方案”添加了许多我实际上并不想要的新功能(例如对数刻度、彩色条等),我真的不知道您的“解决方案”的哪一部分“真的解决了我的问题。设置par("usr")[4] 可能会解决问题,但你不会那样做,对吧?
    【解决方案2】:

    您所描述的不是错误。您正在使用功能来绘制直方图,然后您想向其中添加文本。该功能不是为此而设计的,因此您需要为文本保留一些额外的空白。

    我建议您运行该函数一次,以获取图形的“基值”。然后使用调整后的比例(文本的额外空间)再次运行该函数。为了实现这一点,您可以使用以下代码

    set.seed(9876)         ### for reproducibility
    
    x <- sample(1000000, 500, replace = TRUE)
    h <- hist(x, nclass = nclass.scott, plot = FALSE)
    
    ### use the info from the previous call to adjust the y-scale with a constant
    hist(x, nclass = nclass.scott, ylim = c(0, max(h$counts) + 10))
    text(x = h$mids, y = h$counts, labels = h$counts, pos = 3, col = "red")
    
    ### ... or add a proportion (a little bit more robust)
    hist(x, nclass = nclass.scott, ylim = c(0, max(h$counts) * 1.075))
    text(x = h$mids, y = h$counts, labels = h$counts, pos = 3, col = "red")
    

    请告诉我这是否是你想要的。

    【讨论】:

    • 那岂不是会产生两次情节,先错后对?
    • @U.Windl。这个想法是首先将直方图信息存储在h 中(并且我们不绘制到屏幕上)。然后,我们使用h 中的信息来绘制真实的图形。我第二次错误地将直方图信息分配给 h 。我现在将更新我的答案。
    • 我还是不明白为什么第一次调用没有创建一个情节:你不应该在hist()的第一次调用中添加plot=FALSE吗?
    • 最后,我们可以摆脱10ylim = c(0, max(h$counts)+ 10)中的魔法吗?
    • 显然,我们可以使用我们添加的最大高度(h$counts)的一部分来为我们想要添加的文本提供空白。我用这种可能性更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 2022-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多