20 Julia统计图形—Gadfly
20.1 介绍
Julia语言没有内建作图能力, 作图需要通过扩展包提供, 因为Julia语言的历史还比较短, 现在有多种作图用的扩展包但是没有一个占绝对优势的包。 比较常用的有Gadfly, Plots, PyPlot包。 Julia还在快速发展阶段, 功能的兼容性不够稳定, 作图功能尤其如此。 本文演示Gadfly包作图。
本文作者先安装了Anaconda3, 然后安装Julia1.4。 在使用Jupyter界面时, Gadfly支持将图形结果直接显示到“笔记本”页面中。 在使用Juno界面时, 可以将作图结果显示在Atom编辑器的一个窗格中。
Gadfly包是模仿了R语言的ggplot2包的做法, 其作图函数设计比较典雅, 按照一种专门图形语言的方法设计, 作图结果比较美观, 图形类型也比较丰富。 参见本文作者R语言教程中的ggplot作图介绍:
Gadfly包的文档:
linspace(from, to, n) = range(from, to, length=n)
作图需要用一些例子数据。
如下的class.csv
中包含了19个学生的姓名、性别、年龄、身高、体重信息:
name,sex,age,height,weight
Sandy,F,11,130,23
Karen,F,12,143,35
Kathy,F,12,152,38
Alice,F,13,144,38
Becka,F,13,166,44
Tammy,F,14,160,46
Gail,F,14,163,41
Sharon,F,15,159,51
Mary,F,15,169,51
Thomas,M,11,146,39
James,M,12,146,38
John,M,12,150,45
Robert,M,12,165,58
Jeffrey,M,13,159,38
Duke,M,14,161,46
Alfred,M,14,175,51
William,M,15,169,51
Guido,M,15,170,60
Philip,M,16,183,68
读入:
using CSV, DataFrames
= CSV.read("class19.csv", DataFrame) d_class
19 rows × 5 columns
name | sex | age | height | weight | |
---|---|---|---|---|---|
String7 | String1 | Int64 | Int64 | Int64 | |
1 | Sandy | F | 11 | 130 | 23 |
2 | Karen | F | 12 | 143 | 35 |
3 | Kathy | F | 12 | 152 | 38 |
4 | Alice | F | 13 | 144 | 38 |
5 | Becka | F | 13 | 166 | 44 |
6 | Tammy | F | 14 | 160 | 46 |
7 | Gail | F | 14 | 163 | 41 |
8 | Sharon | F | 15 | 159 | 51 |
9 | Mary | F | 15 | 169 | 51 |
10 | Thomas | M | 11 | 146 | 39 |
11 | James | M | 12 | 146 | 38 |
12 | John | M | 12 | 150 | 45 |
13 | Robert | M | 12 | 165 | 58 |
14 | Jeffrey | M | 13 | 159 | 38 |
15 | Duke | M | 14 | 161 | 46 |
16 | Alfred | M | 14 | 175 | 51 |
17 | William | M | 15 | 169 | 51 |
18 | Guido | M | 15 | 170 | 60 |
19 | Philip | M | 16 | 183 | 68 |
Gadfly用plot()
函数作各种图。
可以用Gadfly.plot()
避免冲突,
如果没有其它作图包,
可以直接使用plot()
。
20.2 条形图
对分类变量, 在进行频数统计后可以做频数条形图。 比如,性别的条形图:
using Gadfly, DataFrames
= groupby(d_class, :sex) |>
dc_freq1 -> combine(gdf, nrow => :Freq) gdf
2 rows × 2 columns
sex | Freq | |
---|---|---|
String1 | Int64 | |
1 | F | 9 |
2 | M | 10 |
plot(dc_freq1, x=:sex, y=:Freq, color=:sex, Geom.bar()) Gadfly.
与R语言的hist()
函数相比,
Gadfly的直方图判断分组数的功能较弱,
而且分组也不选择分在数字比较整齐的位置。
用如下程序作核密度估计图:
plot(d_class, x=:height, Geom.density()) Gadfly.
20.3 盒形图(Boxplots)
盒形图又称箱线图、盒须图等。用Geom.boxplot()
。
如
= copy(d_class)
dtmp :grp] .= ""
dtmp[!,plot(dtmp, x=:grp, y=:height, Geom.boxplot(),
Gadfly.xlabel("")) Guide.
盒形图中x=
是分组用,如
plot(d_class, x=:sex, y=:height, Geom.boxplot()) Gadfly.
小提琴图是一种变种的盒形图, 其边界用了核密度曲线,如:
plot(d_class, x=:sex, y=:height, Geom.violin()) Gadfly.
20.4 散点图
对数据集中两个变量x
和y
,用类似下面的程序作散点图:
plot(d_class, x=:height, y=:weight) Gadfly.
可以用color
选项指定按照某个变量的值添加不同颜色:
plot(d_class, x=:height, y=:weight, color=:sex) Gadfly.
可以用shape
指定一个变量,
用不同形状的点表示该变量的不同值:
plot(d_class, x=:height, y=:weight, shape=:sex) Gadfly.
可以为散点图增加Loess局部多项式平滑曲线:
= round.(5*rand(30), digits=1)
x = 200 .+ 2 .* x .^2 .+ 2*randn(30)
y plot(x=x, y=y, Geom.smooth(), Geom.point(),
Gadfly.title("二次多项式用局部回归平滑")) Guide.
除了可以用Guide.title()
增加标题,
还可以用Guide.xlabel()
指定x轴标签,
用Guide.ylabel()
指定y轴标签。