利用Python进行数据分析——可视化

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31823267/article/details/79964394
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

基本入门

简单图

当用户只提供了一个单维列表或数组时,matplotlib会将其看成是一系列的Y值,并在图中将其连起来,而且会根据Y值得数量自动添加X的坐标值。

data=np.random.randn(50)
plt.plot(data.cumsum())
plt.show()

线形图

线形图为最基本的图类,没啥好说的

X=np.arange(10)
Y=X**2
plt.plot(X,Y,color='g',linestyle='--')        #绿色线条,虚线
plt.show()

散点图

最基本的散点图常用来找出两个变量之间的关系

X=np.arange(30)        #30个序列值
Y=X+3*np.random.randn(30)        #Y为X的值加上3倍的高斯噪声
plt.scatter(X,Y)
plt.show()

柱状图

柱状图常用于绘制频率图,数据通常为单维数据,展示变量的频率分布

data=np.random.randn(100)        #服从标准正态分布的数据集
plt.hist(data,bins=20,color='k',alpha=0.3)        #将X分为20个区间,黑色,透明度0.3
plt.show()

子图

有时需要同时绘制多张图片,这时候可以使用subplots()绘制子图。

fig,axes=plt.subplots(2,2)

axes[0,0].hist(np.random.randn(100),bins=20,color='k',alpha=0.3)
axes[0,1].scatter(np.arange(30),np.arange(30)+np.random.randn(30))
axes[1,0].plot(np.random.randn(50).cumsum(),'k--')
plt.show()

颜色、标记与线条风格

在绘制线形图时,常用的参数有:
- 颜色:color=
- 线条风格:linestyle=
- 标记:marker=

data=np.random.randn(20)
plt.plot(data,color='r',linestyle='-',marker='o')        #红色,实线,圆点标注
plt.show()

注意到线形图对于相邻点之间的连线方式是在两点之间连直线,可以使用参数drawstyle=来改变连线的方式:

X=np.arange(10)
Y=X**2
plt.plot(X,Y,drawstyle='steps-post',color='k')
plt.show()

标号、轴标签与图例

data1=np.random.randn(1000)
data2=np.random.randn(1000)
data3=np.random.randn(1000)

fig=plt.figure()        #新建一个图对象
ax=fig.add_subplot(111)        #以一行一列的方式,在第一个位置增加一个子图
ax.plot(data1.cumsum(),color='k',label='one')        #线条标签为'one'
ax.plot(data2.cumsum(),color='b',linestyle='--',label='two')        #线条标签为'two'
ax.plot(data3.cumsum(),color='r',linestyle='-.',label='three')        #线条标签为'three'

ax.legend(loc='best')        #添加图例

ticks=ax.set_xticks([0,250,500,750,1000])        #指定X轴的显示数字
labels=ax.set_xticklabels(['one','two','three','four','five'],rotation=30,fontsize='small')        #转换X轴的显示值

ax.set_xlabel('Stages')        #X轴命名
ax.set_title('title of pic')         #图命名

plt.show()

图内说明

X=np.arange(-1,1,0.01)
Y=X**2

fig=plt.figure()
ax=fig.add_subplot(111)
ax.plot(X,Y,color='k')

min_loc=(0,0)
ax.annotate("min",        #说明文字
            xy=(min_loc),        #需要添加说明的点的坐标
            xytext=(min_loc[0],min_loc[1]+0.2),        #说明文字的坐标
            arrowprops=dict(facecolor='black'))        #箭头属性

plt.show()

保存图片

fig,axes=plt.subplots(2,2)

axes[0,0].hist(np.random.randn(100),bins=20,color='k',alpha=0.3)
axes[0,1].scatter(np.arange(30),np.arange(30)+np.random.randn(30))
axes[1,0].plot(np.random.randn(50).cumsum(),'k--')

plt.savefig('tmp.png',dpi=400,bbox_inches='tight')

使用pandas和seaborn画图

matplotlib是一个相当低级的画图工具,实际中只会用到其一些基本组件,如:数据展示、图例、标题和标注等。

