R语言在数据处理上的禀赋之——可视化技术(一)

本文首发 https://program-dog.blogspot.com

R语言在可视化上可谓非常出众,想必这也是为什么R语言在数据处理方面受到追捧的原因之一。

上一节已经大体了解了R语言的基本数据类型,以及优势所在。R的可视化技术同样也是优势大大滴。这也是R的数据类型为可视化立下汗马功劳,为啥这样说呢?


Java的可视化技术

我们再拿Java开刀,和做一下对比。希望Java他老爹不要见怪。大家都知道,java做图真心说不上漂亮,为什么又拿java做对比呢?原因之一是我对java比较熟悉一点,之二是接下来对比的不是做图是否美观,而是做图的思路。而这个做图的思路,众语言都是大同小异,唯独R比较独特。

Java中,要想做出一副图,思路是,我想思考一下这附图上的 点、线、面可以怎样拆分,拆分好了我就分别画出 点、线、面,而要把点线面组合起来,要通过所谓的控件和容器。从而完成做图。下面举一个例子做出饼图:

代码来自这里,这个程序用了第三方包(否则程序更加复杂).

下面是代码:

import javax.swing.JPanel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.data.general.DefaultPieDataset;
import org.jfree.data.general.PieDataset;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;

public class PieChart_AWT extends ApplicationFrame
{
   public PieChart_AWT( String title )
   {
      super( title );
      setContentPane(createDemoPanel( ));
   }
   private static PieDataset createDataset( )
   {
      DefaultPieDataset dataset = new DefaultPieDataset( );
      dataset.setValue( "IPhone 5s" , new Double( 20 ) );
      dataset.setValue( "SamSung Grand" , new Double( 20 ) );
      dataset.setValue( "MotoG" , new Double( 40 ) );
      dataset.setValue( "Nokia Lumia" , new Double( 10 ) );
      return dataset;
   }
   private static JFreeChart createChart( PieDataset dataset )
   {
      JFreeChart chart = ChartFactory.createPieChart(
         "Mobile Sales",  // chart title
         dataset,        // data
         true,           // include legend
         true,
         false);

      return chart;
   }
   public static JPanel createDemoPanel( )
   {
      JFreeChart chart = createChart(createDataset( ) );
      return new ChartPanel( chart );
   }
   public static void main( String[ ] args )
   {
      PieChart_AWT demo = new PieChart_AWT( "Mobile Sales" );
      demo.setSize( 560 , 367 );
      RefineryUtilities.centerFrameOnScreen( demo );
      demo.setVisible( true );
   }
}

大家可以体会一下Java做图的复杂程度,如果你觉得Java还算简洁,那么且往下看。


R的可视化技术

牛刀小试

在R中做二维图有一个基本的函数plot 。比如我们有这样一组关于病人对不同药量(Dosage)和不同药物的反应的图表:

我们先创建三列数据:

dose <- c(20, 30, 40, 45, 60)
drugA <- c(16, 20, 27, 40, 60)
drugB <- c(15, 18, 25, 31, 40)

做图:

plot(dose, drugA,type="b")
title("Regression of MPG on Weight")

这样就做好了dose和drubA的一幅图。这里可以看出,dose和drubA 都被当作一个整体来对待了,又印证前面R在数据类型方面的优势。但是现在图表远没有那么漂亮,不用着急,plot自己就可以让图表变得漂亮,可定制化。

plot(dose, drugA,
     type="b",              # 图表类型,b为折线图
     bg="green",            # 背景颜色 绿色
     fg="blue",             # 前景颜色 蓝色
     col="red",             # 折线和点的颜色 红色
     col.axis="grey",       # 坐标轴文本颜色 灰色
     col.lab="#3EB4EA",     # 坐标轴标签颜色 我也叫不上来啥颜色
     lty=3,                 # 线类型(line type)
     lwd=3,                 # 线宽度 默认2
     pch=15,                # 点的类型 实心方块
     cex=2,                 # 指定符号大小 2为 200%
     col.main=rgb(1,1,1)    # 标题的颜色
)
title("Regression of MPG on Weight(Colorful)") 

几个参数就把图装饰的漂漂亮亮的。那么,R是如何做到的呢?这与R的做图思路有相当大的关系,在R中讲求的是参数配置,而非点线面本身。

二维做图利器plot的参数配置

