不得不说,matplot感觉就是R中的plot,简单上手,但是扩展不足,而且偶然发现了python也有ggplot包,但是由于C++的问题无法安装,后续再研究下。
先看下高级的散点图,类似R的:
geom_point(aex(x,y),color=z)
也就是说针对不同的种类进行颜色填充,依靠之前的说法,因为matplot图形做的事情很少,需要借助数据整形。
而这个时候应用到了python的map函数,map函数相当于一个匹配:把一个变量匹配成另一个变量,在画散点图的时候,需要对不同的类别进行颜色赋值;
col=iris.Species.map({'setosa':'DarkBlue',
'versicolor':'Green',
'virginica':'Red'})
这段代码其实相当于新建了一个series,针对Species列,如果是setosa,那么赋值成Darkblue,如果是versicolor,赋值为Green,如果为virginica,赋值为Red,然后画图的时候,把color参数设置为col:
iris.plot(kind='scatter',
x='Petal_Length',
y='Sepal_Width',
c=col,
title='Multicolor-scatter')
c这个参数就是颜色参数了。
可以看到这三类的散点图都已经分类了。
然而,还有一种先建一个画布,然后一个一个画:
ax1=iris[iris['Species']=='setosa']. plot(kind='scatter',
x='Petal_Length',
y='Sepal_Width',
color='Darkblue',
label='setosa')
iris[iris['Species']=='versicolor'].plot(kind='scatter',
x='Petal_Length',
y='Sepal_Width',
color='DarkGreen',
label='versicolor',
ax=ax1)
下面研究了一种更加普遍的做法,因为Species只有三个factor,然而实际上可能会有很多类别,总不能一个一个map吧,整体的逻辑分为三步:
1、确认总体factor个数
2、针对赋值确定颜色
3、设定map关系
对应的代码为:
iris_labels=iris.Species.unique()
iris_color=cm.rainbow(np.linspace(0,1,len(iris_labels)))
color_map=iris.Species.map(dict(zip(iris_labels,iris_color)))
说明下
cm.rainbow
函数相当于R中的颜色调色板,后面的linspace是等差数列,可以认为通过rainbow函数生成了三个RGB颜色,
最后一步的map中的zip函数就是把iris_labels对应到iris_color上,我们看下color_map前几行:
color_map.head()
0 [0.5, 0.0, 1.0, 1.0]
1 [0.5, 0.0, 1.0, 1.0]
2 [0.5, 0.0, 1.0, 1.0]
3 [0.5, 0.0, 1.0, 1.0]
4 [0.5, 0.0, 1.0, 1.0]
Name: Species, dtype: object
相同的参数具有相同的颜色值;
接下来就可以画图了:
iris.plot(kind='scatter',
x='Petal_Length',
y='Sepal_Width',
c=color_map,
title='Multicolor-scatter-map')
除此之外,还可以做连续变化的图形,例如把Petal_Width作为赋值:
iris.plot(kind='scatter',
x='Petal_Length',
y='Sepal_Width',
c='Petal_Width',
title='Multicolor-scatter-continous')
或者是调整size大小:
iris.plot(kind='scatter',
x='Petal_Length',
y='Sepal_Width',
s=iris['Petal_Width']*100,
c=color_map,
title='Multicolor-scatter-size')
说完散点图,说说六边形图,其实就是类似R的tile,不过size更小,颜色深的地方说明点比较集中:
iris.plot(kind='hexbin',
x='Petal_Length',
y='Sepal_Width',
gridsize=40,
title='Hexbin',
figsize=(12,8))
figsize是图像大小
然后看下饼图:
iris.groupby('Species').sum(). Sepal_Length.plot(kind='pie',
title='Simple-Pie',
figsize=(8,8),
autopct='%.0f') #%.nf保留n百分位
或者是不完全的饼图:
iris.groupby('Species').sum().\
div(iris.iloc[:,0:4].sum()).Sepal_Length[0:2].\
plot(kind='pie',
title='Pie-lessthan1',
figsize=(8,8),
autopct='%.2f')
不完全饼图是各个部分加起来小于1,不会自动填充满。再次印证,数据是数据,图形是图形。
下面几个高级图形:
类似R的scatterplotMatrix函数:
scatter_matrix(iris,
alpha=0.5,
figsize=(6,6),
diagonal='kde',
color='DarkBlue')
plt.suptitle('ScatterMatrix') #suptitle为title,需要分开画
还有调和图:
fig=plt.figure()
fig,axe=plt.subplots(2,1,sharey=True)
andrews_curves(iris,'Species',ax=axe[0])
parallel_coordinates(iris,'Species',ax=axe[1])
plt.suptitle('Compare')
多说一句调和图,parallel_coordinate类似于四个变量,用直线连接,而andrews_curves类似做一个傅里叶变换;
最后一个是检验是否为随机的lagplot
from pandas.tools.plotting import lag_plot
plt.figure()
lag_plot(iris['Petal_Length'])
一般lagplot都是评估时间序列的前后因果的,如果没有显著地线性关系,就认为没有因果性,是随机发生的:
这里面虽然不是时间序列,但是分析逻辑类似