【R和Python对比】matplotlib和ggplot(三)

不得不说,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这个参数就是颜色参数了。

【R和Python对比】matplotlib和ggplot(三)_第1张图片

可以看到这三类的散点图都已经分类了。

然而,还有一种先建一个画布,然后一个一个画:

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)

【R和Python对比】matplotlib和ggplot(三)_第2张图片
但是这种方法不常用,比较复杂;

下面研究了一种更加普遍的做法,因为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')

【R和Python对比】matplotlib和ggplot(三)_第3张图片

除此之外,还可以做连续变化的图形,例如把Petal_Width作为赋值:

iris.plot(kind='scatter',
          x='Petal_Length',
          y='Sepal_Width',
          c='Petal_Width',
          title='Multicolor-scatter-continous')

【R和Python对比】matplotlib和ggplot(三)_第4张图片

或者是调整size大小:

iris.plot(kind='scatter',
          x='Petal_Length',
          y='Sepal_Width',
          s=iris['Petal_Width']*100,
          c=color_map,
          title='Multicolor-scatter-size')

【R和Python对比】matplotlib和ggplot(三)_第5张图片

说完散点图,说说六边形图,其实就是类似R的tile,不过size更小,颜色深的地方说明点比较集中:

iris.plot(kind='hexbin',
          x='Petal_Length',
          y='Sepal_Width',
          gridsize=40,
          title='Hexbin',
          figsize=(12,8))

figsize是图像大小

【R和Python对比】matplotlib和ggplot(三)_第6张图片

然后看下饼图:

iris.groupby('Species').sum(). Sepal_Length.plot(kind='pie',
                                                 title='Simple-Pie',
                                                 figsize=(8,8),
                                                 autopct='%.0f') #%.nf保留n百分位

【R和Python对比】matplotlib和ggplot(三)_第7张图片

或者是不完全的饼图:

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')

【R和Python对比】matplotlib和ggplot(三)_第8张图片

不完全饼图是各个部分加起来小于1,不会自动填充满。再次印证,数据是数据,图形是图形。

下面几个高级图形:

类似R的scatterplotMatrix函数:

scatter_matrix(iris,
               alpha=0.5,
               figsize=(6,6),
               diagonal='kde',
               color='DarkBlue')
plt.suptitle('ScatterMatrix') #suptitle为title,需要分开画

【R和Python对比】matplotlib和ggplot(三)_第9张图片

还有调和图:

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')

【R和Python对比】matplotlib和ggplot(三)_第10张图片

多说一句调和图,parallel_coordinate类似于四个变量,用直线连接,而andrews_curves类似做一个傅里叶变换;

最后一个是检验是否为随机的lagplot

from pandas.tools.plotting import lag_plot
plt.figure()
lag_plot(iris['Petal_Length'])

一般lagplot都是评估时间序列的前后因果的,如果没有显著地线性关系,就认为没有因果性,是随机发生的:

【R和Python对比】matplotlib和ggplot(三)_第11张图片

这里面虽然不是时间序列,但是分析逻辑类似

你可能感兴趣的:(R,python)