【问题标题】:R Draw All Axis Labels (Prevent Some From Being Skipped)R绘制所有轴标签(防止一些被跳过)
【发布时间】:2011-12-31 15:12:26
【问题描述】:

当我使用 (axis(1, at=1:27, labels=labs[0:27])) 手动添加以下标签时:

> labs[0:27]
 [1] "0\n9.3%"  "1\n7.6%"  "2\n5.6%"  "3\n5.1%"  "4\n5.7%"  "5\n6.5%"  "6\n7.3%"  "7\n7.6%"  "8\n7.5%"  "9\n7%"    "10\n6.2%" "11\n5.2%"
[13] "12\n4.2%" ........

我得到以下信息:

如何强制绘制所有标签,以便不跳过 1、3、5、6 和 11? (另外,为了额外的功劳,我如何将整个东西向下移动几个像素?)

【问题讨论】:

  • 您真的要在索引中包含 0 吗?

标签: r plot


【解决方案1】:

如果您想强制显示所有标签,即使它们非常接近或重叠,您可以通过单独调用axis 函数添加奇数和偶数轴标签来“欺骗”R 显示它们,如下所示:

labs <-c("0\n9.3%","1\n7.6%","2\n5.6%","3\n5.1%","4\n5.7%","5\n6.5%","6\n7.3%",
         "7\n7.6%","8\n7.5%","9\n7%", "10\n6.2%","11\n5.2%","12\n4.2%",13:27)
n=length(labs)
plot(1:28, xaxt = "n")
axis(side=1, at=seq(1,n,2), labels=labs[seq(1,n,2)], cex.axis=0.6)
axis(side=1, at=seq(2,n,2), labels=labs[seq(2,n,2)], cex.axis=0.6)

您可以使用cex.axis 来获得您想要的文本大小。另请注意,您可能需要调整 at= 和/或 labels= 中值的数量,以使它们相等。

我同意@PLapointe 和@joran 的观点,通常最好不要篡改R 关于重叠的默认行为。但是,我遇到过一些情况,轴标签看起来很好,即使它们不是完全分开的“m宽度”,我想出了交替奇数和偶数标签的技巧,以此来获得我的行为想要。

