利用python进行数据分析学习笔记(绘图和可视化)

matplotlib API入门

引入matplotlib

import matplotlib.pyplot as plt

创建一个简单的图形

data = np.arange(10)
plt.plot(data)


利用python进行数据分析学习笔记(绘图和可视化)_第1张图片


Figure和Subplot

matplotlib的图像都位于Figure对象中,可以用plt.figure创建一个新的Figure。

fig = plt.figure()
fig.show()

弹出空白窗口。

不能直接用空Figure绘图,需要通过add_subplot创建一个或多个subplot。

ax1 = fig.add_subplot(2,2,1)

将图像设置为2x2,即最多4张图,且当前选中的是第一个。

fig = plt.figure()
ax1 = fig.add_subplot(2,2,1)
ax2 = fig.add_subplot(2,2,2)
ax3 = fig.add_subplot(2,2,3)
plt.plot(np.random.randn(50).cumsum(),'k--')

执行前四行代码后执行第五行代码,matplotlib会在最后一个用过的subplot上进行绘制,如果没有会自动创建一个。


k--表示将线型改为黑色虚线。

利用python进行数据分析学习笔记(绘图和可视化)_第2张图片

直接调用fig.add_subplot方法返回的对象可以在其中进行作图。

x1 = ax1.hist(np.random.randn(100),bins=20,color='k',alpha=0.3)
x2 = ax2.scatter(np.arange(30),np.arange(30)+3*np.random.randn(30))

利用python进行数据分析学习笔记(绘图和可视化)_第3张图片

matplotlib有一个plt.subplots,可以创建一个新的Figure,并返回一个含有已创建的subplot对象的NumPy数组。

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

利用python进行数据分析学习笔记(绘图和可视化)_第4张图片

利用python进行数据分析学习笔记(绘图和可视化)_第5张图片


调整subplot周围的间距

利用Figure的subplots_adjust方法可以修改subplot之间的间距。

fig, axes = plt.subplots(2, 2, sharex=True, sharey=True)
for i in range(2):
    for j in range(2):
        axes[i, j].hist(np.random.randn(500), bins=50, color='k', alpha=0.5)
plt.subplots_adjust(wspace=0, hspace=0)

wspace和hspace用于控制宽度和高度的百分比,可以用作subplot之间的间距。

利用python进行数据分析学习笔记(绘图和可视化)_第6张图片

两个参数都调整为0.3时。

利用python进行数据分析学习笔记(绘图和可视化)_第7张图片


颜色、标记和线型

ax.plot(x,y,'g--')表示接受一组坐标绘制成线图,线的颜色为绿色,线型为虚线。

ax.plot(x,y,linestyle='--',color='g')和上面效果一样。

常用的颜色可以用颜色缩写,线图可以使用标记强调数据点,标记类型和线型都要在颜色后面。

plt.plot(np.random.randn(30).cumsum(),'ko--')

利用python进行数据分析学习笔记(绘图和可视化)_第8张图片

也可以写成更明确的形式。

plt.plot(np.random.randn(30).cumsum(),color='k',linestyle='dashed',marker='o')

结果和上面的一样。


data = np.random.randn(30).cumsum()
plt.plot(data,'k--',label='Default')    #线型为虚线,颜色为灰色,标签为Default
plt.plot(data,'k-',drawstyle='steps-post',label='steps-post')        #线型是实线,灰色,标签
plt.legend(loc='best')    #自动挑选标签位置
plt.show()

利用python进行数据分析学习笔记(绘图和可视化)_第9张图片


刻度、标签和图例


设置标题、轴标签、刻度及刻度标签

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.plot(np.random.randn(1000).cumsum())

利用python进行数据分析学习笔记(绘图和可视化)_第10张图片

要设置x轴刻度,使用set_xticks方法和set_xticklabels等方法

