dige-python-Matplotlib

4.数据可视化库(Matplotlib)Page96

引入matplotlib

import matplotlib.pyplot as plt

%matplotlib inline


#指定魔法指令,在notebook中只需要执行画图操作即可,

#先画一个简单的折线图,只需要把二维数据点对应好即可

import matplotlib.pyplot as plt

%matplotlib inline

plt.plot([1,2,3,4,5],[1,4,9,16,25])

plt.xlabel('xlabel',fontsize=16)

plt.ylabel('ylable')


#细节设置

plot()有许多细节参数

#常用线条类型:

'-': 实线 '--': 虚线,两个破折号

'-.': 虚点线 ':': 点线

'.': 点 ',': 像素点

'o': 圆点 ,字母o 'v': 下三角点

'^': 上三角点 '<': 左三角点

'>': 右三角点 '1': 下三叉点

'2': 上三叉点 '3': 左三叉点

'4': 右三叉点 's': 正方点

'p': 五角点 '*': 星形点

'h': 六边形点1 'H': 六边形点2

'+': 加号点 'x': 乘号点---字母x

'D': 实形菱形点 'd': 瘦菱形点

'_': 横线点


#颜色选项:

'b': 蓝色-blue

'g': 绿色-green

'r': 红色-red

'c': 青色-cyan

'm': 品红-magenta

'y': 黄色-yellow

'k': 黑色-black

'w': 白色-white


示例: 

import matplotlib.pyplot as plt

%matplotlib inline

plt.plot([1,2,3,4,5],[1,4,9,16,25],'-.')

plt.xlabel('xlabel',fontsize=16)

plt.ylabel('ylable')


如果需要颜色的话,则增加color

import matplotlib.pyplot as plt

%matplotlib inline

plt.plot([1,2,3,4,5],[1,4,9,16,25],'--',color='r')

plt.xlabel('xlabel',fontsize=16)

plt.ylabel('ylable')



#还可多次调用plot函数加入多次绘图结果,其中颜色和线条参数可以放在一起,

#'r--': 表示红色虚线

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

%matplotlib inline

arr=np.arange(0,10,0.5)

plt.plot(arr,arr,'r--')   #红色虚线

plt.plot(arr,arr**2,'bs') #蓝色正方形点

plt.plot(arr,arr**3,'go') #绿色圆形点



#matplotlib绘图中,所有的特征都有控制参数,如:线条宽度、形状、大小等。

x=np.linspace(-10,10)

y=np.sin(x)

plt.plot(x,y,linewidth=3.0)



#指定不同参数来绘图

plt.plot(x,y,color='b',linestyle=':',marker='o',markerfacecolor='r',markersize=10)




#子图和标注:

所谓子图就是一整幅图形中包含几个单独的小图,这些子图可以按照行或列的形式排列,

plt.subplot(211)

plt.plot(x,y,color='r')

plt.subplot(212)

plt.plot(x,y,color='b')


#subplot(211): 21表示要画的图整体是2行1列的,一共包括两个子图,最后的1表示当前绘制顺序是第一副子图.

subplot(212)表示还是这个整体,只是在顺序上要画第二个位置上的子图。



#横着排列

plt.subplot(121)

plt.plot(x,y,color='r')

plt.subplot(122)

plt.plot(x,y,color='b')



#也可以创建多行多列的,制定好整体规模,然后在各个位置上画图即可。如果当前子图没有执行绘画操作,该位置会空出来。

plt.subplot(321)

plt.plot(x,y,color='r')

plt.subplot(324)

plt.plot(x,y,color='b')

plt.subplot(325)

plt.plot(x,y,color='m')



#绘制结束后,会在图上加一些解释说明,即标注

plt.plot(x,y,color='b',linestyle=':',marker='o',markerfacecolor='r',markersize=10)

plt.xlabel(' x:---')

plt.ylabel(' y:---')

#图片标题

plt.title('picTitle')

#在指定位置添加注释

plt.text(0,0,'descAt_0,0')

#显示网格

plt.grid(True)

#添加箭头,需给定起始位置和结束位置以及箭头的各种属性

