简介:
ggplot2的层式结构使得系统的绘图成为可能。你现在已经知道了什么是图层和如何将图层添加到自己所绘制的图像上,但是什么类型的图形才能最合理的对数据进行展示呢?这一部分将根据不同的功能将图形进行分类介绍。
在添加新的图层之前,最好先想一想你想用这一图层达到什么目的。下面是图层最为常见的几种作用:
·数据的展示。
原始数据的绘制很重要,我们要手工对整体以及局部的数据结构和异常值进行判断。在数据处理的早期阶段,数据图层往往就是唯一的图层。
·统计结论的展示。
在我们对数据模型进行研究的时候,在原始数据上同时添加模型预测结果也是很好的选择。我们可以根据统计检验来评估模型的好坏。将原始数据与模型放在一起,既有利于我们查看模型的好坏,又有利于我们对原始数据更加深入的观察。
·宏数据、背景以及注释的添加。
宏数据层可以添加背景信息以及注释,从而让我们更好地理解原始数据。宏数据层既可以放在底层又可以放在顶层。在在绘制地理数据时,地图往往被放在底层。放在底层的宏数据有最小的可视性,因此不会干扰你对原始数据的观察。这就意味着,如果你关心宏数据,你可以容易地观察到它,但如果你只想认真检视数据,宏数据又一点也不会干扰到你。
还有一些宏数据是为了强调重要的信息。你有时可能要对一些重要的拐点和异常值添加注释信息,那你就希望这些东西可以夺人眼球,这种情况下,宏数据最好放在最后添加。
基本绘图类型:
这些几何元素是ggplot的基础。他们彼此结合可以构成复杂的图像。他们中的绝大多数对应特定的绘图类型。
geom_area()
geom_bar()
geom_line()
geom_point()
geom_polygon()
geom_text()
geom_tile()
下面是例子哟:
df <- data.frame(x = c(3, 1, 5),y = c(2, 4, 6),label = c("a","b","c"))
p <- ggplot(df, aes(x, y, label = label)) +xlab(NULL) + ylab(NULL)
p + geom_point() + opts(title = "geom_point")
p + geom_bar(stat="identity") +opts(title = "geom_bar(stat=\"identity\")")
#stat="identity"一定要有的,不然R会自己数个数去的
p + geom_line() + opts(title = "geom_line")
p + geom_area() + opts(title = "geom_area")
p + geom_path() + opts(title = "geom_path")
p + geom_text() + opts(title = "geom_text")
p + geom_tile() + opts(title = "geom_tile")
p + geom_polygon() + opts(title = "geom_polygon")
数据分布的的表示:
显示数据分布规律的方法有很多,这取决于数据的维数,离散还是连续数据,你是对条件分布感兴趣还是对联合分布感兴趣。
对于一维的连续数据最重要的分布图就是直方图。下图是diamond depth的分布直方图。bin的参数对于直方图的外观相当重要,可以用binwidth或break参数进行设置。
depth_dist <- ggplot(diamonds, aes(depth)) + xlim(58, 68)
depth_dist +geom_histogram(aes(y = ..density..), binwidth = 0.1) +facet_grid(cut ~ .)
depth_dist + geom_histogram(aes(fill = cut), binwidth = 0.1,position = "fill")
depth_dist + geom_freqpoly(aes(y = ..density.., colour = cut),binwidth = 0.1)
大数据的处理:
散点图对于估计两个连续变量之间的关系非常有用。但是如果数据量很大的时候,点与点之间就会相互重叠,从而掩盖两变量之间真实的关系。有些情况下,你可能只能在图中看出数据大体的分布范围,因此任何的结论都是值得怀疑的。这一问题被称为“overplotting”,解决方法主要有以下几种:
·对于少数点的overplotting,可以将点画的小一些,或者改变点的形状。如下图所示:
df <- data.frame(x = rnorm(2000), y = rnorm(2000))
norm <- ggplot(df, aes(x, y))
norm + geom_point()
norm + geom_point(shape = 1)
norm + geom_point(shape = ".")
·对于更大的数据集,可以用alpha参数设置数据点的透明度。在R中,透明度的最小值可以设到1/256,所以对于特别大的数据集也是无能为力。
norm + geom_point(colour = 'black', alpha=1/3)
norm + geom_point(colour = 'black', alpha=1/5)
norm + geom_point(colour = 'black', alpha=1/10)
·如果数据本身具有一定的离散性,那么可以随机抖动数据点以减少重叠。跟透明度设置联合应用效果最好。
td <- ggplot(diamonds, aes(table, depth)) +xlim(50, 70) + ylim(50, 70)
td + geom_point()
td + geom_jitter()
jit <- position_jitter(width = 0.5)
td + geom_jitter(position = jit)
td + geom_jitter(position = jit, alpha= 1/10)
td + geom_jitter(position = jit, alpha=1/50)
td + geom_jitter(position = jit, alpha=1/200)
·将数据分组并统计每组内数据的个数,然后将个数展示出来(二维直方图形式)。把图形分成许多的小块可以呈现出特殊的视觉效果。六边形也是可以的,bins和binwidth参数控制小格的数目和大小。(需要hexbin包)
d <- ggplot(diamonds, aes(carat, price)) + xlim(1,3) +opts(legend.position = "none")
d + stat_bin2d()
d + stat_bin2d(bins = 10)
d + stat_bin2d(binwidth=c(0.02, 200))
d + stat_binhex()
d + stat_binhex(bins = 10)
d + stat_binhex(binwidth=c(0.02, 200))