R绘制所有轴标签(防止跳过某些轴标签)
当我用(R绘制所有轴标签(防止跳过某些轴标签),r,plot,R,Plot,当我用(轴(1,at=1:27,labels=labs[0:27])手动添加以下标签时,): 我得到以下信息: 如何强制绘制所有标签,以便不跳过1、3、5、6和11?(另外,为了获得额外的积分,如何将整个图像向下移动几个像素??axis告诉您: 代码尽量不绘制重叠的记号标签,因此将忽略与先前绘制的标签相邻或重叠的标签。例如,这可能导致每隔一个勾号被标记。(标记从左到右或从下到上绘制,标签之间至少留有“m”大小的空间。) 使用cex.axis,使标签足够小,可以在不重叠的情况下安装 labs &
轴(1,at=1:27,labels=labs[0:27])手动添加以下标签时,
):
我得到以下信息:
如何强制绘制所有标签,以便不跳过1、3、5、6和11?(另外,为了获得额外的积分,如何将整个图像向下移动几个像素??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)
labs@PLapointe刚刚发布了我要说的内容,但忽略了额外的答案
在axis
中设置padj=0.5
以稍微向下移动标签。如果要强制显示所有标签,即使它们非常接近或重叠,也可以通过分别调用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)
labs虽然这里有一些很好的答案,但OP除了拟合所有轴标签外,不想调整标签的大小或更改有关绘图的任何内容。这很烦人,因为通常会有足够的空间来放置所有的axis标签
这是另一个解决方案。绘制不带轴的绘图,然后添加带空标签的记号。将记号的位置存储在对象中,这样就可以遍历每个记号并将其放置在轴上的正确位置
绘图(1:10,1:10,yaxt=“n”)
轴刻度=轴(2,轴刻度(2),标签=重复(“,长度(轴刻度(2)))
对于(i in axis_ticks)axis(2,i)
我遇到了一个类似的问题,我想错开标签,让它们在打印时不会丢失一些。我创建了两组记号,将第二组记号显示在另一组记号的下方,使其看起来像是交错的
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”完成。可能通过反复使用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将重新计算记号位置
对于第二个(始终标记)绘图,调整图像大小时不会重新计算记号的数量和位置。由轴刻度计算的轴刻度取决于首次绘制绘图时显示窗口的大小
如果要强制特定的勾选位置,请尝试以下操作:
plot(x, y, log = "y", yaxt = "n")
mapply(axis, side = 2, at = c(1,10,100, 1000), labels = c("one", "ten", "hundred", "thousand"))
这将产生:
axis()
包括一个间隙.axis
参数,用于控制何时省略标签。将此设置为负数将强制显示所有标签,即使它们重叠
axis()
的padj
参数控制绘制单个轴时的y偏移
par(mgp=c(3,2,0)
将在打印会话期间调整所有轴标签的位置:第二个值(此处为2
,默认值1
)控制标签的位置
#设置轴文本位置,包括Y轴
par(mgp=c(3,2,0))
#密谋
绘图(1:12,1:12,log='x',ann=FALSE,axes=FALSE)
#一些数字未绘制:
轴(1,1:12)
#绘制所有数字,并进行手动偏移
轴(1,1:12,间隙轴=-100,padj=0.5)
是否确实要在索引中包含0?另一种方法是使标签与绘图(…,las=2)
或par(las=2);绘图(…)
+1垂直,用于上一个旋转轴解决方案。如果使用绘图(…,axis=FALSE,…)
和轴(1,…。)
,然后将选项添加到axis:axis(1,…,las=2)
非常感谢。cex.axis非常有帮助。注意:我的x轴由字符串组成,因此我改为拨弄cex.names
,它在最后给了我所需的输出。
plot(x, y, log = "y", yaxt = "n")
mapply(axis, side = 2, at = c(1,10,100, 1000), labels = c("one", "ten", "hundred", "thousand"))