【问题标题】:Is it possible to rotate a plot in R (base graphics)?是否可以在 R(基本图形)中旋转绘图?
【发布时间】:2010-09-25 06:43:10
【问题描述】:

我对此进行了搜索,发现使用 {grid} 可以旋转图像,并且对于某些绘图,您可以使用它们的旋转(例如 plot(x,y) 而不是 plot(y,x) )。

但是,我想知道是否有在 R 中旋转绘图的通用方法(适用于基础图形中生成的任何绘图)?

【问题讨论】:

标签: r rotation plot


【解决方案1】:

您可以导出图形,将其读回,然后将其旋转显示为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.cap

【讨论】:

  • 您的代码不起作用! Error in UseMethod("as.raster") : no applicable method for 'as.raster' applied to an object of class "NULL"
  • 对我不起作用。我没有收到任何错误,情节只是空的。而且我只有普通的 Rgui 没有 Rstudio。
【解决方案2】:

通过 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)

【讨论】:

    【解决方案3】:

    我有理由确定,基本图形本身无法通用地执行此操作。然而,gridBase 包允许在“绘图”中混合基本图形和网格图形。包的小插图有一个关于在网格viewports 中嵌入基本图形的部分,因此您可能会在那里查看是否可以在您的地块周围制作一个网格包装器并使用网格进行旋转。不确定这是否是一条可行的途径,但据我所知,这是回答您的问题的唯一潜在途径。

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

    浏览小插图后,我注意到页面上的问题和限制部分中的一个项目符号,其中指出不可能将基本图形嵌入到 旋转 grid 视口。所以我猜你运气不好。

    【讨论】:

    • 好答案! (虽然不是我喜欢读的)谢谢!
    【解决方案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)
    

    【讨论】:

      【解决方案5】:

      鉴于可以使用基本图形编写自己的绘图函数,我看不出如何存在单一解决方案。你想要的真的只是一种用 y 数据替换 x 数据的方法吗? “旋转”到底是什么意思?

      【讨论】:

      • rotate = 使输出图(例如)旋转 90 度。
      • 你的意思是整个情节吗?轴、文本、刻度线等?这在屏幕图形设备或 postscript 设备上似乎毫无意义,您可能可以使用 Horizo​​ntal=TRUE/FALSE 来生成相对于纸张的旋转图。或者使用 svg() 图形设备,然后将 svg 文件加载到 inkscape 中,选择全部并旋转 90 度。这些都是使输出图旋转 90 度的有效方法。
      • 这是真的 - 但我想知道是否有办法在 R 中做到这一点:)
      【解决方案6】:

      一个函数rotate_plot 可以像这样使用

      rotate_plot(some_base_plot(x, y, ...))
      

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

      某些绘图包含horiz 参数,允许您选择要绘制绘图的方式。看看barplot.default 看看如何实现它。 (警告:这很混乱。)

      @ucfagls 建议使用gridBase 是您最好的选择。 Murrell's R Graphics 的Appendix B 中有一些使用它的例子。

      【讨论】:

      • 谢谢你 Richie - 我对这个答案感到难过,但它仍然是一个答案。出于计时目的,我将标记为“答案”ucfagls 答案。最好的,塔尔
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 2014-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-08
      相关资源
      最近更新 更多