中秋献礼——Layer图形设备


你在用R画图的时候,是否会遇到以下的麻烦:

  • 加图例或文字时总是对不准坐标,要花很多精力调整元素的位置;
  • 某个细节出错,整幅图得重新绘制;
  • 想要更酷的平移、拉伸、旋转操作,就好像在Gimp或Photoshop里面一样;
  • 想更方便地使用字体,特别是中文的显示。

于是接下来就有一个好消息和一个坏消息。好消息是有一个软件包可以解决上面的大部分问题了,而坏消息是这个包仍然处于开发阶段,所以各种bug是难以避免的。今天恰逢中秋,我便把这个自己编写的Layer软件包介绍给大家,算是送给大家的一份小礼物。

Layer顾名思义,指的是图层,而这个绘图设备正是采用了图层的思想。在你用Layer画图时,你可以将不同的图形元素放在不同的层上,彼此之间互不影响。例如,你可以将图例单独建立一个图层,当图例移动时,下层的图形并不会发生变化,再加上一定的鼠标操作,就可以方便地绘制出美观的图形。

为了让大家能直观地感受Layer的操作,下面给出了一段Layer的操作演示视频。

此外,Layer有着更方便的字体支持。在打开Layer图形设备时,你可以指定一个ttf字体文件作为图形字体的来源,如果参数为NULL,则图形会使用软件包自带的文泉驿微米黑字体。

Layer软件包的下载地址如下。需要说明的是,Layer需要GTK+环境的支持,对于Windows用户,如果你已经安装了GTK+环境,请选择第二个下载地址;如果尚未安装,可以直接下载第三个文件(软件包中附带了GTK+)。

下载:源代码
下载:Windows二进制包
下载:Windows二进制包(含GTK+运行库)

中秋献礼——Layer图形设备》有27个想法

  1. 抢占板凳,围观高手!
    这个的确好用~
    顺祝各位中秋快乐!

  2. 太给力了,快速调整图形细节已不再是梦!
    另外,最终调整好的图形能返回相应的参数么,比如坐标位置,旋转角度等等,那样的话就太棒了。

    1. 这个可以啊,平移旋转拉伸本质上都是将原来的坐标左乘一个变换矩阵,这个矩阵会被记录下来的,不过怎样让展示出来的数值容易看懂还得考虑一会儿。

  3. 为什么我按照操作只加进去了title图层,legend和thanks两个图层加不进去呢?而且把title图层的名字改了就提示没有那个函数呢?

      1. library(Layer)
        Layer()
        x=seq(-pi,pi,len=41)
        plot(x,sin(x),type="l",ylim=c(-2,2),col=2,lty=2)
        points(x,cos(x),pch=3,col=4)
        add.layer("title")
        title("legend(***,lty=c(-2,2),pch=c(-2,3))",cex.main=1,1)
        add.layer("legend")
        legend(-1,2,c("sin","cos"),col=(3,4),lty=c(2,-1),
               pch=c(-3,3),bg="gray99")

        上面这段,执行完添加legend图层,原图没有任何变化

        将title换成legend,重新执行,结果提示命令错误,如下

        > library(Layer)
        > Layer()
        > x=seq(-pi,pi,len=41)
        > plot(x,sin(x),type="l",ylim=c(-2,2),col=2,lty=2)
        > points(x,cos(x),pch=3,col=4)
        > add.layer("legend")
        > legend("legend(***,lty=c(-2,2),pch=c(-2,3))",
        +        cex.main=1,1)
        错误于legend("legend(***,lty=c(-2,2),pch=c(-2,3))",
                    cex.main = 1, 1) : 
          参数((cex.main = 1)) 没有用
        > legend("legend(***,lty=c(-2,2),pch=c(-2,3))",1)
        错误于is.language(x) : 缺少'x'
    1. 你应该是有些命令打错了,比如col=(3,4)应该是col = c(3, 4)cex.main=1,1应该是cex.main = 1.1等等。
      完整的程序在下面:

      x = seq(-pi, pi, len = 65);
      plot(x, sin(x), type = "l", ylim = c(-1.2, 1.8),
           col = 3, lty = 2);
      points(x, cos(x), pch = 3, col = 4);
      
      add.layer("title");
      title("This is the title", cex.main = 1.1);
      
      add.layer("legend");
      legend(-1, 1.9, c("sin", "cos"), col = c(3, 4),
             text.col = "green4", lty = c(2, -1),
             pch = c(-1, 3), merge = TRUE, bg = "gray90");
      1. copy你写的命令进行执行,还是没出现legend图层,软件包加载的是Windows二进制包(含GTK+运行库),系统Vista Basic

      2. 嗯,那或许是程序还不完善吧,等我日后再修复一下这个问题。你在别的电脑上也会有同样的问题吗?

  4. 作者你好:
    感谢你的礼物啊,不过在我的机子上运行有以下错误,我菜鸟请教以下。
    如:1.打入plot(x,sin(x),type=”1″,ylim=c(-1.2,1.8),col=3,lty=2)
    会提示绘图种类‘1’不对,然后把type=1删掉后就可以通过,为啥?
    2.当打入get.layers()后,为什么ID只有一个,而你的有三个不同ID,程序完全照你抄的(除了在1中说删去type-=1),为啥?
    再次感谢你的无私奉献!

  5. 作者你好:
    第二问题已经解决了,第一个问题还是求解
    谢谢!

      1. 能不能选择图层进行修改,现在好像只有置顶的图层才能修改。

      2. 可以啊,就是用set.current.layer(),视频里面有介绍。

  6. 非常感谢,我说找来找去没有示范程序,原来在视频里,原谅我,我们这网速太慢,看到视频从来都是跳过,可否楼主请教线性回归作图,如何默认作图把x轴标记为变量名(上百个变量),谢谢。

    1. 一张A4纸,宽度约20厘米,若要放100个变量名,则每个变量名有2毫米的宽度,我给你一根铅笔,请你在2毫米宽下写变量名,你能完成吗?

      另:无关问题请到论坛问 http://cos.name/cn/

      1. 谢老师这么说,我们搞生物的情何以堪啊。

      2. 我没说搞生物的怎样,我是让你想想这件事情是否具有可操作性。

        本文是讨论layer设备,并非R作图,所以我建议你把无关问题移到论坛讨论。

  7. 我是初学者,刚学会画图,感觉这个特有用了,下载软件包下载不了,能否发一份给我。谢谢!2006wjp@163.com

  8. 您好,我一直苦恼于图形legend的调整,但是上面的链接下载不了,能否提供一份。谢谢。hbzhoukuang@163.com

发表评论

邮箱地址不会被公开。 必填项已用*标注