权限机制

R中做图函数的参数有一些是可以共有的,比如颜色,标题,注释坐标轴等都需要颜色,还有字体等,这些就被分配到了公共参数列表之中(如par),还有参数是函数本身独有的,比如画图的坐标轴就只有plot函数自己有。我们应当区分对待函数共有的和独有的参数,这样我运用起了就自如了。

plot独有的参数

plot的参数如下

plot(x, y = NULL, type = "p",  xlim = NULL, ylim = NULL,
     log = "", main = NULL, sub = NULL, xlab = NULL, ylab = NULL,
     ann = par("ann"), axes = TRUE, frame.plot = axes,
     panel.first = NULL, panel.last = NULL, asp = NA, ...)

看起来可能有一点晕。参数中除了最后的 (来自par) 和title有关的main,sub,xlab,ylab之外,其他都是独有的。下面结合例子来说明常用的参数怎么用,其他的请自行查手册.

先列出解释:

x, y = NULL,        x,y坐标,y为空时候自动补上y
type = "p",         图的类型
xlim = NULL,        x坐标轴的取值范围,如c(1,10)
ylim = NULL,        y坐标轴的取值范围
ann = par("ann"),   要不要话标签
axes = TRUE,        要不要画轴
x=seq(1,10,len=100)
y=x^2
plot(x,y,
    type="l",
    xlim=c(-3,13),
    ylim=c(-5,130),
    ann=FALSE,
    axes=FALSE
)
title("没有轴,没有标签")

效果图:

plot的type介绍

type指的是做图的类型,有必要介绍一下。

先列出参数:

"p" 点(points)
"l" 线(lines)
"b" 点和线(both)
"c" 线的部分(the lines part alone of "b")
"o" 线穿点 (both ‘overplotted’)
"h" 柱 (‘histogram’ like (or ‘high-density’) vertical lines)
"s" 阶梯(stair steps)
"S" 阶梯(other steps)
"n" 啥都不画 (no plotting)

做图:

opar <- par(no.readonly = TRUE)
par(mfrow=c(2,4))    #设置布局
x=1:10
y=x
plot(x,y,type="p",main="p")
plot(x,y,type="l",main="l")
plot(x,y,type="b",main="b")
plot(x,y,type="c",main="c")
plot(x,y,type="o",main="o")
plot(x,y,type="h",main="h")
plot(x,y,type="s",main="s")
plot(x,y,type="S",main="S")
par(opar)

效果图:

说完plot独有的参数,应该说一说其他的plot共有的或者plot也没有的参数了。

title介绍

title 不仅仅指的主(main)题目,还包括副(sub)题目,x,y轴的标签以及题目和图的距离(line)和题目是否在图内(outer).

title的参数如下:

title(main = NULL, sub = NULL, xlab = NULL, ylab = NULL,
      line = NA, outer = FALSE, ...)

前四个参数的含义如下:

main 图像上面的主题目
sub  图像下面的副题目
xlab x轴标签
ylab y轴标签

这四个参数不仅在title中可用,在其他函数里面也可用(如plot直接可用)。

另外两个参数含义如下:

line 题目和图像的距离,距离太大就看不到题目了
outer 是一个布尔值,TRUE 的时候题目不会和图像在一起,默认FALSE

这两个参数是title独有,不可以在plot中直接用。

其他参数,诸如 代表的是,这些参数可以从par中取。

title中的main可接受list参数。

x=seq(1,10,len=100)
y=sin(x)
plot(x,y,type="l")
title(
  main=list( # main can be a list or not ,up to you
      "You can use main like this",
      cex=1.3,
      col="blue",
      font=3
  ),
  sub = "sub title",
  col.sub="green"  #from par
)

效果图:

公共参数集合——par

上面简单介绍了plot和title函数独有的部分,下面具体介绍一下公共参数集合par。这个函数包括了大多数plot的定制信息,简单举一个小例子:

par(no.readonly=TRUE)->opar #备份par

par(lty=2)                  #通过par设置参数
par(pch=17)
par(lty=2, pch=17)

dose <- c(20, 30, 40, 45, 60)
drugA <- c(16, 20, 27, 40, 60)
drugB <- c(15, 18, 25, 31, 40)
plot(dose, drugA, type="b")
title("Regression of MPG on Weight")
par(opar)                   #还原par

用par画出来的图。

