在R(基本绘图)中是否可以旋转绘图?

19
我搜索了一下,发现使用{grid}可以旋转图像,对于某些绘图,您可以调整它们的旋转(例如plot(x,y)而不是plot(y,x))。
但是,我想知道是否有一种通用方法可以旋转R中的任何基本绘图(适用于在base graphics中生成的任何绘图)?

2
你是在谈论“旋转数据”(正如你的示例所暗示的那样),还是在谈论“旋转图形”(即将其图形向右旋转35度)? - nico
以下是一些有用的信息 https://stat.ethz.ch/pipermail/r-help/2003-May/033157.html - Stéphane Laurent
7个回答

8

您可以将图形导出,重新读取并以rasterGrob的形式旋转显示(或者是在旋转矩阵后以rasterImage的形式,或者是如果您想要矢量路径,则使用grImport grob)

plot(1:10, rnorm(10))
library(grid)
cap <- grid.cap()
grid.newpage()
grid.raster(cap, vp=viewport(angle=30))

新的gridGraphics包现在可能是更好的选择。
注意:这似乎不适用于Rstudio的图形设备,可能是因为他们没有实现grid.capenter image description here

4
你的代码无法运行!Error in UseMethod("as.raster") : no applicable method for 'as.raster' applied to an object of class "NULL" - And_R
对我来说不起作用。我没有收到任何错误信息,图表只是空的。而且我只有普通的Rgui,没有Rstudio。 - Tomas
此外,这是一项位图操作,您希望将其转换为矢量化。 - undefined

8

通过gridGraphics包是有可能实现的,但感觉还有些不够完美(?grid.echo中的例子并非全部都适用于我),

plot(1:10, rnorm(10))

library(gridGraphics)

grab_grob <- function(){
  grid.echo()
  grid.grab()
}

g <- grab_grob()
grid.newpage()
pushViewport(viewport(width=0.7,angle=30))
grid.draw(g)

enter image description here


7
我相当确定使用基本图形本身没有一种通用的方法来实现此目的。然而,有一个名为gridBase的包,允许在“绘图”中混合基本图形和网格图形。该包的vignette有一节关于将基本图形嵌入到网格viewports中,因此您可以在那里查看是否可以围绕您的绘图制作网格包装器并使用网格进行旋转。不确定这是否是可行的路线,但据我所知,这是回答您问题的唯一潜在路线。

gridBase在CRAN上,作者是grid包的作者Paul Murrell。

浏览vignette后,我注意到在页面的Problems and Limitations部分中有一个项目,指出无法将基本图形嵌入到旋转的grid视口中。所以我想你没什么办法了。


好的回答!(虽然不是我想要听到的)谢谢! - Tal Galili

4

旋转的3D散点图

您还可以使用rgl包中的plot3D(x, y, z)函数创建交互式的3D散点图。它创建一个可以用鼠标旋转的旋转3D散点图。前三个参数是表示点的x、y和z数值向量。col = 和size = 分别控制点的颜色和大小。

# Spinning 3d Scatterplot
library(rgl)

plot3d(wt, disp, mpg, col="red", size=3)

3
一个名为rotate_plot的函数,用法如下:
rotate_plot(some_base_plot(x, y, ...))

这是不可能的,因为大多数基本图都不返回值。

一些图包含horiz参数,允许您选择绘制的方向。请查看barplot.default以了解如何实现此功能。(警告:这很混乱。)

@ucfagls建议使用gridBase是最好的选择。在Murrell的R Graphics的附录B中有一些使用示例。


谢谢你,Richie - 我对这个答案感到遗憾,但它毕竟是一个答案。出于时间考虑,我将标记ucfagls的答案为“答案”。最好的祝福,Tal。 - Tal Galili

2

考虑到可以使用基本图形编写自己的绘图函数,我无法看出是否存在单一的解决方案。您真正想要的只是用y数据替换x数据的方法吗?您所说的“旋转”具体指什么?


旋转 = 使输出图表(例如)旋转90度。 - Tal Galili
你是指整个图表吗?坐标轴、文本、刻度等等?在屏幕图形设备上或者在后续的设备上,这样做似乎没有意义,你可以使用horizontal=TRUE/FALSE来相对纸张旋转图表。或者使用svg()图形设备,然后将svg文件加载到inkscape中,选择全部内容并旋转90度。这些都是使输出图表旋转90度的有效方法。 - Spacedman
这是正确的 - 但我在想是否有一种在R中实现这个的方法 :) - Tal Galili

-1

是的,在R中可以通过使用Coord flip()函数旋转图表。

您可以将图形从水平翻转为垂直,也可以将其从垂直翻转为水平。


coord_flip()ggplot 函数,这个问题是关于基础图形的。 - Rui Barradas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接