【问题标题】:Ticks of varying sizes in R latticeR格中不同大小的刻度
【发布时间】:2014-09-22 16:44:46
【问题描述】:

我正在尝试绘制一个条形图,并在 4 年标记处获得刻度线,其下方有我得到的日期,但也有较小的刻度线表示每年的每个季度。

barchart(V3~V1,  data = differences,origin=0,box.ratio=40, lty=0,reference=TRUE,stack=TRUE,par.settings=list (axis.text=list(cex=1.5), axis.line = list(lwd=3)),scales=list(y=list(tick.number=8, rot=90,alternating=1), x=list(at=c(6,18,30,42,54,66,78,90,102,114,126,138,150,162,174,186,198), labels=c("\n1996","","","","\n2000","","","","\n2004","","","","\n2008","","","","\n2012"),draw=TRUE,tck=1   )))

这是一些示例数据

01/31/1996      -7.3667
02/29/1996       0.9413
03/31/1996       9.3252
04/30/1996       0.3147
05/31/1996       8.8593
06/30/1996      10.0297
07/31/1996       0.64i3
08/31/1996       2.1397
09/30/1996       0.6759
10/31/1996      -1.5579
11/30/1996       2.9493
....             ....
goes to 2012..

现在这给了

  |   |   |   |   |   |   |   |
1996            2000          2004 and so on

所以我希望 x 轴看起来像

    |||||||||||||||||||||||||||||
    |   |   |   |   |   |   |   |
   1996            2000        2004 and so on

where | indicates tick of size 2 and | is size 1 for example
      | 

你如何在不同的时间间隔指定两个不同大小的刻度?谢谢。

跟随 MrFlick 的 cmets 更新

对于我当前的设置是否可以为 tck 使用 ifelse 语句,例如

barchart(V3~V1,  data = differences,origin=0,box.ratio=40, lty=0,reference=TRUE,stack=TRUE,par.settings=list (axis.text=list(cex=1.5), axis.line = list(lwd=3)),scales=list(y=list(tick.number=8, rot=90,alternating=1), x=list(at=c(6,18,30,42,54,66,78,90,102,114,126,138,150,162,174,186,198), labels=c("\n1996","","","","\n2000","","","","\n2004","","","","\n2008","","","","\n2012"),draw=TRUE,tck=ifelse(some condition, 1,2   )))

其中某些条件可以以某种方式引用数字列表 6,18,30,42,54,66,78,90,102,114,126,138,150,162,174,186,198。是否可以以某种方式将其作为数组传递,以便 tck 可以引用它。即 array[i] % 18 == 0,类似这样的 tck 以某种方式遍历列表

【问题讨论】:

  • 是的,一个措辞不当并标记为抱歉
  • @niels 编辑现有帖子比重新发布更详细的相同问题要好。请删除另一个,否则将被标记为重复并消失。
  • 您应该能够在 Lattice(本书)网站上获得处理轴刻度的工作代码。第 8 章处理轴注释。

标签: r lattice


【解决方案1】:

这是一个示例,展示了如何自定义刻度。这是一些示例数据

dd<-data.frame(
   V1=seq(as.Date("1996-01-31"), as.Date("2006-12-31"), by="1 mon"),
   V2=cumsum(rnorm(132))
)

然后我们可以用它来绘制它

barchart(V2~V1, dd, horiz=F, xscale.components=function(...) {
    dp <- function(x,p) as.numeric(strftime(x, p))
    ans <- xscale.components.default(...)   
    dates <- as.POSIXct(ans$bottom$labels$labels)
    xf <- approxfun(as.numeric(dates), ans$bottom$labels$at)
    rng <- range(dates)
    if(dp(rng[1],"%d")!=1) {
        rng[1] <- seq(ISOdate(dp(rng[1],"%Y"), dp(rng[1],"%m"), 1), 
            length.out=2, by="1 mon")[2]
    }
    at.dates<-seq(rng[1], rng[2], by="1 mon")

    ats <- xf(at.dates)
    ans$bottom$ticks$at <- ats
    ans$bottom$ticks$tck <- ifelse(((dp(at.dates, "%m")-1) %% 3)==0, 2, 1)
    ans$bottom$labels$at <- ats
    ans$bottom$labels$labels <- ifelse(dp(at.dates, "%m")==1, dp(at.dates, "%Y"), " ")
    ans
}, lty=0, stack=T, origin=0, reference=T,
scales=list(x=list(draw=T, tck=1)))

哪个产生

第一个挑战是barchart() 需要一个分类轴,因此它不太喜欢日期。 (使用xyplot 会更容易一些)。但基本上我们分别使用tckat 显式设置刻度长度和位置。如果你改变刻度的长度,它可能会对标签产生意想不到的后果,除非它们与刻度的长度相同,所以我只是为较短的刻度添加了空白标签并将它们绘制在相同的位置。您可以查看?xscale.components.default 了解更多信息。

这对于不同的日期范围应该是相当可靠的,但我没有进行广泛的测试。

【讨论】:

  • 嗨,这真的很酷,谢谢。但是你能解释一下你在做什么吗?我是 R 新手,对符号很困惑
  • 例如。 ans$bottom$labels$labels 和 ans$bottom$labels$at 在下面声明之前用于第一部分。什么是ats。我只是对首先声明哪些以及它们如何相互依赖感到困惑。
  • 这项任务确实被证明是相当困难的,所以如果你是 R 新手,我不会太担心不理解它。但基本思想是我们首先调用ans&lt;-xscale.components.default(...) 来获取轴注释的所有默认设置。然后这个函数转换并用我们真正想要的替换默认值。 ats 是我要放置刻度线的所有日期的数值。它会告诉您“在”哪个位置绘制刻度线。
  • 看起来您对 SO 也有些陌生。当有人为您的问题提供了解决您问题的答案时,您应该单击问题旁边的复选标记将其标记为“正确”并关闭问题(将其从未回答列表中删除)。如果它不能解决问题,最好在评论中让他们知道原因。
  • 好的,我做到了。有什么方法可以在我的原始条形图中使用 ifelse,请查看我编辑的原始帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-24
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多