ticks = ax.set_xticks([0,250,500,750,1000])    #设置横坐标刻度
labels = ax.set_xticklabels(['one','two','three','four','five'],
                            rotation=30,fontsize='small')    #设置横坐标刻度标签,rotation是倾斜度设置,fontsize是字体大小
ax.set_title('My first matplotlib plot')    #设置图表标题
ax.set_xlabel('Stages')    #设置横坐标标题

利用python进行数据分析学习笔记(绘图和可视化)_第11张图片

y轴的修改方式类似,将x改为y即可。

如果需要批量设置,可以将参数写入一个dict中。

props = {'title':'My first matplotlib plot','xlabel':'Stages'}
ax.set(**props)


添加图例

通过传入label参数添加图例

from numpy.random import randn
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.plot(randn(1000).cumsum(),'k',label='one')    #1000步随机漫步,图例标签为one,
ax.plot(randn(1000).cumsum(),'k--',label='two')    #设置线型为虚线
ax.plot(randn(1000).cumsum(),'k.',label='three')    #设置线型为点组成
ax.legend(loc='best')    #自动选择最佳图例放置位置
利用python进行数据分析学习笔记(绘图和可视化)_第12张图片


注解以及在Subplot上绘图

from datetime import datetime
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
data = pd.read_csv('examples/spx.csv',index_col=0,parse_dates=True)   #取数据,将第一列设置为行索引,parse_dates=True表示解析行索引为日期
spx = data['SPX']    #将data中的SPX列的数据赋值给变量spx

利用python进行数据分析学习笔记(绘图和可视化)_第13张图片

利用python进行数据分析学习笔记(绘图和可视化)_第14张图片

利用python进行数据分析学习笔记(绘图和可视化)_第15张图片

spx.plot(ax=ax,style='k-')    #根据spx数据进行绘图,线型为实线
crisis_data = [
               (datetime(2007,10,11),'Peak of bull marker'),
               (datetime(2008,3,12),'Bear Stearns Fails'),
               (datetime(2008,9,15),'Lehman Bankruptcy')
               ]
for date,label in crisis_data:
    ax.annotate(label,xy=(date,spx.asof(date) + 75),        #通过annotate方法对图表进行标注
                xytext=(date,spx.asof(date) + 225),
                arrowprops=dict(facecolor='black',headwidth=4,width=2,
                                headlength=4),
                horizontalalignment='left',verticalalignment='top')
ax.set_xlim(['1/1/2007','1/1/2011'])    #设置横坐标区间
ax.set_ylim([600,1800])    #设置纵坐标区间
ax.set_title('Important dates in the 2008-2009 financial crisis')    #设置图表标题
plt.show()
annotate方法的label参数是注释文本,xy参数是被注释的坐标点,xytext是注释文字的坐标位置,arrowprops是箭头的参数,

利用python进行数据分析学习笔记(绘图和可视化)_第16张图片


绘制图形,先创建块对象,再通过ax.add_patch()方法将其添加到subplot中。

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
rect = plt.Rectangle((0.2,0.75),0.4,0.15,color='k',alpha=0.3)    #矩形
circ = plt.Circle((0.7,0.2),0.15,color='b',alpha=0.3)    #圆形
pgon = plt.Polygon([[0.15,0.15],[0.35,0.4],[0.2,0.6]],color='g',alpha=0.5)    #多边形
ax.add_patch(rect)
ax.add_patch(circ)
ax.add_patch(pgon)

alpha参数是设置透明度

利用python进行数据分析学习笔记(绘图和可视化)_第17张图片


将图表保存到文件

使用plt.savefig()方法。

plt.savefig('figpath.png',dpi=400,bbox_inches='tight')    #最后一个参数剪除当前图表周围的空白部分

savefig不止能写入磁盘,还能写入任何文件型的对象,下面是将图表以二进制形式写入内存中?

from io import BytesIO
buffer = BytesIO()
plt.savefig(buffer)
plot_data = buffer.getvalue()

savefig的其他选项

利用python进行数据分析学习笔记(绘图和可视化)_第18张图片


