python:ggplot(2)- 图形画法

第一章:python:ggplot

第2节:python:ggplot图形画法

1,绘制散点图,geom_point()

读取外部数据进行绘图,例子:
>>> import pandas as pd
>>> from ggplot import *
>>> df=pd.read_table('C:\Users\lenovo\Desktop\mtcars.txt')
>>> df
··name type number volume size other
0 td T 96 3 20 c
1 sf F 87 5 65 c
2 cc F 79 9 80 d
#如果读取的数据没有column可以添加,例如:df.columns=['name','type','number','volume','size','other']
>>> p=ggplot(df, aes(x='number', y='volume', size='factor(size)', color='factor(other)'))+geom_point()
>>> print p
python:ggplot(2)- 图形画法

1)最简单的散点图

p=ggplot(df, aes(x='number', y='volume', size='size', color='other'))+geom_point()

2)color,size,shape的使用(对数据进行分组)

p=ggplot(aes(x='wt', y='mpg', color='cyl'), data=df)+geom_point()
如此产生的图形,其中的color颜色是一种渐变颜色,会根据“cyl”的值不同依照其值的大小,可产生颜色渐变的效果。
p=ggplot(aes(x='wt', y='mpg', color='factor(cyl)'), data=df)+geom_point()
如果color加入factor参数则产生离散型散点图效果,即图中三点颜色按照组别进行区分,不再是颜色渐变的效果

3)在数据层和几何图形层color的区别

在aes()当中color代表分类变量,使用“cyl”这个变量去当作颜色区分,而使数据进行分类,而color在geom_point()中则单纯的代表图形上色的意思。

4)透明度 alpha(作用:用于样本过多时区分具体数据)

ggplot(aes(x='carat', y='price', color='factor(color)'), data=diamonds)+geom_point()
python:ggplot(2)- 图形画法
往往在大样本量的情况下,颜色深的地方代表该位置的样本量多,而颜色浅的地方样本量少,但是如果过多的样本都集中在某个固定的狭小位置,后某些特定区域的话,由于点过多而无法区分较多的数量位点和过多的数量位点(例如100个位点和1000个位点)之间的差别。
所以要通过下面的三种方法,来解决某位点样本量过大而造成的无法区分问题(重点)
1> alpha(利用降低透明度的方法区分样本数量)在降低透明度能够更好的区分样本数量,原本样本量达到100的位点的颜色深度会小于样本量达到1000的位点的颜色深度。而样本量为10的位点则因为透明度很低则几乎在图中看不清晰了。
代码实例:
ggplot(aes(x='carat', y='price', color='factor(color)'), data=diamonds)+geom_point(alpha=0.1)
python:ggplot(2)- 图形画法
2> geom_jitter(加入扰动,表示随机的在密集位置的旁边进行扩散,则能够将图中重复出现的点显示出来)
表示如果某位点在图表当中重复出现多次,在原来图表中该点则只显示一次,而加入扰动之后,则会将该位置重复出现的点,随机向四周移动一小段距离,这样密集点的位置会相应的扩大,这个密集的点的面积会相应增加,重复出现的数值越多,则点越大。
代码实例:
ggplot(aes(x='carat', y='price', color='factor(color)'), data=diamonds)+geom_jitter(alpha=0.1)
python:ggplot(2)- 图形画法
3> dataframe.sample() (数据抽样方法,利用pandas的数据抽样方法,随机抽取一定数量的数据进行绘图)随机抽样可得到一定的样本数,而这些样本数具有总体样本数的一些特性,用部分具有代表性的样本来反应总体的样本情况。
df1=diamonds.sample(frac=0.03) #按照比例抽样,取总体数据的0.03(3%)
df2=diamonds.sample(n=2000) #按照函数抽样,取2000行数据,当然如果数据不是随机数据那2000行数据就不是随机收取,就不具有总体样本的代表性了,这一点一定要注意。
ggplot(aes(x='carat', y='price', color='factor(color)'), data=df1)+geom_point()
python:ggplot(2)- 图形画法
ggplot(aes(x='carat', y='price', color='factor(color)'), data=df2)+geom_point()

5)两层point的嵌套

ggplot(aes(x='wt', y='mpg'), data=mtcars)+geom_point(color='red', size=100)+geom_point(color='white', size=40)
python:ggplot(2)- 图形画法
这站图绘制的结果是在size为100的红色大圆内部加一个白色的size为40的小圆圈

