之前一直觉得算法666,学习重点应该放在各种花样算法中,工作中老大让一天分析多个东西的话,来不及细究,只能用excel出结论,才发现自己只会画个简单的线形图柱状图之类,弱爆了…… 画图如此重要……想要的图出不来,憋死了……,转战ggplot
转载地址:点击打开链接
关于ggplot2包的基本功能介绍(下)
7. Statistical transformations
下面我们来看一下条形图。条形图看起来很简单,但却很有意思,因为它们揭示了一些图表中的微妙的信息。一个基本的条形图由geom-bar()语句来绘制。下面这幅图根据钻石数据组中的cut变量将其进行了分组。钻石数据组是ggplot2中自带的数据组,包含了大概54000颗钻石的信息,信息包括每颗钻石的price, carat, color, clarity和cut变量。图表表明了切割工艺较好的钻石其使用率会更高。
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut))
X轴代表钻石的cut变量,Y轴表示数量,但是这里的数量并不是其数据组中的变量。那么这个数量的数据是从哪里来的呢?一些图表例如散点图等会直接将原始数据绘制在图表上,而另一些图表例如条形图则会自动计算新的数值来绘制:
- 条形图,直方图和频率多边形图将数据存储在一起,然后计算每一个箱体中的数据数量。
- 通常使用更平滑的模型来表示你的数据,这样你可以通过模型来进行预测。
- 箱线图会计算一个更强大的分布概要,并且把它显示在一个特定格式的箱中。
计算程序为图表计算新值的过程被称作stat,这是Statistical transformations的略称。下面的数据展示了这个过程是如何通过geom-bar()函数来进行的。
你可以通过检查stat参数的默认值来了解geom使用哪个stat。例如,?geom-bar里说明了stat的默认的值是count,意思是geom_bar()函数会自动使用stat_count()。stat_count()记录在于geom_bar()相同 的页面上,如果向下滚动,您可以找到一个名为“计算变量”的部分。这部分会告诉它计算了两个新的变量:count和prop。
通常可以互换使用几何和统计。 例如,你可以使用stat_count()而不是geom_bar()重新创建前面的图。
ggplot(data = diamonds) +
stat_count(mapping = aes(x = cut))
这是因为每个geom都有默认的stat值,同样每个stat都有一个默认的geom。 这意味着你通常可以使用geom而不用担心底层的统计变换。 你可能需要明确使用stat的三个原因:
1.你可能想要修改默认的stat值。 在下面的代码中,我将geom_bar()的stat从count(默认)更改为identity。 这样可以将条形图的高度映射到y变量的原始值。 不幸的是,当人们随便谈论条形图时,他们可能是指这种类型的条形图,其中条的高度已经存在于数据中,或者前一个条形图中,通过计数行来生成条的高度。
demo <- tribble(
~a, ~b,
"bar_1", 20,
"bar_2", 30,
"bar_3", 40
)
ggplot(data = demo) +
geom_bar(mapping = aes(x = a, y = b), stat = "identity")
2.你可能希望改变从变量到图表时的默认映射。 例如,你可能需要显示表示比例的条形图,而不是计数:
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut, y = ..prop.., group = 1))
要查找由stat计算的变量,请查找名为“计算变量”的帮助部分。
3.你可能希望更加注意代码中的统计转换。 例如,你可以使用stat_summary(),它总结每个唯一x值的y值,以引起对你计算的摘要的注意:
ggplot(data = diamonds) +
stat_summary(
mapping = aes(x = cut, y = depth),
fun.ymin = min,
fun.ymax = max,
fun.y = median
)
ggplot2提供超过20个统计信息供你使用。 每个统计都是一个功能,所以你可以用通常的方式获得帮助,例如 ?stat_bin。 要查看完整的统计列表,请尝试使用ggplot2的cheatsheet。
7.1练习
1.与stat_summary()关联的默认几何图表是什么?
2. geom_col()的功能是什么? 它与geom_bar()有什么不同?
3. 大多数的geom和stat都是成对的。阅读文档并列出所有对,他们有什么共同点?
4. stat_smooth()计算什么变量?什么参数控制其行为?
5.在我们的比例条形图中,我们需要设置group = 1为什么?换句话说,这两个图表有什么问题?
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut, y = ..prop..))
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut, fill = color, y = ..prop..))
8. Position adjustments
还有一个与条形图相关的神奇功能,你可以使用colour或更有用地fill来绘制不同颜色的条形图:
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut, colour = cut))
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut, fill = cut))
请注意,如果将fill的功能映射到另一个变量,会发生什么,如清晰度:条形图被自动堆叠。每个彩色矩形表示切割和清晰度的组合。
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut, fill = clarity))
堆叠条形图会通过位置参数进行自动位置堆叠。如果您不想使用堆叠条形图,则可以使用“identity”,“dodge”或“fill”三种其他选项之一。
- position =“identity”将使图表中的每个变量都单独成完整的一条。这对于条形图来说不是很有用,因为它们之间相互重叠。为了看到这个重叠,我们需要通过将alpha设置为一个小的值,使其稍透明,或者通过设置fill = NA使其完全透明。
ggplot(data = diamonds, mapping = aes(x = cut, fill = clarity)) +
geom_bar(alpha = 1/5, position = "identity")
ggplot(data = diamonds, mapping = aes(x = cut, colour = clarity)) +
geom_bar(fill = NA, position = "identity")
- position =“fill”和堆叠图类似,但是它可以使每组堆叠的条形都具有相同的高度,这样可以更容易地比较组间的比例。
ggplot(data = diamonds) +
geom_bar(mapping = aes(x = cut, fill = clarity), position = "fill")
- position =“dodge”将重叠对象直接放在一起,这会使得单个值的比较更容易。
还有一种其他类型的调整对条形图不起作用,但它对散点图非常有用。 回顾我们的第一个散点图。注意到没有,图表只显示了126个点,即使我们有234个观测值。
hwy和displacement的值被舍入取整,所以网格上的许多点都互相重叠。 这个问题被称为overploting, 这种安排使得它很难看到的数据的聚集情况。 数据点是否在整个图形中均匀分布,还是有一个包含其余108个值的hwy和displ的特殊组合方式?
你可以通过设置“jitter”参数来避免这种情况。 position =“jitter”给每个点添加少量随机噪声。 由于没有两点可能会接收到相同的随机噪声量,所以这使得数据点的分布得以扩展。
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy), position = "jitter")
添加随机噪音来改善你的图表似乎是一个奇怪的方法,虽然它在小规模的图表上降低了数据的精确度,但是同时它也使得大型图表能够表现出更多信息。 因为个功能非常有用,所以ggplot2提供了geom_point(position =“jitter”)的缩写方式:geom_jitter()。
要了解有关位置调整的更多信息,请查找与每个调整相关联的帮助页面:
?position_dodge,?position_fill,?position_identity,?position_jitter和?position_stack。
8.1练习
1.下面这幅图表有什么问题?怎么来改善它?
ggplot(data = mpg, mapping = aes(x = cty, y = hwy)) +
geom_point()
2. geom_jitter()的哪些参数控制jittering的数量?
3.将geom_jitter()与geom_count()进行对比。
4. geom_boxplot()的默认位置是什么样的? 创建一个mpg数据组的可视化图表。
9. Coordinate systems
坐标系可能是ggplot2中最复杂的部分。 默认坐标系是笛卡尔坐标系,其中可以对x和y位置独立地进行操作,以查找每个点的位置。 我们也偶尔会使用到一些其他类型的坐标系。
coord_flip()可以转换x轴和y轴。 这很有用,例如你想要画一个箱线图,但是它的标签很长,如果竖直放置的话很难让它的标签在x轴上没有重叠,这时就可以将箱线图竖直放置。
ggplot(data = mpg, mapping = aes(x = class, y = hwy)) +
geom_boxplot() +
coord_flip()
coord_quickmap()函数可以正确设置地图的宽高比。 如果你要用ggplot绘制一个空间的数据,那么这个功能是非常重要的。
nz <- map_data("nz")
ggplot(nz, aes(long, lat, group = group)) +
geom_polygon(fill = "white", colour = "black")
ggplot(nz, aes(long, lat, group = group)) +
geom_polygon(fill = "white", colour = "black") +
coord_quickmap()
coord_polar()函数可以使用极坐标。 极坐标向我们展示了条形图和Coxcomb图之间的关系。
bar <- ggplot(data = diamonds) +
geom_bar(
mapping = aes(x = cut, fill = cut),
show.legend = FALSE,
width = 1
) +
theme(aspect.ratio = 1) +
labs(x = NULL, y = NULL)
bar + coord_flip()
bar + coord_polar()
9.1练习
1.使用coord_polar()将堆叠条形图转成饼图。
2.labs()的功能是什么? 阅读文档。
3. coord_quickmap()和coord_map()有什么区别?
4.下面的图表告诉了你关于cty和hwy之间的哪些信息? 为什么coord_fixed()函数很重要? geom_abline()有什么功能?
ggplot(data = mpg, mapping = aes(x = cty, y = hwy)) +
geom_point() +
geom_abline() +
coord_fixed()
10. The layered grammar of graphics
在前面的章节中,你学到的不仅仅是如何制作散点图,条形图和箱线图。 你学到的是一些最基础的知识,有了这些基础知识你就可以做任何图表。 为了看到这一点,我们在我们的代码模板中添加位置调整参数,统计信息,坐标系和faceting:
ggplot(data = <DATA>) +
<GEOM_FUNCTION>(
mapping = aes(<MAPPINGS>),
stat = <STAT>,
position = <POSITION>
) +
<COORDINATE_FUNCTION> +
<FACET_FUNCTION>
我们的新模板需要七个参数,也就是模板中显示的括号中的单词。 在实践中,你很少需要提供所有七个参数来制作图表,因为ggplot2将为除数据,映射和geom函数之外的所有内容提供有用的默认值。
模板中的七个参数组成了图表的语法,这是一个正式的用于 绘制图表的语法系统。 图表语法是基于以下几点构建而成,你可以通过数据集,几何图形,一组映射,统计量,位置调整,坐标系和faceting的组合来唯一的绘制一个图表。
要了解它是如何工作的,请考虑如何从头构建一个基本图表:你可以从数据集开始,然后将其转换为想要显示的信息(通过统计功能)。
接下来,你可以选择几何图形来表示转换后的数据中的每个观察值。 然后,你可以使用图形的各种特性来表示数据中的变量,再将变量值映射到图形上。
然后,你将选择一个坐标系来放置图形。你将使用这些图形的位置(这本身就是一种视觉特性)来表示x和y变量的值。 到这一步,你已经创建了一个完整的图表,但是你还可以进一步调整坐标系中的各图形位置(a position adjustment)或将图形分割成子图(分面)。 你还可以通过添加一个或多个附加图层来扩展图表,其中每个附加图层都可以使用数据集,几何图形,一组映射,统计量和位置调整等参数信息。
你可以使用此方法构建你能想到的任何图表。 换句话说,你可以使用本章中学到的代码模板构建成百上千个独特的图表。
总结:
翻译这篇文章花了大概20小时,收获很大,不仅是在文章的内容上,更多的是锻炼了一种静下心来看英文文献的能力。kaggle上有很多精彩的数据分析和建模的案例,不得不说这些资料的质量要远高于我们在百度上搜到的一些结果,所以想要学号数据分析,英文是必须要迈过的一个槛(也要利用好google翻译)。
另外由于对数据可视化方面很感兴趣,也入手了一本大数据社群内前辈推荐的《ggolot2数据分析与图形艺术》,这本书对ggolot2的各项功能和函数有较为全面的讲解(打算简单读一遍然后当作字典来用),建议对这方面感兴趣的同学可以买回来看一看。ggplot2的优越性在于它创建了一套完整的绘图语法,相较于R自带的绘图语法,ggplot2使用起来更加简单明了,并且由于ggolot2是通过图层叠加的方式来绘图,所以它的灵活性也更大,但可惜目前ggplot2还只能用于绘制二维图表,希望能尽快推出三维图表的工具包。