matplotlib配置

通过plt.rc方法可以自定义图片的参数,如plt.rc('figure',figsize=(10,10))表示将全局的图像默认大小设置为10X10

rc的第一个参数是希望自定义的对象,如figure,axes,xtick,ytick,grid,legend等,后面添加一系列关键字参数,可以将一系列需要自定义的参数用一个dict装起来。

font_options = {'family':'monospace','weight':'bold','size':'smalll'}
plt.rc('font',**font_options)

使用pandas和seaborn绘图

线型图

s = pd.Series(np.random.randn(10).cumsum(),index=np.arange(0,100,10))
s.plot()

创建一个Series,索引是0-90,数据是标准正态分布中随机取10个数。

使用Series的plot方法绘出线形图。

利用python进行数据分析学习笔记(绘图和可视化)_第19张图片

Series的plot方法的参数

利用python进行数据分析学习笔记(绘图和可视化)_第20张图片


DataFrame的plot方法会为每列绘制一条线并创建图例,图例标签是列名。

df = pd.DataFrame(np.random.randn(10,4).cumsum(0),
                  columns=['A','B','C','D'],
                  index=np.arange(0,100,10))
df.plot()

cumsum(0)表示将每列累计求和。

利用python进行数据分析学习笔记(绘图和可视化)_第21张图片

利用python进行数据分析学习笔记(绘图和可视化)_第22张图片


柱状图

plot.bar()和plot.barh()方法分别绘制水平和垂直的柱状图。

fig, axes = plt.subplots(2, 1)
data = pd.Series(np.random.rand(16), index=list('abcdefghijklmnop'))
data.plot.bar(ax=axes[0], color='k', alpha=0.7)
data.plot.barh(ax=axes[1], color='k', alpha=0.7)

利用python进行数据分析学习笔记(绘图和可视化)_第23张图片


df = pd.DataFrame(np.random.rand(6,4),
                  index=['one','two','three','four','five','six'],
                  columns=pd.Index(['A','B','C','D'],name='Genus'))
df.plot.bar()

利用python进行数据分析学习笔记(绘图和可视化)_第24张图片

列索引行的名称被用作了图例的标题。

利用python进行数据分析学习笔记(绘图和可视化)_第25张图片

设置参数stacked=True即可生成堆积柱状图。

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

利用python进行数据分析学习笔记(绘图和可视化)_第26张图片


现在想做一张堆积柱状图来展示每天各种聚会规模的数据点的百分比

tips = pd.read_csv('examples/tips.csv')    #读取数据
party_counts = pd.crosstab(tips['day'],tips['size'])    #根据day列和size列做成交叉表
party_counts = party_counts.loc[:,2:5]    #通过索引名称选取所有行和2-5列

利用python进行数据分析学习笔记(绘图和可视化)_第27张图片

利用python进行数据分析学习笔记(绘图和可视化)_第28张图片

利用python进行数据分析学习笔记(绘图和可视化)_第29张图片

party_pcts = party_counts.div(party_counts.sum(1),axis=0)    
party_pcts.plot.bar()
利用python进行数据分析学习笔记(绘图和可视化)_第30张图片

利用python进行数据分析学习笔记(绘图和可视化)_第31张图片

利用python进行数据分析学习笔记(绘图和可视化)_第32张图片


对于在绘制图形前,需要进行合计的数据,使用seaborn可以减少工作量。

import seaborn as sns
tips['tip_pct'] = tips['tip'] / (tips['total_bill'] - tips['tip'])    #在tips中新建一列
tips.head()
sns.barplot(x='tip_pct',y='day',data=tips,orient='h')    #orient参数控制条形是水平还是竖直

利用python进行数据分析学习笔记(绘图和可视化)_第33张图片

利用python进行数据分析学习笔记(绘图和可视化)_第34张图片

上图是小费的每日比例,带有误差条,默认计算的是平均值。

seaborn.barplot有颜色选项,可以通过hue参数设置。

