如何详细自定义基本R图和子图?

时间:2019-06-28 13:01:10

标签: r plot data-visualization

经济学论文中有这个数字:

enter image description here

我想像这样对图进行样式设置-顶部轴不可见,右侧Y轴值,顶部轴标签并水平对齐,子图标题向左对齐,每个子图更高比宽,因此强调沿Y轴的变化。我主要使用MATLAB,并且尝试弄弄它来重现这样的内容,但徒劳无功。然后,我与该论文的一位作者联系,询问他是否可以告诉他用于情节的应用程序,以及是否可以分享在情节之后对我的情节进行样式设置的方法。他回答说他没有代码,但他认为它是在R中完成的。

我还没有见过在R中完成过这样的情节,即使经过数小时的互联网拖曳,我也没有发现R生成的任何东西看起来都非常相似。如果您对是否确实可以在R中进行操作有任何想法/建议,将不胜感激。

编辑

由Isabella Ghement提供意见,并在whuber发表评论后,我尝试在问题图中绘制4 x 2面板之一。这是它的外观:

enter image description here

按理,这与问题面板有很大不同。大概,如果我可以正确地找到一个面板,则可以准备一个包含m x n个子图的图形。就是说,这个图只有我想要的两个元素-不可见的上轴和向左对齐的子图标题。但是它的刻度线在外面,X轴与两个Y轴不对齐,并且轴标签仍然垂直打印在它们的旁边。这是产生以上情节的代码(摘自https://www.statmethods.net/advgraphs/axes.html,感谢Isabella Ghement的建议)

# specify the data 
x <- c(1:10); y <- x; z <- 10/x
# create extra margin room on the right for an axis 
par(mar=c(5, 4, 4, 8) + 0.1)
# plot x vs. y 
plot(x, y,type="b", pch=21, col="red", 
 yaxt="n", lty=3, xlab="", ylab="", bty="n")
# add x vs. 1/x 
lines(x, z, type="b", pch=22, col="blue", lty=2)
# draw an axis on the left 
axis(2, at=x,labels=x, col.axis="red", las=2)
# draw an axis on the right, with smaller text and ticks 
axis(4, at=z,labels=round(z,digits=2),
 col.axis="blue", las=2, cex.axis=0.7)
# add a title for the right axis 
 mtext("y=1/x", side=4, line=3, cex.lab=1,las=2, col="blue")
# add a main title and bottom and left axis labels 
title("(a) Some Variable", xlab="X values",
  ylab="Y=X", adj=0)

我希望能够生成这种图的简单方法,但是似乎很多手工工作。

进一步编辑

尽管其中一位作者回信说他认为在R中完成了图,但是我确实怀疑@iayork这样的图可能没有在R中完成。我看了另一篇论文的在线附录,其中该问题的一位论文作者是该论文的合著者,并且该论文也具有相似风格的情节。看看这个情节例如:

enter image description here

当我查看该图的文件属性(这是一个PDF文件,该文件在压缩文件夹中包含在线附录,但不包含代码)时,我看到了:

enter image description here

看到这一点后,我立即认为它是由S-PLUS生成的,但是花了数小时后,我没有在S-PLUS网站上找到任何在线内容,也没有发现任何其他相似之处。那时我以为,即使通过查看文件属性看起来也不是那样。然后,作为最后的选择,我试图与作者联系,但仍无济于事。

1 个答案:

答案 0 :(得分:1)

您已经停用了yaxt,因此也停用了xaxt。在axis中,我们可以省略labels=FALSE的标签。然后让我介绍一下mtext,您可以使用它独立于轴创建标签。是的,向内滴答声是用tck=-something完成的。为了使轴彼此接触,我们从0开始,直到最大值稍高一些为止,应该自动隐藏重叠部分。添加legend。最后,使用png设备获得所需的宽高比是明智的。简而言之,我认为就是这样吗?

# specify the data 
x <- c(0:10); y <- ((x^2)-20)/100; z <- (100/x-3)/100

# helper variables
t.adj <- .03
y.seq <- c(-.5, seq(0, 1.5, length.out=4))

png("ecn.plot.png", width=400, height=500)

# margins
par(mar=c(4, 4, 4, 5) + 0.1)

# plot x vs. y 
plot(x, y,type="l", pch=21, col="red", xlim=c(0, 10), ylim=c(-.42, max(y.seq)),
     yaxt="n", xaxt="n", lty=1, xlab="", ylab="", bty="n", lwd=2)
# add x vs. 1/x 
lines(x, z, type="l", pch=22, col="blue", lty=2, lwd=2)
# add y-zero line
abline(h=0, lwd=2)
# draw axes
axis(1, at=(-1:6)*2,labels=FALSE, col.axis="black", tck=t.adj, lwd=2)
mtext((0:5)*2, 1, 0, at=(0:5)*2,col.axis="black", font=2)
axis(2, at=y.seq, labels=FALSE, col.axis="red", las=2, tck=t.adj, lwd=2)
axis(4, at=y.seq, labels=FALSE, col.axis="red", las=2, tck=t.adj, lwd=2)
mtext(formatC(sort(c(0, y.seq)), digits=1, format="f"), 4, 2, 
      at=sort(c(0, y.seq)), col="black", las=2, font=2, adj=1)
mtext("pct.", 4, 0, at=max(y.seq)+.15, las=2, adj=1, font=2, cex=.9)
# add title
mtext("(a) Some Variable", padj=-2, adj=0, cex=1.2, font=2)
# add legend
legend(x[2], max(y.seq), c("Home", "Foreign"), lty=c(1, 2), 
       col=c("red", "blue"), bty="n", cex=.8)

dev.off()

结果

enter image description here

啊,要安排多个图,您可能要看一下this answer