数据分析----Matplotlib

语言: CN / TW / HK

本文已参与「新人创作礼」活动,一起开启掘金创作之路

基本布局对象

figure对象是所有图表绘制的基础 构建图标的主要步骤 - 准备数据 - 生成图表 - 传入数据 - 调整图标的装饰

图表样式的修改以及图表装饰的接口

Matplotlib定义详细的图标装饰项接口,能够对图表几乎每一个细节进行修改 - 修改图表样式

```python import matplotlib.pyplot as plt import numpy as np fig = plt.figure() fig,axes = plt.subplots() t = np.arange(0,2,0.01) s = np.sin(2np.pit)

修改线条颜色,线条形式

axes.plot(t,s,color='k',linestyle='-') s = np.sin(2np.pi(t+0.5)) axes.plot(t,s,color='c',linestyle='--') plt.show() ``` 常用的color参数值 | color参数值|含义 | |--|--| |r |红色 | | y| 黄色 | | g | 绿色 | | c | 青色 | | b | 蓝色 | | m | 紫红色 | | w| 白色| 常用linesstyle参数值 | linesstyle参数值|含义 | |--|--| | - | 实线 | | -- | 虚线(两个短横线)| | -. | 虚线(短横线和点交替) | | : | 虚线(点) | - 修改装饰项

```python import matplotlib.pyplot as plt import numpy as np fig = plt.figure() fig,axes = plt.subplots() t = np.arange(0,2,0.01) s = np.sin(2np.pit)

修改线条颜色,线条形式

axes.plot(t,s,color='k',linestyle='-',label='line1')

s = np.sin(2np.pi(t+0.5)) axes.plot(t,s,color='c',linestyle='--',label='line2')

ticks styles

axes.set_xticks(np.arange(0,2,0.5)) axes.set_yticks([-1,0,1]) axes.minorticks_on()

axes position

对边框进行修改,隐藏右边框和上边框

axes.spines['right'].set_color('none') axes.spines['top'].set_color('none')

指定边框的位置,第一个参数表示位置的种类,第二个参数表示边框的位置

axes.spines['bottom'].set_position(('data',0))

axes.spines['left'].set_position(('data',0))

axes.spines['bottom'].set_position('center') axes.spines['left'].set_position('zero')

'center' 等于('data',0.5)

zero 等于 ('data',0)

legend

设置图例,loc bbox_to_anchor 确定位置的参数

axes.legend(loc='upper right',bbox_to_anchor=(1.1,1)) plt.show() ``` - 添加注释

```python import matplotlib.pyplot as plt

import numpy as np

fig = plt.figure() fig,axes = plt.subplots() axes.plot(np.arange(0,24,2),[14,9,7,5,12,19,23,26,27,24,24,19],'-o') axes.set_xticks(np.arange(0,24,2))

生成一个带箭头的注释

''' axes.annotate('hottest at 16:00',xy=(16,27),xytext=(16,22),arrowprops=dict( facecolor = 'black',shrink=0.2), horizontalalignment='center',verticalalignment='center' ) 参数依次是 注释文字 xy 箭头尖端位置 xytext 注释文字位置 arrowprops=dict( 箭头样式参数 facecolor 箭头颜色 shrink 箭头与文字之间的距离 horizontalalignment verticalalignment 文字在水平位置和垂直位置向上对齐的方式

'''

axes.annotate('hottest at 16:00',xy=(16,27),xytext=(16,22),arrowprops=dict( facecolor = 'black',shrink=0.2), horizontalalignment='center',verticalalignment='center' ) ''' axes.text() 参数分别为 文字的位置 注释文字 背景框的样式(课可以指定, 背景颜色 透明度 文字与背景框之间的距离) ''' axes.text(12,10,'Date: March 26th 2018',bbox={'facecolor':'cyan','alpha':0.3,'pad':6}) plt.show() ```

基础图表绘制

直方图

是一种直观描述数据集集中每一个区间内数据值出现频数的统计图 通过直方图,可以大致了解数据的分布,判断数据集中的区间 ```python import matplotlib.pyplot as plt import numpy as np data = np.random.standard_normal(1000)

分组

bins = 50 fig,axes = plt.subplots()

直方图

axes.hist(data,bins) axes.set_title("Histogram") plt.show()

直方图加标准正态密度函数图像

number_of_bins = 50 fig,axes = plt.subplots() n,bins ,patch=axes.hist(data,number_of_bins,density=True) standard_data = ((1/(np.sqrt(2np.pi)1))np.exp(-0.5(1/1(bins-0))*2)) axes.plot(bins,standard_data,0,'-') plt.show()

``` 在这里插入图片描述

在这里插入图片描述

散点图

可以将样本数据绘制在二维平面上777直观的显示分布情况,初步判断两个变量之间的关系

```python import matplotlib.pyplot as plt import numpy as np n = 60 np.random.seed(100) x = np.random.rand(n) y = np.random.rand(n)

plt.scatter(x,y)

fig,axes= plt.subplots() axes.scatter(x,y) plt.show()

根据值改变点大大小和颜色

n1 = 60 np.random.seed(100) x = np.random.rand(n1) y = np.random.rand(n1) s = np.pi(10np.random.rand(n1))**2

c= -s

plt.scatter(x,y)

fig,axes= plt.subplots()

x y 标记点面积,颜色,透明度

axes.scatter(x,y,s,c,alpha=0.7) plt.show() ``` 在这里插入图片描述