plt.annotate('arrow',xy=(-5,0),xytext=(-2,0.3),arrowprops=dict(facecolor='red',shrink=0.05,headlength=20,headwidth=20))




#风格设置

先看下matplotlib有哪些能调用的风格

plt.style.available

结果:

['Solarize_Light2',

 '_classic_test_patch',

 'bmh',

 'classic',

 'dark_background',

 'fast',

 'fivethirtyeight',

 'ggplot',

 'grayscale',

 'seaborn',

 'seaborn-bright',

 'seaborn-colorblind',

 'seaborn-dark',

 'seaborn-dark-palette',

 'seaborn-darkgrid',

 'seaborn-deep',

 'seaborn-muted',

 'seaborn-notebook',

 'seaborn-paper',

 'seaborn-pastel',

 'seaborn-poster',

 'seaborn-talk',

 'seaborn-ticks',

 'seaborn-white',

 'seaborn-whitegrid',

 'tableau-colorblind10']


#改变当前风格

plt.style.use('seaborn-talk')

plt.plot(x,y)



#常用图表绘制

#条形图

np.random.seed(0)

x=np.arange(5)

#随机创建数据

y=np.random.randint(-5,5,5)

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

#正常的条形图

v_bars=axes[0].bar(x,y,color='red')

#横着来画

h_bars=axes[1].barh(x,y,color='blue')

#通过子图索引来分别设置各自细节

axes[0].axhline(0,color='grey',linewidth=2)

axes[1].axvline(0,color='grey',linewidth=2)

plt.show()




#绘图时,有时候需要考虑误差棒,用于表示数据或实验的偏差情况,

#在bar()函数中,有现成的yerr和xerr参数


#数值

mean_values=[1,2,3]

#误差棒

variance=[0.2,0.4,0.5]

#名字

bar_label=['bar1','bar2','bar3']

#指定位置

x_pos=list(range(len(bar_label)))

#带有误差棒的条形图

plt.bar(x_pos,mean_values,yerr=variance,alpha=0.3)

#可以设置x轴y轴的取值范围

max_y=max(zip(mean_values,variance))

#y轴标签

plt.ylabel('variance_y')

#x轴标签

plt.xticks(x_pos,bar_label)

plt.show()



#盒图

boxplot主要有最小值(min)、下四分位数(Q1)、中位数(median)、上四分位数(Q3)、最大值(max)五部分组成,也可以加入其他指标


dat=[np.random.normal(0,std,100) for std in range(1,4)]

fig=plt.figure(figsize=(8,6))

plt.boxplot(dat,sym='s',vert=True)

plt.xticks([y+1 for y in range(len(dat))],['x1','x2','x3'])

plt.xlabel('x')

plt.title('box_plot')


每一个小盒图中,从下到上分别对应之前说的5个部分,计算方法如下:

IQR=Q3-Q1  ,即上下四分位数的差

min=Q1-1.5×IQR:  正常范围的下限

max=Q3+1.5×IQR: 正常范围的上限

方块代表异常点或离群点,离群点就是超出上下限的数据点,所以盒图可以方便看出离群点的情况。


#查看boxplot完整参数

print(help(plt.boxplot))



#直方图和散点图

直方图(Histogram)可清晰表示数据的分布情况

dat=np.random.normal(0,20,1000)

bins=np.arange(-100,100,5)

plt.hist(dat,bins=bins)

plt.xlim([min(dat)-5,max(dat)+5])

plt.show()


#画直方图,需要指定一个bins,即按照什么区间来划分,

如:np.arange(-10,10,5)=[-10,-5,0,5]



#散点图

散点图用来表示特征之间的相关性,调用scatter()函数即可。

N=1000

x=np.random.randn(N)

y=np.random.randn(N)

plt.scatter(x,y,alpha=0.3)

plt.grid(True)

plt.show()






#3D图:

如需要展示三维数据情况,就需要用到3D图

import matplotlib.pyplot as plt

#额外导入3D图绘制工具

from mpl_toolkits.mplot3d import Axes3D

fig=plt.figure()

#需要绘制3D图

ax=fig.add_subplot(111,projection='3d')

plt.show()