6)分面与分组

之前提到过分组可以用color,size,shape将不同的组别进行区分,但不同的组别仍然在一张网格图当中显示结果,即一张图当中绘制所有数据。
而分面是指在不同的图当中绘制不同组别的数据
分面:facet_wrap()表示纵向切分,facet_grid()表示横向切分
ggplot(aes(x='wt', y='mpg', color='factor(cyl)'), data=mtcars)+geom_point()+facet_grid('cyl')
python:ggplot(2)- 图形画法
ggplot(aes(x='wt', y='mpg', color='factor(cyl)'), data=mtcars)+geom_point()+facet_wrap('cyl')
python:ggplot(2)- 图形画法
分面参数:fixed,free,free_x,free_y
通过参数可改变不同面的坐标刻度(还没找到实例)

7)美化

主要应用labs()、xlim()、ylim()这三个参数
ggplot(aes(x='wt', y='mpg', color='factor(cyl)'), data=mtcars)+geom_point()+labs(x='X', y='Y')+xlim(2,5)+ylim(15,30) #通过labs修改x轴名称和y轴名称,通过xlim()和ylim()修改x及y轴的范围。
python:ggplot(2)- 图形画法

8)筛选数据

pandas.simple(frac=0.03) 、pandas.simple(n=2000),进行随机抽样
pandas数据框操作(样本切片),可根据条件筛选结果
如:df4=df[df.pmg>20]

9)一个有诚意的散点图应该具备以下内容

1> DataFrame格式数据
2> 几何图形 – 散点图,线图等
3> 标度和坐标系 – 生成坐标轴和图例
4> 图形注释 – 背景和标识

2,线图与面积图(geom_point,geom_area)

1)基本线图,geom_point()

ggplot(mtcars, aes(x='wt', y='hp'))+geom_line()
线图的分组,即同一个Y轴但有多个类
线图的分面,即不同的图内展示结果
线图数据分类的标准
注意:在线图中连续型的数据不能作为aes(color=’gear’)分类,必须是离散型的数据才可作为分类,比如“T”和“F”,“male”和“famale”等。但可以使用color=’factor(gear)’方法把一个连续型的变量变为一个离散型变量。
例如:
ggplot(mtcars, aes(x='wt', y='hp', color='factor(gear)'))+geom_line()
python:ggplot(2)- 图形画法

2)线图的数据分组

ggplot(mtcars, aes(x='wt', y='hp', color='factor(gear)'))+geom_line()+facet_wrap('factor(gear)')
python:ggplot(2)- 图形画法

3)图形叠加

将线图和散点图叠加,即类似于在散点图中的点用线进行连接
例如:
ggplot(mtcars, aes(x='wt', y='hp', color='factor(gear)'))+geom_line(color='blue', alpha=0.5)+geom_point(color='red', size=40, alpha=0.5)
python:ggplot(2)- 图形画法

4)X轴的时间序列绘制,X轴刻度的自定义绘制

用时间序列,进行绘图,其图形特点为:X轴不变,是时间表示方式(即年月日,或小时分钟),而Y轴则是其它数据,其中最麻烦的问题是坐标轴值固定,即X轴,想要显示年份月份时间等信息。
可用scale标度方法实现X轴以data日期作为标准标度。即scale_x_date
例如:
scale_x_date(labels=date_format(%Y-%m-%d), limits=('1954-01-01', '2004-01-01') #解析:labels表示x轴样式,data_format表示日期样式分别是年,月,日;limits表示日期时间,从几年几月几日到几年几月几日。即起止时间,也可以只保留年份,月份,则以date_format(%Y-%m)这种形式编写
图形的完整写法为:
ggplot(meat, aes('date', 'beef'))+geom_line()+scale_x_date(labels=date_format('%Y-%m-%d'), limits=('1954-01-01', '2004-01-01'))
python:ggplot(2)- 图形画法
而加入scale_x_continuous(breaks=('1954-01-01', '2004-01-01')) 则表示只显示breaks当中出现的时间并以该日期为X轴刻度
ggplot(meat, aes('date', 'beef'))+scale_x_date(labels=date_format('%Y-%m-%d'), limits=('1954-01-01', '2004-01-01'))+scale_x_continuous(breaks=('1954-01-01', '2004-01-01'))+geom_line()
python:ggplot(2)- 图形画法
同时也可以通过数据筛选,只选择符合条件的数据进行绘图,例如meat2=meat[meat.date<’1970-01-01’]表示只筛选这个日期之前的数据进行绘图。
进行自定义绘制时,可使用scale_x_continuous()这个函数,例如scale_x_continuous(labels=['0', '0','100','200','300','400','500','600+'])可以使用help(scale_x_continuous())help(scale_y_continuous())查看其具体用法。

5)绘制双Y轴线性图