那么par到底是个啥东东呢?简而言之,par只不过储存着plot的众多参数而已,plot在做图前,会去读par里面的变量,如果自己没有设置,就按照par里面的设置操作。我们把par打开看看是个什么东西:

> summary(par())
          Length Class  Mode
xlog      1      -none- logical
ylog      1      -none- logical
adj       1      -none- numeric
ann       1      -none- logical
ask       1      -none- logical
bg        1      -none- character
bty       1      -none- character
cex       1      -none- numeric
cex.axis  1      -none- numeric
cex.lab   1      -none- numeric
cex.main  1      -none- numeric
cex.sub   1      -none- numeric
cin       2      -none- numeric
col       1      -none- character
col.axis  1      -none- character
col.lab   1      -none- character
col.main  1      -none- character
col.sub   1      -none- character
cra       2      -none- numeric
crt       1      -none- numeric
csi       1      -none- numeric
cxy       2      -none- numeric
din       2      -none- numeric
err       1      -none- numeric
family    1      -none- character
fg        1      -none- character
fig       4      -none- numeric
fin       2      -none- numeric
font      1      -none- numeric
font.axis 1      -none- numeric
font.lab  1      -none- numeric
font.main 1      -none- numeric
font.sub  1      -none- numeric
lab       3      -none- numeric
las       1      -none- numeric
lend      1      -none- character
lheight   1      -none- numeric
ljoin     1      -none- character
lmitre    1      -none- numeric
lty       1      -none- character
lwd       1      -none- numeric
mai       4      -none- numeric
mar       4      -none- numeric
mex       1      -none- numeric
mfcol     2      -none- numeric
mfg       4      -none- numeric
mfrow     2      -none- numeric
mgp       3      -none- numeric
mkh       1      -none- numeric
new       1      -none- logical
oma       4      -none- numeric
omd       4      -none- numeric
omi       4      -none- numeric
page      1      -none- logical
pch       1      -none- numeric
pin       2      -none- numeric
plt       4      -none- numeric
ps        1      -none- numeric
pty       1      -none- character
smo       1      -none- numeric
srt       1      -none- numeric
tck       1      -none- numeric
tcl       1      -none- numeric
usr       4      -none- numeric
xaxp      3      -none- numeric
xaxs      1      -none- character
xaxt      1      -none- character
xpd       1      -none- logical
yaxp      3      -none- numeric
yaxs      1      -none- character
yaxt      1      -none- character
ylbias    1      -none- numeric  

我们已然发现,里面有我们刚刚用过的比如bg,fg,col等。par 是一个函数,它的返回值是一个链表(List) .改变par的参数,就改变了plot的参数。

par的权限机制

par中那么多参数,并不是每一个都可以被设定,也不是每一个都可以被任何函数所调用的。这正如一个人的家里,不是每个人可以随便进入或做出改变。权限机制有什么好处呢?可以想象一下,如果没有权限机制,那么每一个做图的函数都要自己定义一套参数,或者大家所有的都要用公共的参数,这带来的不是浪费就是滥用,因此,par意识到有必要设定权限机制。

一些readonly的参数,用R.O.标识:

"cin",
"cra",
"csi",
"cxy",
"din"
"page"

仅仅可以通过par设置的参数:

"ask",
"fig", "fin",
"lheight",
"mai", "mar", "mex", "mfcol", "mfrow", "mfg",
"new",
"oma", "omd", "omi",
"pin", "plt", "ps", "pty",
"usr",
"xlog", "ylog",
"ylbias"

可以被其他函数调用的参数:剩余其他。

总结

鉴于篇幅长度,par的使用下一节再介绍。

R语言天生就有可视化的优越条件,简单而且可配置性强。让人专注于数据处理而非代码本身,这又是R语言在数据处理上的禀赋。

时间: 2024-10-10 22:15:03

R语言在数据处理上的禀赋之——可视化技术(一)的相关文章

R语言-画图(上)

今天,Mayuyu来开始学习用R语言画图,R语言画图有着实际的应用,很多数据通过图形展现出来更加易于理解. 1. 画直方图 代码如下 画图结果 2. 画三点图 代码如下 画图结果 3. 画柱状图 在画柱状图之时,会用到列联函数table(),之后用barplot()函数画柱状图.代码如下 画图结果 4. 饼图 先通过列联函数table()求出x的分布情况.代码如下 画图结果 5. 箱尾图与箱线图 普通箱尾图    画图结果    画水平放置的箱尾图    画图结果    箱线图 画图效果 6.

