r - 如何在R中的主图表下显示指标图表
问题描述
我想要一个主面板,其较小的面板大约是下面主面板高度的 1/6。这是在股票图表中显示价格历史和一些技术指标(如 MACD)的典型设置。我不确定 MACD 是否会显示在下方,如果没有,请单击指标并添加 MACD
解决方案
这绝对是一份工作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)
(再次使用右边框......)
推荐阅读
- node.js - 无法连接到受密码保护的 MongoDB 服务器/数据库
- c# - 如何使用 LUIS (Bot Framework) 将文本解析回特定类型?
- xml - 如何创建一个 XSLT 以基于两个 XML 文档之间的兄弟节点文本匹配来合并两个 XML 文档?
- ios - Flutter IOS 应用程序在打开时立即崩溃
- android - Azure 媒体服务颤动
- java - 在 Android 中使用 autoSizeColumn 方法时出现 FontRenderContext 错误
- c++ - GoogleTest:EXPECT_THROW 错误:语句无效
- mysql - 在带有可选字段的 SQL DB 中构建表的最佳方法是什么?
- pip - 如何控制`pip`将哪些文件复制到构建目录
- python - Python3 修复:“TypeError:'float' 对象不可下标”