在这里插入图片描述

饼图

饼图可以直观的显示某一类数据在全部样本数据的百分比

python import matplotlib.pyplot as plt import numpy as np fig,axes = plt.subplots() labels = 'Taxi','Metro','Walk','Bus','Bicycle','Driving' sizes = [10,30,5,25,5,25] explode = (0,0.1,0,0,0,0) axes.pie(sizes,explode=explode,labels=labels,autopct='%1.1f%%',shadow=True,startangle=90) axes.axis('equal') axes.set_title('pie chart') plt.show()

柱状图

柱状图可以直观的反应不同类别数据之间分布情况的数量差异

python import matplotlib.pyplot as plt import numpy as np fig,axes = plt.subplots() data_m=(40,120,20,100,30,200) data_f=(60,180,30,150,20,50) index = np.arange(6) width = 0.4 axes.bar(index,data_m,width,color='c',label='men') axes.bar(index+width,data_f,width,color='b',label='women') axes.set_xticks(index+width/2) axes.set_xticklabels(('Taxi','Metro','Walk','Bus','Bicycle','Driving')) axes.legend() plt.show() 在这里插入图片描述

```python

柱状图叠加效果,将两个柱状图叠加显示

fig,axes = plt.subplots() data_m=(40,120,20,100,30,200) data_f=(60,180,30,150,20,50) width = 0.4 axes.bar(index,data_m,width,color='c',label='men') axes.bar(index,data_f,width,color='b',bottom=data_m,label='women') axes.set_xticks(index+width/2) axes.set_xticks(index+width/2) axes.set_xticklabels(('Taxi','Metro','Walk','Bus','Bicycle','Driving')) axes.legend() plt.show() ``` 在这里插入图片描述

```python

柱状图半重叠

fig,axes = plt.subplots() data_m=(40,120,20,100,30,200) data_f=(60,180,30,150,20,50) width = 0.4 axes.bar(index,data_m,width,color='c',label='men',align='center') axes.bar(index,data_f,width,color='b',label='women',align='edge') axes.set_xticks(index+width/2) axes.set_xticks(index+width/2) axes.set_xticklabels(('Taxi','Metro','Walk','Bus','Bicycle','Driving')) axes.legend() plt.show()

``` 在这里插入图片描述

```python

水平柱状图

fig,axes = plt.subplots() data_m=(40,120,20,100,30,200) data_f=(60,180,30,150,20,50) width = 0.4 axes.barh(index,data_m,width,color='c',label='men',align='center',alpha=0.4) axes.barh(index,data_f,width,color='b',label='women',align='edge',alpha=0.4) axes.set_yticks(index+width/2) axes.set_yticklabels(('Taxi','Metro','Walk','Bus','Bicycle','Driving')) axes.legend() plt.show()

``` 在这里插入图片描述

折线图

折线图可以看出数据的变化趋势

python import matplotlib.pyplot as plt import numpy as np fig,axes = plt.subplots() x = np.arange(10) y1 = np.random.rand(10) y2 = np.random.rand(10) axes.plot(x,y1,'-o',color='c') axes.plot(x,y2,'--o',color='b') plt.show() 在这里插入图片描述

表格

通过表和图的结合,既可以直观的看到数据的分布情况,也能看到详细的数据 ```python import matplotlib.pyplot as plt import numpy as np fig,axes = plt.subplots() data_m=(40,120,20,100,30,200) data_f=(60,180,30,150,20,50) width = 0.4 index = np.arange(6) axes.bar(index,data_m,width,color='c',label='men') axes.bar(index,data_f,width,color='b',bottom=data_m,label='women') axes.set_xticks([]) axes.legend()

表格

data=(data_m,data_f) rows =('male','female') columns = 'Taxi','Metro','Walk','Bus','Bicycle','Driving' axes.table(cellText=data,rowLabels=rows,colLabels=columns) plt.show() ``` 在这里插入图片描述

不同坐标系下的图象

```python import matplotlib.pyplot as plt import numpy as np

双扭线

fig,axes = plt.subplots() theta_list = np.arange(0,2np.pi,0.01) r = [2np.cos(2*theta) for theta in theta_list]

polar 极坐标系

建立一个投影为极坐标的axes

axes = plt.subplot(projection='polar')

使用plot函数生成函数曲线,

axes.plot(theta_list,r)

为了美观删除r轴上所有的刻度

axes.set_rticks([]) plt.show() ``` 在这里插入图片描述

matplotlib3D

```python import matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d import Axes3D fig = plt.figure() axes = Axes3D(fig)

设置随机种子

np.random.seed(100)

x = np.random.rand(60) y = np.random.rand(60) z = np.random.rand(60) axes.scatter(x,y,x) plt.show() ``` 在这里插入图片描述

```python

使用pyplot实现

fig = plt.figure() axes = plt.subplot(projection="3d") x = np.random.rand(80) y = np.random.rand(80) z = np.random.rand(80) axes.scatter(x,y,x) plt.show() ```

「其他文章」