首页 > 解决方案 > 如何在R中的主图表下显示指标图表

问题描述

我想要一个主面板,其较小的面板大约是下面主面板高度的 1/6。这是在股票图表中显示价格历史和一些技术指标(如 MACD)的典型设置。我不确定 MACD 是否会显示在下方,如果没有,请单击指标并添加 MACD

TSLA 与 MACD

在此处输入图像描述

标签: rplot

解决方案


这绝对是一份工作layout。请注意,它的伙伴par(mfrow=...)(and mfcol) 有效地(如果不是实际上)使用与 相同的机制layout,但布局允许绘图的“方面”之间的不同绘图顺序和尺寸。

一些随机数据:

set.seed(2)
n <- 1e4
somedat <- data.frame(x = seq_len(n), y = cumsum(rnorm(1e4)))
somedat$ydot <- smooth(c(0, diff(somedat$y)))
plot(y~x, data=somedat)

layout适用于矩阵,其中“0”元素是死空间(未使用),编号空间必须从 1 开始并以 1 递增,但这些数字可以占据多个单元格(只要它们是相邻的并且是矩形的)。例如:

m <- matrix(c(1, 0,
              1, 3,
              2, 3), byrow = TRUE, nrow = 3)
heights <- c(4, 1, 1)
widths <- c(3, 1)
layout(m, widths=widths, heights=heights)
layout.show(n=3) # only during dev, it "consumes" the plot so should not be used in production

最后一个命令仅在布局设计期间使用,它为每个编号区域绘制一个框架。它应该显示如下内容:

布局框架

(3 的右边界似乎在这里被裁剪了......这一定是我复制/粘贴到 SO 的 plots/imgur 中的人工制品。它就在那里。)

一旦我们调用了第一个layout命令,每个绘图都会填充该绘图的当前部分。使用时layout,经常需要把控par(mar=...)严密,一部分是为了美观,一部分是为了避免出错。当你绘图时你会知道后者并且它抱怨figure margins too large,在这种情况下改变你的比率或增加窗口的整体绘图大小。

要控制的另一件事是轴。也就是说,如果顶部和底部堆叠的两个图共享相同的 x 轴(或旨在暗示),那么您需要控制轴以确保它们在预期的比例上。在这个例子中是学术性的,但为了完整起见,我将其包括在内。

xlim <- range(somedat$x) # little redundant here, but mostly for good practice
layout(m, widths=widths, heights=heights)
# plot 1
par(mar = c(0.1, 4, 4, 2) + 0.1)
plot(y ~ x, data = somedat, type = "l",
     main = "Plot title",
     xlim = xlim, axes = FALSE, frame.plot = TRUE)
axis(2)
# plot 2
par(mar = c(2, 4, 0.1, 2) + 0.1)
plot(ydot ~ x, data = somedat, type = "p", 
     pch = 16, cex = 0.2, xlim = xlim, ann = FALSE)
# plot 3
plot(NA, xlim = 0:1, ylim = 0:1, ann = FALSE)
text(0.5, 0.5, "hello world!")

布局示例图

每个地块区域都重复使用par(mar=)前一个地块区域,从图中可以看出,地块 3 在地块下方具有相同的缩短区域(边 1)。


为了显示一些更强力的多部分图,这可以超越理智:

m <- matrix(
  c(1, 1, 1, 1, 7,
    1, 1, 1, 1, 7,
    1, 1, 1, 1, 0,
    1, 1, 1, 1, 4,
    5, 5, 5, 2, 3,
    5, 5, 5, 6, 6),
  byrow = TRUE, nrow = 6)
layout(m)
layout.show(n=7)

(再次使用右边框......)

疯狂的布局演示


推荐阅读