pandas中可能存在多列数据,并且伴有行列标签,pandas中内置了简化后的对于DataFrame与Series的可视化方法,另一个库是seaborn。

线形图

对Series直接绘图时,会将序列的数据当成一系列Y值,而将Series的index当作X值:

X=np.arange(0,100,10)
Y=X**2
obj=pd.Series(Y,index=X)
obj.plot()

plt.show()

如果不想使用Series的index当作X值,使用参数use_index=

obj.plot(use_index=False)
plt.show()

DataFrame直接绘图类似,会将DataFrame的每一列看作是不同的Y值序列,并使用index作为统一的X值:

frame=pd.DataFrame(np.random.randn(50,4),
                 index=np.arange(0,500,10),
                 columns=['A','B','C','D'])

frame.plot(use_index=False)
plt.show()

条形图

plot.bar()与plot.barh()分别绘制竖直状的条形图与水平状的条形图。

fig,axes=plt.subplots(2,1)
obj=pd.Series(np.random.rand(5),index=['a','b','c','d','e'])
obj.plot.bar(ax=axes[0],color='k',alpha=0.7)        #ax参数接收子图的位置
obj.plot.barh(ax=axes[1],color='k',alpha=0.7)

plt.show()

对于DataFrame,会将每一条数据(row)当作一个条,而将不同列的值整合到一个条中:

df=pd.DataFrame(np.random.rand(4,4),
               index=['one','two','three','four'],
               columns=['A','B','C','D'])        #每条数据有4列,因此绘图时每大条包含4个子条
df.plot.bar()

plt.show()

可以使用参数stacked=将子条压缩成一大条:

df.plot.barh(stacked=True)
plt.show()

假设需要统计派对人数与周几的关系,可以使用条形图来展示:

data=pd.read_csv('examples/tips.csv')
data.sample(5)

tips=pd.crosstab(data.loc[:,'day'],data.loc[:,'size'])
tips

party_pcts=tips.div(tips.sum(axis=1),axis=0)        #每行的数据除以列和,将每天的派对尺寸转换成百分比形式
party_pcts.plot.bar()
plt.show()

当数据在绘制之前需要求和时,使用seaborn包会更简单:

sns.barplot(x='size',y='day',data=data,orient='h')        #直接绘制size对于day的均值
plt.show()


上图中的黑线为置信区间。

分面图与非数值型数据

当需要对某一个非数值类型的变量再进行分别绘图以查看对比时,可以使用seaborn的factorplot()方法绘制对比图:

sns.factorplot(x='day',y='size',
               row='time',col='smoker',        #以time的种类为行,以smoker的种类为列
               kind='bar',data=data)
plt.show()

sns.factorplot(x='total_bill',y='day',
              col='smoker',
              kind='box',data=data)        #绘制箱型图
plt.show()

直方图与密度图

直方图常用于表示频率图,而密度图又被称为核密度估计(KDE)。

data.loc[:,'size'].plot.hist(bins=6)
plt.show()

data.loc[:,'size'].plot.density()
plt.show()

同样的,seaborn的distplot()方法使得绘制直方图与密度图更简单:

dis_1=np.random.normal(0,1,size=200)
dis_2=np.random.normal(10,2,size=200)
data=pd.Series(np.concatenate([dis_1,dis_2]))

sns.distplot(data,bins=100,color='k')
plt.show()

散点图

散点图常用来考察多个变量之间的关系。

macro=pd.read_csv('examples/macrodata.csv')
macro.sample(5)

data=macro.loc[:,['cpi','m1','tbilrate','unemp']]
trans_data=np.log(data).diff().dropna()        #diff():后一个元素减前一个元素
trans_data.sample(5)

sns.regplot('m1','unemp',data=trans_data)        #带回归拟合的散点图
plt.show()

在分析数据时,同时绘制不同变量组合下的散点图是很有用的,这被称为散点图矩阵:

sns.pairplot(trans_data,diag_kind='kde',plot_kws={'color':'k','alpha':0.5})        #对角线设为密度图
plt.show()

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页