R语言做地图上的分析

R和ggplot可视化功能非常强大,了解了一下其中的地图做法,发现R做世界地图.美国地图非常容易,但做中国地图就太麻烦了,需要自己DIY. DIY也有多种方式,但网络上各种帖子教程的出图效果都不太理想,达不到工作用要求.下面是我的摸索过程,记录如下备忘,也请教于R老师们. 参考书目:ggplot2,R graphics cookbook,参考贴:http://site.douban.com/182577/widget/notes/10568279/note/257898418/ 0.引子 R里有

R语言 在linux上的安装

R for Linux 安装指南 1.下载 wget http://mirror.bjtu.edu.cn/cran/src/base/R-3/R-3.2.1.tar.gz 2.解压: tar -zxvf R-3.2.1.tar.gz cd R-3.2.1 3.安装必备软件 sudo yum install readline-devel sudo yum install libXt-devel sudo yum install gcc-gfortran sudo yum install gcc g

R语言之数据处理

一.向量处理 1.选择和显示向量data[1]data[3]data[1:3]data[-1]:除第一项以外的所有项data[c(1,3,4,6)]data[data>3]data[data<5|data>7]:小于5或大于7的所有项which(data == max(data)):显示数值最大的那个项序号data[seq(1,length(data),2)]:每隔一段取出特定值,1为从第一项开始,length(data)表示到向量的最后一项结束,2表示间隔两项 2.向量的排序 sort

R语言在柱状图上添加文字

代码示例: data <- data.frame(A = 1:2, B = 1:2, C = 1:2) data <- data.matrix(data) par(font = 2, lwd = 2) barplot(data, col = c("black", "white"), beside = T, ylim = c(0, 2.5), font = 2) text( x = b[,1], y = 0.05 + data[,1], adj = c(0

R语言:用简单的文本处理方法优化我们的读书体验

前言 延续之前的用R语言读琅琊榜小说,继续讲一下利用R语言做一些简单的文本处理.分词的事情.其实就是继续讲一下用R语言读书的事情啦,讲讲怎么用它里面简单的文本处理方法,来优化我们的读书体验,如果读邮件和读代码也算阅读的话..用的代码超级简单,不涉及其他包 这里讲两个示例,结尾再来吐槽和总结. 1)R-Blogger订阅邮件拆分 2) R代码库快速阅读方法 不在博客园上阅读时才会看到的,这篇博文归 http://www.cnblogs.com/weibaar所有 仅保证在博客园博客上的排版干净利索

《美团 R 语言数据运营实战》

美团 R 语言数据运营实战 2018年08月02日 作者: 喻灿 刘强 文章链接 3689字 8分钟阅读 一.引言 近年来,随着分布式数据处理技术的不断革新,Hive.Spark.Kylin.Impala.Presto 等工具不断推陈出新,对大数据集合的计算和存储成为现实,数据仓库/商业分析部门日益成为各类企业和机构的标配.在这种背景下,是否能探索和挖掘数据价值,具备精细化数据运营的能力,就成为判定一个数据团队成功与否的关键. 在数据从后台走向前台的过程中,数据展示是最后一步关键环节.与冰冷的表

R语言 让纵坐标的标签显示为横向

参考自153分钟学习R语言 坐标y 上的数字如何水平放置?仍然是绘图参数问题: ?par # see  lasplot(0, 0, xaxt="n" , type="n" , ylim=c( 0, 100) , las=1 )mtext ("35" , side =2, at=35, line =1, las=1)

R语言笔记 R中设置图形参数--函数par()详解

R有着非常强大的绘图功能,我们可以利用简单的几行代码绘制出各种图形来,但是有时候默认的图形设置没法满足我们的需要,甚至会碰到各种各样的小问题:如坐标轴或者标题出界了,或者图例说明的大小或者位置遮挡住了图形,甚至有时候默认的颜色也不能满足我们的需求.如何进行调整呢?这就用到了"强大"的函数par().我们可以通过设定函数par()的各个参数来调整我们的图形,这篇博文就是对函数par()的各个参数进行一下总结. 函数par()的使用格式如下: par(..., no.readonly =