python ggplot为什么不能取代matplotlib_【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这个参数就是颜色参数了。

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

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

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都是评估时间序列的前后因果的,如果没有显著地线性关系,就认为没有因果性,是随机发生的:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值