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()