r - 你如何在 R 中的多图形环境中画一条线?

标签 r graph

举个很简单的例子,mfrow=c(1,3) ;每个数字都是不同的直方图;我将如何绘制跨越所有 3 个数字的水平线(类似于 abline(h=10) )? (也就是说,即使是它们之间的边距。)显然,我可以为每个图形添加一个 abline,但这不是我想要的。我可以想到一种非常复杂的方法来做到这一点,实际上只有 1 个图形,并使用 polygon 在其中绘制每个“图形”等等。那太荒谬了。没有简单的方法可以做到这一点吗?

最佳答案

正如@joran 所指出的,网格图形系统可以更灵活地控制单个设备上多个绘图的排列。

在这里,我首先使用grconvertY()以“标准化设备坐标”为单位查询 y 轴上高度为 50 的位置。 (即作为绘图设备总高度的比例,0=底部,1=顶部)。然后我使用 网格功能: (1) 推送 viewport填充设备; (2) 在 grconvertY() 返回的高度处绘制一条线.

## Create three example plots
par(mfrow=c(1,3))
barplot(VADeaths, border = "dark blue") 
barplot(VADeaths, border = "yellow") 
barplot(VADeaths, border = "green") 

## From third plot, get the "normalized device coordinates" of 
## a point at a height of 50 on the y-axis.
(Y <- grconvertY(50, "user", "ndc"))
# [1] 0.314248

## Add the horizontal line using grid
library(grid)
pushViewport(viewport())
grid.lines(x = c(0,1), y = Y, gp = gpar(col = "red"))
popViewport()

enter image description here

编辑 :@joran 询问如何绘制一条从第一个图的 y 轴延伸到第三个图中最后一个条形边缘的线。这里有几个替代方案:
library(grid)
library(gridBase)
par(mfrow=c(1,3))

# barplot #1
barplot(VADeaths, border = "dark blue") 
X1 <- grconvertX(0, "user", "ndc")
# barplot #2
barplot(VADeaths, border = "yellow") 
# barplot #3
m <- barplot(VADeaths, border = "green") 
X2 <- grconvertX(tail(m, 1) + 0.5, "user", "ndc") # default width of bars = 1
Y <- grconvertY(50, "user", "ndc")

## Horizontal line
pushViewport(viewport())
grid.lines(x = c(X1, X2), y = Y, gp = gpar(col = "red"))
popViewport()

enter image description here

最后,这是一种几乎等效且更普遍有用的方法。它使用的功能grid.move.to()grid.line.to() Paul Murrell 在@mdsumner 的回答中链接的文章中进行了演示:
library(grid)
library(gridBase)
par(mfrow=c(1,3))

barplot(VADeaths); vps1 <- do.call(vpStack, baseViewports())
barplot(VADeaths) 
barplot(VADeaths); vps3 <- do.call(vpStack, baseViewports())

pushViewport(vps1)
Y <- convertY(unit(50,"native"), "npc")
popViewport(3)

grid.move.to(x = unit(0, "npc"), y = Y, vp = vps1)
grid.line.to(x = unit(1, "npc"), y = Y, vp = vps3, 
             gp = gpar(col = "red"))

关于r - 你如何在 R 中的多图形环境中画一条线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9985013/

相关文章:

javascript - 如何在用 rhandsontable 呈现的表格中使用 js 格式化特定行中的数字?

R:转换数据(因子值作为列名)

c++ - 当特定节点对之间存在多条最短路径时,boost graph dijkstra_shortest_paths 如何选择最短路径?

c++ - C++ 中的图/边类构造函数

r - ggvis:带有整数刻度的 x 轴

c++ - 无法获取 "stack"以填充基于 DFS 的任务排序程序

从图例中删除 ggplot2 的 geom_point 图标

r - 如何以程序方式将绘图嵌入到 RMarkdown 的选项卡中?

r - dplyr 值汇总返回 NA

c# - 图表的轴值格式