20. Matplotlib 数据可视(上):https://developer.aliyun.com/article/1529105
2.5 散点图
散点图是由独立的恶点、圆圈或其它形状构成的。
使用plt.plot/ax.plot
画散点图。
%matplotlib inline import matplotlib.pyplot as plt import numpy as np plt.style.use('seaborn-whitegrid') x = np.linspace(0,10,30) y = np.sin(x) plt.plot(x,y,'o',color='black')
rng = np.random.RandomState(0) for marker in ['o','.',',','x','+','v','^','<','>','s','d']: plt.plot(rng.rand(5),rng.rand(5),marker,label="marker='{0}'".format(marker)) plt.legend(numpoints=1) plt.xlim(0,1.8)
plt.plot(x,y,'-ok') # 直线(-)、圆圈(o)、黑色(k) plt.plot(x,y,'-p',color='gray',markersize=15,linewidth=4, markerfacecolor='white', markeredgecolor='gray', markeredgewidth=2) plt.ylim(-1.2,1.2)
用plt.scatter
函数画散点图。
plt.scatter与plt.plot的主要区别:前者在创建散点图时具有更高的灵活性,可以单独控制每个散点图与数据匹配,也可以让每个散点图具有不同的属性(大小、表面颜色、边框颜色等)
rng = np.random.RandomState(0) x = rng.randn(100) y = rng.randn(100) colors = rng.rand(100) sizes = 1000*rng.rand(100) plt.scatter(x,y,c=colors,s=sizes,alpha=0.3,cmap='viridis') plt.colorbar()
from sklearn.datasets import load_iris iris = load_iris() features = iris.data.T plt.scatter(features[0],features[1],alpha=0.2, s=100*features[3],c=iris.target,cmap='viridis') plt.xlabel(iris.feature_names[0]) plt.ylabel(iris.feature_names[1])
数据量较小的时候,plt.plot与plt.scatter在效率上差异不大,但是当数据大的时候,plt.plot的效率将大大高于plt.scatter。
2.6 等高线图
使用plt.contour
可以画等高线图,可以画带有填充色的等高线图的色彩,使用plt.imshow可以显示图形。
%matplotlib inline import matplotlib.pyplot as plt import numpy as np plt.style.use('seaborn-white') def f(x,y): return np.sin(x)**10+np.cos(10+y*x)*np.cos(x) x = np.linspace(0,5,50) # 0~5中50个等差数字 y = np.linspace(0,5,40) X,Y = np.meshgrid(x,y) # 从一维数组构建二维网格数据 Z = f(X,Y) # plt.contour(X,Y,Z,colors='black') # 画标准的线形等高线图 plt.contour(X,Y,Z,20,cmap='RdGy') # 设置一个线条配色方案自定义颜色,将数据范围等分为20份;红-灰 plt.colorbar() # 自动创建一个表示图形各种颜色对应的标签颜色条
contours = plt.contour(X,Y,Z,3,colors='black') plt.clabel(contours,inline=True,fontsize=8) plt.imshow(Z,extent=[0,5,0,5],origin='lower',cmap='RdGy',alpha=0.5)# alpha 设置透明度 plt.colorbar()
2.7 直方图
一维直方图:创建一个简易的频次直方图
%matplotlib inline import matplotlib.pyplot as plt import numpy as np plt.style.use('seaborn-white') # data = np.random.randn(1000) # plt.hist(data,bins=30,density=True,alpha=0.5, # histtype='stepfilled',color='steelblue', # edgecolor='none') x1 = np.random.normal(0,0.8,1000) x2 = np.random.normal(-2,1,1000) x3 = np.random.normal(3,2,1000) kwargs = dict(histtype='stepfilled',alpha=0.3,density=True,bins=40) plt.hist(x1,**kwargs) plt.hist(x2,**kwargs) plt.hist(x3,**kwargs) print(counts) # 查看每段区间样本数 [ 16 249 565 165 5]
二维直方图:将二维数组按照二维区间进行切分创建二维频次直方图。
使用plt.hist2d
mean = [0,0] cov = [[1,1],[1,2]] x,y = np.random.multivariate_normal(mean,cov,10000).T plt.hist2d(x,y,bins=30,cmap='Blues') cb = plt.colorbar() cb.set_label('counts in bin') counts,xedges,yedges = np.histogram2d(x,y,bins=30)
使用plt.hexbin
,正六边形分割,将二维数据集成分割成蜂窝状
plt.hexbin(x,y,gridsize=30,cmap='Blues') cb = plt.colorbar(label='count in bin')
核密度估计:使用KDE方法抹除空间中离散的数据点,从而拟合一个平滑的函数。
from scipy.stats import gaussian_kde data = np.vstack([x,y]) kde = gaussian_kde(data) xgrid = np.linspace(-3.5,3.5,40) ygrid = np.linspace(-6,6,40) Xgrid,Ygrid = np.meshgrid(xgrid,ygrid) Z = kde.evaluate(np.vstack([Xgrid.ravel(),Ygrid.ravel()])) plt.imshow(Z.reshape(Xgrid.shape),origin='lower', aspect='auto',extent=[-3.5,3.5,-6,6],cmap='Blues') cb = plt.colorbar(label='density')
KDE 方法通过不同的平滑带宽长度在拟合函数的准确性和平滑性之间做出权衡。gaussian_kde通过一种经验方法试图找到输入数据平滑长度的近似最优解。