【问题标题】:Formatting and manipulating a plot from the R package "hexbin"格式化和操作 R 包“hexbin”中的绘图
【发布时间】:2013-03-19 16:23:24
【问题描述】:

我使用包hexbin生成一个绘图:

# install.packages("hexbin", dependencies=T)
library(hexbin)


set.seed(1234)
x <- rnorm(1e6)
y <- rnorm(1e6)
hbin <- hexbin(
  x   = x
  , y = y
  , xbin = 50
  , xlab = expression(alpha)
  , ylab = expression(beta)
)


## Using plot method for hexbin objects:
plot(hbin, style = "nested.lattice")

abline(h=0)

这似乎生成了一个 S4 对象 (hbin),然后我使用 plot 绘制它。 现在我想使用abline 在该图中添加一条水平线,但不幸的是这会产生错误:

plot.new 尚未被调用

我也不知道如何操作,例如轴标签的位置(alpha 和 beta 在数字内),更改图例的位置等。

我对 OOP 很熟悉,但到目前为止,我不知道 plot() 如何处理对象(它是否调用对象的某些方法?)以及如何操作结果图。

为什么我不能简单地在图上画一条线?

如何操作轴标签?

【问题讨论】:

    标签: r oop plot package s4


    【解决方案1】:

    使用格子版本的十六进制 bin - hexbinplot()。使用panel,您可以添加线条,使用style,您可以选择不同的六边形可视化方式。查看hexbinplot 的帮助以获取更多信息。

    library(hexbin)
    library(lattice)
    x <- rnorm(1e6)
    y <- rnorm(1e6)
    hexbinplot(x ~ y, aspect = 1, bins=50, 
               xlab = expression(alpha), ylab = expression(beta), 
               style = "nested.centroids",
               panel = function(...) {
                 panel.hexbinplot(...)
                 panel.abline(h=0)
                 })
    

    【讨论】:

    • 如何更改轴标签的大小和沿轴显示的值?我尝试了所有变体中的cex.*,但我唯一可以更改的是图例标签的大小,...我也无法更改参数(例如par(mar=c(15,15,15,15))
    • 查看xyplot 的帮助和scales 的参数。例如,沿 x 轴更改值的大小可以通过将 scales = list(x = list(cex=1.5)) 添加到您的 hexbinplot 来实现。要更改轴标签,您需要将 par.settings = list(par.xlab.text=list(cex=1.5)) 添加到绘图中。我知道这不是很直观,但这就是它在 lattice 中的工作方式。让我知道是否可以解决。
    • 我仍然不明白为什么这个工作,以及我在哪里可以找到它的帮助。为了更改xlab 的大小,我尝试了xlab = list( expression(alpha) ,cex = 2 ) 它有效,但手册中没有提示。也许我的方式是grob???我还是不明白plottrellislatticeggplotgrid、...是怎么关联的。
    • 这是一个相当广泛和复杂的主题,base graphics、ggplot2lattice/trellis 是 R 中用于图形显示的三种不同系统。它们之间存在一些主要差异。你必须谷歌一下才能更好地了解它是如何工作的。
    【解决方案2】:

    hexbin 使用 grid 图形,而不是 base。还有一个类似的函数grid.abline,可以通过指定斜率和截距在图上画线,但是使用的坐标系比较混乱:

    grid.abline(325,0)
    

    大致得到你想要的,但这里的截距是肉眼发现的。

    使用ggplot2你会有更多的运气:

    library(ggplot2)
    ggplot(data,aes(x=alpha,y=beta)) + geom_hex(bins=10) + geom_hline(yintercept=0.5)
    

    【讨论】:

    • 那么,是不是包不好?老实说,我完全不知道不同的包如何绘制不同的东西。到目前为止,我没有使用 ggplot,因为输出很难看,而且 ?ggplot 没有提供任何关于如何更改的信息,例如轴标题(hexbin 也是如此)。关于不同情节机制如何运作的良好文档? (plot() 使用 baseabline() 只能对 base 绘图进行更改,hexbin 使用 grid 尽管它在 plot() 中使用,它本身使用 base(但在这种情况下不是, 因为它使用grid), ggplot 使用???,...)
    • @Sven 有关文档,请参阅 docs.ggplot2.org/currentggplot2.org。可以使用scale_x_continuousscale_y_continuous 在此处更改轴标题。 ggplot2 也使用了grid 系统,但提供了更简单的界面。
    【解决方案3】:

    我在使用 hexbin 库查找大量基本绘图调整(轴范围、标签等)时遇到了很多麻烦,但我想出了如何将点导出到任何其他绘图函数中:

    hxb<-hexbin(x=c(-15,-15,75,75),
                y=c(-15,-15,75,75),
                xbins=12)
    
    hxb@xcm    #gives the x co-ordinates of each hex tile
    hxb@ycm    #gives the y co-ordinates of each hex tile
    hxb@count  #gives the cell size for each hex tile
    
    points(x=hxb@xcm, y=hxb@ycm, pch=hxb@count)
    

    您可以将这三个向量输入到您通常使用的任何绘图工具中。通常会调整大小缩放等,但它比顽固的 hexplot 函数要好得多。我在 ggplot2 stat_binhex 中发现的问题是我无法将十六进制设置为不同的大小......只是不同的颜色。

    如果你真的想要六边形,plotrix有一个六边形绘图功能,我认为很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-02
      • 1970-01-01
      • 1970-01-01
      • 2019-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多