绘制一个具有单一X轴,而存在左右两个Y轴的线型图
可根据如下例子编写:
ggplot(aes(x='date', y='beef'), data=meat)+geom_line(color='red', alpha=0.5)+geom_line(aes(x='date', y='veal'), data=meat, color='blue', alpha=0.5)
python:ggplot(2)- 图形画法
上面实现的方法仍然是图形叠加的标准,但是利用是两种数据,这两个Y轴(两个geom_line()函数)均表示两类数据,第二个Y轴geom_line(aes(x='date', y='veal'), data=meat, color='blue', alpha=0.5)是在第一个数据ggplot(aes(x='date', y='beef'), data=meat)+geom_line(color='red', alpha=0.5)之外另外加入的一个数据图层。第二个Y轴的数据集,是在几何图形层中加入数据层的数据,这一思想非常重要。

6)面积图画法,geom_area()

面积图表示的是划线位置向下的面积进行涂色
ggplot(aes(x='date', y='beef'), data=meat)+geom_area(color='red', alpha=0.5) 但在面积图中,color起不到图形上色的作用,因为color上色只是将颜色绘制到面积图线条的边界,所以对于面积图需要用到fill进行色彩填充
ggplot(aes(x='date', y='beef'), data=meat)+geom_area(fill='red', alpha=0.5)
python:ggplot(2)- 图形画法

3,其他图形画法

1)条形图与直方图,geom_bar()(条形图),geom_histogram()(直方图)

直方图主要作用是看数据的部分区间,看某个维度的统计数量
绘制直方图需要连续型数据,而绘制条形图需要离散型数据
直方图和条形图在绘制时,实际上只有一个X轴,其Y轴对应的是X轴值的个数。 注意注意
ggplot(mpg, aes(x='class'))+geom_bar(fill='red', alpha=0.5)+labs(y='count')
python:ggplot(2)- 图形画法
ggplot(mpg, aes(x='hwy'))+geom_histogram(fill='red', alpha=0.5)+labs(y='count')
python:ggplot(2)- 图形画法
不建议绘制复杂的条形图或直方图,也不能够实现color,size和shape对条形进行分类,其中包括两点原因(第一,因为每个X轴,其条形的位置基本不可变;第二,在条形图中,填充、堆叠不能够使用)。但可利用分面的方法实现多图的绘制
对于直方图,可通过binwidth参数调整条形图的条状宽度。
ggplot(mpg, aes(x='hwy'))+geom_histogram(fill='red', alpha=0.5, binwidth=0.8)+labs(y='count')
python:ggplot(2)- 图形画法
ggplot(mpg, aes(x='fl'))+geom_bar(fill='red', alpha=0.5)+facet_wrap('class')+labs(y='count')
python:ggplot(2)- 图形画法
实现多组别分组,即对条形图的横轴元素的出现次数进行统计以后,并根据横轴与其他数据的对应关系进行分组,图中的每个分图都是数据的对应关系,例如第一个图形的标题为2seater,绘制的效果是,该数值与d、e、p、r出现对应关系的次数进行绘图

2)密度图,geom_density()

密度图可以理解为如果直方图的条形的宽度无穷小的话会在挑的顶端形成点的连线,接近一个现状,即为密度图
密度图也仅仅是有一个X轴,其Y轴也表示个数,这就是密度图和线图的区别
密度图接受的数据和直方图一样也是连续型数据
ggplot(aes(x='carat'), data=diamonds)+geom_density(color='red')
python:ggplot(2)- 图形画法
diamonds['carat'][diamonds['carat']>3]

3)箱线图,geom_boxplot()

