【问题标题】:R: set axis ticks & range to include all points w/ pretty breaksR:设置轴刻度和范围以包括所有带有漂亮中断的点
【发布时间】:2014-09-22 09:33:30
【问题描述】:

我有一个动态构建线图的函数,因此需要用公式而不是手动设置范围来解决我的问题。 (专家提示:我后来为自己和其他人按逻辑顺序编写了这篇文章 - 很抱歉这意味着更多的文字;我发现 R 帮助特别分散且对绘图无益,因此希望这对其他人有所帮助)。

我生成的线图的轴具有正确的刻度间距数量(默认,假定为“漂亮的中断”?)但轴范围不包括数据的整个范围 - 有些超出. (您可以忽略轴上方的地毯图十分位数,尽管第一个和最后一个显示数据范围)

所以我希望 x 轴宽度包含所有数据,但保留漂亮的中断,即将最小/最大刻度点扩展到等于或超过极值的好值...理想情况下没有很多工作!我并不是说听起来很懒惰,但这感觉就像是一种共同的愿望。我正在阅读at,包括prettyaxTicks,还有xaxtxaxsxpd

plot 中,xaxs 控制实际数据线在图中占据的宽度,“i”将其扩展到边缘,“r”(或默认值)将其稍微挤压。知道这很酷,但可以说不是人们所期望的“轴”。 (此处设置为“r”/默认)

xaxt 的帮助让人们知道这是您用来关闭轴绘图的工具,但没有说明它还有什么作用/其他类型是什么。

axis中,at控制轴线长度,默认为axTicks,默认为xaxp。从表面上看,xaxp 是我想要的,允许指定c(x1, x2, n),但是默认的x1x2 在数据范围内,而不是包含它。

axis 帮助说:

"轴线是从at的最低值到最高值绘制的,但会在绘图区域被剪裁。默认情况下,仅从绘图区域内的点绘制的刻度(最大容差为舍入误差)被绘制,但刻度及其标签可能会延伸到绘图区域之外。使用xpd = TRUExpd = NA 允许轴进一步延伸“

xpd = TRUExpd = NA 似乎都没有改变任何东西。 xpd 帮助说:

"如果为FALSE,所有绘图都被裁剪到绘图区域,如果为TRUE,所有绘图被裁剪到图形区域,如果NA,所有绘图被裁剪到设备区域"

axis help 说xpd 控制轴延伸,xpd help 说xpd 控制绘图剪切。

xaxp help 说“请参阅axTicks() 了解此的纯 R 实现”

axTicks "计算漂亮的刻度线位置,与 R 在内部执行的方式相同",并默认为相关侧的 at 值,即par("xaxp")

pretty 看起来非常复杂,并且很可能是R 在内部用于计算at 时的默认刻度间距;能够编辑 n 参数会很酷,仅此而已,即根据我的绘图区域大小指定所需的间隔数,但如果这意味着要花一天时间进行反编译,我很乐意离开,理解, 然后手动重新编译pretty!另外我不知道漂亮的刻度线的n 是否与xaxp 中的n 做同样的事情,如果是这样,哪个优先。

所以:R帮助似乎使用“轴”来表示轴(xaxtaxis)和绘图(xaxsxpd),没有迹象表明参数是否由par控制,plotaxis,或者可以通过它们中的任何一个组合来控制(像往常一样)。在试图找到负责的元素时,axisataxTicksxaxpaxTicksat (=循环)。

作为一个次要的、更广泛的元问题:在试图找到绘图问题的答案方面,我在这里做错了吗?我反复阅读,发现帮助经常缺乏、令人困惑、矛盾,并且通常会导致直觉黑洞是否应该由parplotaxis 控制。提前谢谢各位。对不起,这很长,我真的认为这将是一个超级简单的选择。

最小的可重现示例:

png(filename="A.png", width=4*480, height=4*480, units="px", pointsize=80, bg="white", res=NA, family="", type="cairo-png")
par(mar=c(1.32,2,0.4,0.5), fig=c(0,1,0,1), las=1, lwd=8, bty="n", mgp=c(2,0.5,0), xpd=NA)
  plot(ChickWeight[,1:2],type="l",xaxs="i",yaxs="i")
dev.off()

【问题讨论】:

  • 我没有花时间阅读所有内容,但scales::extended_breaks() 应该在这里提供帮助。
  • 谢谢。我想你不知道是否有任何关于在哪里以及如何使用它的信息吗?即par/plot/axis?我尝试将“extended_breaks(n = 7)”添加到情节中,但得到:“标题错误(...):无法将类型'闭包'强制转换为'字符'类型的向量”。谢谢。
  • 如果你发布一个最小的可重现示例,有人可能会向你展示
  • 完成。将“,extended_breaks(n = 7)”添加到绘图中没有任何作用,进入par找不到功能,删除所有par设置。干杯

标签: r plot range axis-labels axes


【解决方案1】:

这个想法是绘制自己的轴,而不是让 plot 使用默认轴。这是一个似乎可行的示例,

xx <- labeling::extended(min(ChickWeight[,1]), max(ChickWeight[,1]),
                         3, only.loose=TRUE) 
yy <- labeling::extended(min(ChickWeight[,2]), max(ChickWeight[,2]),
                         3, only.loose=TRUE) 
plot(range(xx),range(yy), t="n", xaxt="n", yaxt="n")
points(ChickWeight[,1:2],type="p")
axis(1, at = xx)
axis(2, at = yy)

【讨论】:

  • 很有趣,好的,谢谢,我会玩一下。似乎很奇怪,R 对标签包的帮助如此之少,尤其是考虑到与 R 的标准绘图设置相比,它的应用是多么不直观(尽管他们说要阅读他们的论文)
【解决方案2】:

最简单的方法是添加 xlim 和/或 ylim 参数,将它们设置为超出数据范围的某个值。 R 将仍然使用它的默认方法来查找漂亮的刻度位置。 对于您显示的数字,xlim = c(0, 60000), ylim = c(-.3,.3) 可能就足够了。

(我知道这是一个旧线程,但我将这个答案添加到完整性)

【讨论】:

  • 欣赏评论。可能我可以通过将 x&ylim 值设置为 -&+ 范围的某个百分比,向下/向上舍入来公式化地做到这一点。这周我会试一试。谢谢!
  • @dez93_2000 如果我没记错的话,R 的默认行为是将范围增加 4%,然后找到漂亮的标签。添加 xlim/ylim 会覆盖它。我想你需要 +/- 超过 4% 才能得到合适的东西。 :)
猜你喜欢
  • 1970-01-01
  • 2019-11-25
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-03
相关资源
最近更新 更多