sns.barplot(x='tip_pct',y='day',hue='time',data=tips,orient='h')

利用python进行数据分析学习笔记(绘图和可视化)_第35张图片

可以通过sns.set方法中的style参数设置不同的图形外观。

sns.set(style="whitegrid")
sns.barplot(x='tip_pct',y='day',hue='time',data=tips,orient='h')
plt.show()

利用python进行数据分析学习笔记(绘图和可视化)_第36张图片


直方图和密度图

tips['tip_pct'].plot.hist(bins=50)

使用tips中的tip_pct列创建了直方图,bins=50表示x轴一共细分为50个小区间,如果0-2.5都有数据的话,应该有50条柱子。

利用python进行数据分析学习笔记(绘图和可视化)_第37张图片

与直方图相关的是密度图

tips['tip_pct'].plot.density()
plt.show()

利用python进行数据分析学习笔记(绘图和可视化)_第38张图片


seaborn的distplot方法绘制直方图和密度图更简单,还能同时绘制直方图和连续密度估计图。

comp1 = np.random.normal(0,1,size=200)    #从期望值为0,标准差为1的正态总体中随机取200个数
comp2 = np.random.normal(10,2,size=200)    #从期望值为10,标准差为2的正态总体中随机取200个数
values = pd.Series(np.concatenate([comp1,comp2]))    #通过concatenate方法将comp1和comp2连接起来,形成400个数的一维数组。
sns.distplot(values,bins=100,color='k')

利用python进行数据分析学习笔记(绘图和可视化)_第39张图片

若在distplot方法中传入参数kde=False可以除去正态曲线,hist参数可以控制直方图是否出现。

利用python进行数据分析学习笔记(绘图和可视化)_第40张图片


散布图或点图

macro = pd.read_csv('examples/macrodata.csv')    #获取数据
data = macro[['cpi','ml','tbilrate','unemp']]    #获取指定列的数据
trans_data = np.log(data).diff().dropna()    #对数据进行对数处理,diff方法是用后一个元素减前一个元素得到一个新数组,dropna去掉缺失值
trans_data[-5:]    

利用python进行数据分析学习笔记(绘图和可视化)_第41张图片

利用python进行数据分析学习笔记(绘图和可视化)_第42张图片

利用python进行数据分析学习笔记(绘图和可视化)_第43张图片

通过seaborn的regplot方法,可以做一个散布图并加上一条线性回归线。

sns.regplot('m1','unemp',data=trans_data)
plt.title('Changes in log %s versus log %s' % ('m1', 'unemp'))

利用python进行数据分析学习笔记(绘图和可视化)_第44张图片

通过seaborn.pairplot方法可以同时观察一组变量的散布图。

sns.pairplot(trans_data,diag_kind='kde',plot_kws={'alpha':0.2})

plot_kws中的参数设置适用于非对角线上的图形。diag_kind参数设置对角线上的图形。

利用python进行数据分析学习笔记(绘图和可视化)_第45张图片


分面网格和类型数据

如果数据集有额外的分组维度,可以使用seaborn.factorplot方法制作多种分面图。

sns.factorplot(x='day',y='tip_pct',hue='time',col='smoker',kind='bar',data=tips[tips.tip_pct < 1])

参数kind='bar'表示使用柱形图。

利用python进行数据分析学习笔记(绘图和可视化)_第46张图片

sns.factorplot(x='day',y='tip_pct',row='time',col='smoker',kind='bar',data=tips[tips.tip_pct < 1])

利用python进行数据分析学习笔记(绘图和可视化)_第47张图片

sns.factorplot(x='tip_pct',y='day',kind='box',data=tips[tips.tip_pct < 0.5])

创建箱线图,kind='box'表示箱线图。

利用python进行数据分析学习笔记(绘图和可视化)_第48张图片


以上学习笔记主要内容来自:https://www.jianshu.com/p/7a0eafdd1340

你可能感兴趣的:(python)