ggplot(mpg, aes(x='factor(fl)', y='hwy'))+geom_boxplot(fill='red')
python:ggplot(2)- 图形画法
观察箱线图的方法:
箱线图的中线叫做中位线,是所有数值的中位数所在的位置;上面的先叫做上四分位线(75%),下面的线叫做下四分位线(25%),上触须为90%,下触须为10%,超过触须外的数值都用点来代表,称为异常点。python中的ggplot,其中的箱线图无法进行上色。

4)饼图,coord_polar(),(玫瑰图)

饼图是由笛卡尔坐标系的直方图,改变其极坐标系,而形成饼图,相当于做一个极坐标系转换,改变方法为在直方图当中加入coord_polar()参数
ggplot(aes(x='carat'), data=diamonds)+geom_histogram(fill='steelblue', alpha=0.5)+coord_polar()
python:ggplot(2)- 图形画法
但是绘制饼图coord_polar()函数在python版本中的ggplot中,没有theta的函数,theta用来控制x轴及y轴的坐标

4,图形美化

1)添加颜色标度,scale_color_brewer()

通过三种图形的比较我们看看scale_color_brewer()添加颜色标度后的效果
ggplot(aes(x='carat', y='price'), data=diamonds)+geom_point()
python:ggplot(2)- 图形画法
ggplot(aes(x='carat', y='price', color='clarity'), data=diamonds)+geom_point()
python:ggplot(2)- 图形画法
ggplot(aes(x='carat', y='price', color='clarity'), data=diamonds)+geom_point()+scale_color_brewer(type='qual')
python:ggplot(2)- 图形画法
主要作用是修改标度图层
scale_color_brewer(type='qual') 表示控制颜色标度,即主题色,其中的type分为三种类型:
type='seq'连续型颜色标度;
type='qual'离散型颜色标度;
type='div'极端型颜色标度;
连续型:表示由浅入深的渐变色;
离散型:表示颜色不连续的变化;
极端型:表示中间浅两边深的颜色变化状态,且两端颜色差别大;
色盘:
python:ggplot(2)- 图形画法
也可以选择色盘进行调色:
ggplot(aes(x='carat', y='price', color='clarity'), data=diamonds)+geom_point()+scale_color_brewer(type='div', paletter='BrBG')
python:ggplot(2)- 图形画法

2)轴标度,scale_x_log()

ggplot(aes(x='carat', y='price', color='clarity'), data=diamonds)+geom_point()+scale_color_brewer(type='seq', palette='Reds')+scale_x_log()
python:ggplot(2)- 图形画法
X轴的标度变为以log为底的计数单位

3)轴名称和图名称,labs()

ggplot(aes(x='carat', y='price', color='clarity'), data=diamonds)+geom_point()+scale_color_brewer(type='seq', palette='Blues')+labs(x='my x', y='my y', title='my point')
python:ggplot(2)- 图形画法

5,主题设定

主题:主要是指背景颜色和样式,默认是灰色主题
theme_bw()白色主题,theme_gray()灰色主题,theme_xkcd()框框主题
例如:
ggplot(aes(x='carat', y='price', color='clarity'), data=diamonds)+geom_point()+scale_color_brewer(type='seq', palette='Blues')+labs(x='my x', y='my y', title='my point')+theme_xkcd()
python:ggplot(2)- 图形画法

6,ggplot在python和R中的区别

1)python版本比R版本弱在哪里

2)功能不足

1> geom_line中的data_breaks无法控制,无法进行指定时间段的时间控制,在R版本中,X轴为时间刻度时,data_breaks表示间隔的时间标度,而在python版本中,时间间隔用data_breaks无法进行控制。
2> 图层组合没有R中灵活
在python版本中,ggplot必须要导入数据集,而且需要X和Y轴的标度。
3> 在R中可以配合其他更多的绘图包,完成更多的图形画法,所以在python当中无法绘制出图中图的效果。
4> 没有办法进行位置调整,例如图形的堆叠,填充等
5> 颜色无法覆盖
主要指箱线图无法上色,如果想要绘制饼图,而在python中只能绘制玫瑰图,另外也无法绘制同心圆图。
6> 另外许多参数还不完善,例如theta
7> ggplot()中的data要放在aes()函数的后面,如果放在前面不能绘图

7,推荐资料

开发者网站http://ggplot.yhathq.com/docs/index.html
书籍《ggplot2:数据分析与图形艺术》,基于R语言