【讨论】:

    【解决方案2】:

    ?axis 告诉你:

    代码尽量不绘制重叠的刻度标签,因此将省略与先前绘制的标签相邻或重叠的标签。例如,这可能导致每隔一个刻度都被标记。 (刻度从左到右或从下到上绘制,标签之间至少留有一个“m”大小的空间。)

    cex.axis 一起玩,这样标签就可以足够小以适应而不会重叠

    labs <-c("0\n9.3%","1\n7.6%","2\n5.6%","3\n5.1%","4\n5.7%","5\n6.5%","6\n7.3%",
             "7\n7.6%","8\n7.5%","9\n7%", "10\n6.2%","11\n5.2%","12\n4.2%",12:27)
    plot(1:27,xaxt = "n")
    axis(side=1, at=1:27, labels=labs[0:27],cex.axis=0.35)
    

    如果您扩大图表(手动通过拖动或以编程方式),您可以增加标签的大小。

    【讨论】:

    • 非常感谢。 cex.axis 有很大帮助
    • 注意:我的 x 轴是由字符串组成的,所以我用 cex.names 代替,最后它给了我想要的输出。
    【解决方案3】:

    虽然这里有一些很好的答案,但除了拟合所有轴标签之外,OP 不想调整标签大小或更改绘图的任何内容。这很烦人,因为通常似乎有足够的空间来容纳所有轴标签。

    这是另一个解决方案。绘制没有轴的图,然后添加带有空标签的刻度。将刻度的位置存储在一个对象中,这样您就可以遍历每个刻度并将其放置在轴上的正确位置。

    plot(1:10, 1:10, yaxt = "n") axis_ticks = axis(2, axTicks(2), labels = rep("", length(axTicks(2)))) for(i in axis_ticks) axis(2, i)

    【讨论】:

      【解决方案4】:

      @PLapointe 刚刚发布了我要说的内容,但省略了奖励答案。

      axis 中设置padj = 0.5 以稍微向下移动标签。

      【讨论】:

      • 另一种选择是使标签与plot(..., las=2)par(las=2); plot(...)垂直
      • +1 表示先前的旋转轴解决方案。关于上述内容的注释,如果您使用的是plot(...,axis=FALSE,...)axis(1,....),则将选项添加到轴:axis(1,...,las=2)
      【解决方案5】:

      也许一次绘制和标记一个刻度,通过使用mapply 反复调用axis...

      例如,考虑以下数据:

      x = runif(100)*20
      y = 10^(runif(100)*3)
      

      y 的公式可能看起来有点奇怪;它给出了分布在三个数量级上的随机数,这样数据将均匀分布在 y 轴在对数刻度上的图上。这将通过在记录轴上为我们计算好的刻度位置来帮助展示 axTicks() 的实用性。

      默认情况下:

      plot(x, y, log = "y")
      

      返回:

      请注意缺少 100 和 1000 个标签。

      我们可以改用:

      plot(x, y, log = "y", yaxt = "n")
      mapply(axis, side = 2, at = axTicks(2), labels = axTicks(2))
      

      axTicks() 返回的每个刻度位置调用一次axis(),因此一次绘制一个刻度。结果:

      我喜欢这个解决方案的一点是,它只使用一行代码来绘制轴,它完全打印出 R 会制作的默认轴,除了所有刻度都被标记,并且当情节已调整大小:

      我不能说轴在调整大小的示例中很有用,但它说明轴标签是永久的!

      对于第一个(默认)绘图,请注意 R 将在调整大小时重新计算刻度位置。

      对于第二个(始终标记)图,调整图像大小时不会重新计算刻度线的数量和位置。 axTicks 计算的轴刻度取决于第一次绘制绘图时显示窗口的大小。

      如果您想强制指定特定的刻度位置,请尝试以下操作:

      plot(x, y, log = "y", yaxt = "n")
      mapply(axis, side = 2, at = c(1,10,100, 1000), labels = c("one", "ten", "hundred", "thousand"))
      

      产生:

      【讨论】:

        【解决方案6】:

        我有一个类似的问题,我想错开标签并让它们打印而不会丢失一些。我创建了两组刻度,在另一组下方显示第二组,使其看起来好像是交错的。

        xaxis_stagger = function(positions,labels) {
          odd=labels[seq(1,length(labels),2)]
          odd_pos=positions[seq(1,length(positions),2)]
          even=labels[seq(2,length(labels),2)]  
          even_pos=positions[seq(2,length(positions),2)]
          axis(side=1,at=odd_pos,labels=odd)
          axis(side=1,at=even_pos,labels=even,padj=1.5)
        }
        

        因此,您给出了您希望刻度线所在的位置以及这些刻度线的标签,然后将其重新组织成两组轴并将它们绘制在原始图上。原始情节将使用 xaxt="n" 完成。

        【讨论】:

          【解决方案7】:

          axis() 包含一个gap.axis 参数,用于控制何时省略标签。将此设置为一个非常负数将强制显示所有标签,即使它们重叠。

          axis()padj 参数在绘制单个轴时控制 y 偏移。

          par(mgp = c(3, 2, 0) 将在绘图会话期间调整所有轴标签的位置:第二个值(此处为 2,默认为 1)控制标签的位置。

          # Set axis text position, including for Y axis
          par(mgp = c(3, 2, 0))
          
          # Plot
          plot(1:12, 1:12, log = 'x', ann = FALSE, axes = FALSE)
          
          # Some numbers not plotted:
          axis(1, 1:12)
          
          # All numbers plotted, with manual offset
          axis(1, 1:12, gap.axis = -100, padj = 0.5)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-08-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多