一,绘制线性图。
用于画抛物线,直线,折线等。反映二维数组中,x值对应的y值的走势情况。import numpy as np
import matplotlib.pyplot as plt
dx = np.arange(0,10,1) #array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
dy = pow(dx,2) #array([ 0, 1, 4, 9, 16, 25, 36, 49, 64, 81])相当于dy = dx^2
dy2 = np.arange(15,61,5)#array([15, 20, 25, 30, 35, 40, 45, 50, 55, 60])相当于dy2 = dx*5+15
plt.figure(num = 1,figsize=(8,6))#生成图片一张,图片尺寸为 800*600像素。
plt.title('plot 1',size = 14)#整个图表的名称。
plt.xlabel('x-axis',size = 14)#x轴标题。
plt.ylabel('y-axis',size = 14)#y轴标题。
plt.plot(dx,dy,color='b',linestyle = '--',marker='o',label='y1 data')#绘制第一条线性图,详细解释见下方。
plt.plot(dx,dy2,color = 'r',linestyle='-',label = 'y2 data')#绘制第二条线性图,没有marker,所以是一条直线。
plt.legend(loc = 'upper left')#plt.plot中label字符串显示的位置。
# plt.savefig('images.png',format = 'png')#保存图片,
plt.show()#显示图片。
![](https://i-blog.csdnimg.cn/blog_migrate/bccee6481cc2aef32c8730c1f49052d5.png)
参数说明:
plt.plot(x, y, format_string, **kwargs): x为x轴数据,可为列表或数组;y同理;format_string 为控制曲线的格式字符串, **kwargs 第二组或更多的(x, y, format_string)
format_string: 由 颜色字符、风格字符和标记字符组成。
color:颜色字符,‘b’蓝色 ;‘#008000’RGB某颜色;‘0.8’灰度值字符串
linestyle:风格字符,‘-’实线;‘--’破折线; ‘-.’点划线; ‘:’虚线 ; ‘’‘’无线条
marker:标记字符,‘.’点标记 ‘o’ 实心圈 ‘v’倒三角 ‘^’上三角
eg: plt.plot(a, a*1.5, ‘go-’, a, a*2, ‘*’) 第二条无曲线,只有点
二,绘制直方图
用于显示一维数组中,数值的分布情况。比如班级50人,显示他们成绩的分布情况。
import numpy as np
import matplotlib.pyplot as plt
mu = 0.0 #定义均值为0
sigma = 2.0 #标准差为2
samples = np.random.normal(loc=mu,scale=sigma,size=1000)#详细解释见下方。
plt.figure(num=1,figsize=(8,6))#一幅图,尺寸为800*600像素。
plt.title('plot 2',size=14)#图像标题。
plt.xlabel('value',size=14)#x轴标题。
plt.ylabel('counts',size=14)#y轴标题。
plt.hist(samples,bins=40,range=(-10,10))#返回数据如下:
'''(array([ 0., 0., 0., 0., 1., 0., 0., 1., 3., 4., 10.,
8., 15., 34., 42., 59., 59., 77., 95., 113., 96., 96.,
85., 63., 39., 45., 22., 10., 11., 4., 7., 1., 0.,
0., 0., 0., 0., 0., 0., 0.]), array([-10. , -9.5, -9. , -8.5, -8. , -7.5, -7. , -6.5, -6. ,
-5.5, -5. , -4.5, -4. , -3.5, -3. , -2.5, -2. , -1.5,
-1. , -0.5, 0. , 0.5, 1. , 1.5, 2. , 2.5, 3. ,
3.5, 4. , 4.5, 5. , 5.5, 6. , 6.5, 7. , 7.5,
8. , 8.5, 9. , 9.5, 10. ]), <a list of 40 Patch objects>)'''
plt.show()
![](https://i-blog.csdnimg.cn/blog_migrate/357f9c49bfc2a65ac22e04d0bf801e98.png)
参数说明:
#np.random.normal(loc=mu,scale=sigma,size=1000)#由均值mu和标准差sigma,获得一个长度为1000的正态分布数组。若np.random.normal(loc=0, scale=1, size),则等价于np.random.randn(size)得到标准正态分布。
参数的意义为:
loc:float,表此概率分布的均值(对应着整个分布的中心centre)
scale:float,表此概率分布的标准差(对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高)
size:int or tuple of ints,表输出的shape,默认为None,只输出一个随机数。如果shape = 3,那么就得到类似C语言里面a[3],python里面[n1, n2,n3]; 如果shape = (3, 2),类似a[3][2], python:[[n11,n12], [n21,n22], [n31,n32]];+ 如果shape = (3, 2, 1), a[3][2][1], [ [[ n111], [n121]], [[n211],[n221]], [[n311],[n321]] ]...以此类推.
三、绘制violinplot和heatmap
violinplot:功能类似于直方图,也是反映值的分布情况。不过直方图一般来说数据是一维数组,而小提琴图的数据是{key1:一维数组,key2:一维数据,。。。}。
heatmap:用于反映{key1:一维数组,key2:一维数据,。。。}中各个key values相互关系。
先加入必要的引用
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
下边是自己随便写的一些关于年龄、身高、体重、体育成绩的几个数据。体重与体育成绩成反比。
然后根据这些数据,先绘出小提琴图
df = pd.DataFrame(data = [[20,167,75,65],[22,183,75,93],[22,156,54,95],[23,158,51,96],[23,167,62,91],[22,192,87,68]],columns=['age','height(cm)','weight(kg)','athletic score'])
fig = plt.figure(figsize=(10,10))#图片宽、高均为10英寸,文档中是这样写的,但应该是它还会自适应,因为明显的高度值比宽度大一些。
plt.subplot(2,3,1)#行数,列数,第1个。
sns.violinplot(y = df.columns[0],data=df)#y的标题为age,数据为df中age那一列。
plt.title('all ' + df.columns[0])#设置标题。
plt.subplot(2,3,2)
sns.violinplot(y = df.columns[1],data=df)
plt.title('all ' + df.columns[1])
plt.subplot(2,3,3)
sns.violinplot(y = df.columns[2],data=df)
plt.title('all ' + df.columns[2])
然后绘出系数(就是各列)相互关系图
corrmat = df.corr()
plt.figure(figsize = (10,8))
sns.heatmap(data = corrmat,annot=True)
plt.show()
四、绘制柱形图
一般显示Series中,各个index对应的value。也可显示一个二维数组(x,y)。显示每一个x对应的y值。import pandas as pd
import matplotlib.pyplot as plt
s = pd.Series([100,150])
plt.bar(left=s.index,height=s.values)
plt.xticks(s.index)
plt.show()
![](https://i-blog.csdnimg.cn/blog_migrate/0f1bbfbcd48784ef6b07eaf062776c21.png)
五、绘制散点图
与线性图plt.plot()功能类似,都是反映二维数组中,x值对应的y值的走势情况。不同的是,散点图没有连线。
import numpy as np
import matplotlib.pyplot as plt
dx = np.arange(0,10,1) #array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
dy = pow(dx,2) #array([ 0, 1, 4, 9, 16, 25, 36, 49, 64, 81])相当于dy = dx^2
plt.scatter(x=dx,y=dy)
plt.xlabel('xxxx')
plt.ylabel('yyyy')
plt.show()
六、绘制pairplot
用于显示各个特征对分类的影响。使用pairplot会生成散点图和直方图,每个图都显示不同的特征与分类关系(尽管上下三角形将具有镜像图)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
dfiris = sns.load_dataset("iris")#加载莺尾花数据
#hue:确定关注的特征,即画该特征与其他特征的关系。palette:固定用法,图中各类别使用不同颜色。
sns.pairplot(dfiris,hue='species',palette="husl")
plt.show()
![](https://i-blog.csdnimg.cn/blog_migrate/714f0a6fe7945e8674eab4107c9d8e5e.png)
七、绘制等高线
1、等高线的意义
利用 x、y 平面内的等高线,可以给出函数u=f(x,y)的另一个不同的表示法。代替所考察的三维“景象”u=f(x,y),我们可画出函数的等高线,这些等高线表示所有相同高度u的点在x、y平面上的投影。这些等高线就是就是曲线 f(x,y)=c,其中对每条曲线,它上面所有的点(xi,yi)都对应同一个常数c。
2、右手坐标系
在3D坐标系中,存在两种完全不同的坐标系:左手坐标系和右手坐标系(在matplotlib中,我们使用的是右手坐标系)。如果同属于左手坐标系或右手坐标系,则可以通过旋转来重合,进而根据左/右手准则来判断x、y、z轴的正方向,否则不可以。
“左手”和“右手”分别代表什么意思呢?我们先学习一下怎样判断坐标系的类型。伸出左手,让拇指和食指成“L”形,大拇指向右,食指向上。中指指向前方。现在,我们就已经建立了一个左手坐标系,拇指、食指和其余手指分别代表x、y、z轴的正方向。如图所示:
同样,伸出右手,使食指向上,中指向前,拇指这时指向左,这就是一个右手坐标系,拇指、食指和其余三个手指分别代表x、y、z轴的正方向。右手坐标系如图所示:
关于左/右手坐标系还有很多更精彩的知识,但这里我们只简要介绍我们进行机器学习所需要了解的基本内容,有兴趣深入了解的,可去百度一下相关资料。
3、绘等高线图
下面用一个简章的例子来介绍matplotlib等高线的画法。如: z=x^2+y^2 。我们先画出它的三维图像,代码和结果如下所示:
import numpy as np
from matplotlib import cm
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
#画z=x^2+y^2 的三维图像:
delta = 1
x = np.arange(-2, 3, delta)#此处故意把x和y的取值设置成不一样的,用于更方便地区分三维坐标中x,y,z轴.
y = np.arange(-3, 4, delta)
X, Y = np.meshgrid(x, y)
Z = X**2 + Y**2
x=X.flatten()
y=Y.flatten()
z=Z.flatten()
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot_trisurf(x, y, z, cmap=cm.jet, linewidth=0.01)
plt.show()
注意,此时X,Y,Z的值分别是
X [[-2 -1 0 1 2]
[-2 -1 0 1 2]
[-2 -1 0 1 2]
[-2 -1 0 1 2]
[-2 -1 0 1 2]
[-2 -1 0 1 2]
[-2 -1 0 1 2]]
(7, 5)
Y [[-3 -3 -3 -3 -3]
[-2 -2 -2 -2 -2]
[-1 -1 -1 -1 -1]
[ 0 0 0 0 0]
[ 1 1 1 1 1]
[ 2 2 2 2 2]
[ 3 3 3 3 3]]
(7, 5)
Z [[13 10 9 10 13]
[ 8 5 4 5 8]
[ 5 2 1 2 5]
[ 4 1 0 1 4]
[ 5 2 1 2 5]
[ 8 5 4 5 8]
[13 10 9 10 13]]
(7, 5)
下面画它的等高线图,这里为更容易理解,只画出三条等高线,如果想画出X,Y区域内所有等高线,只用去掉pc = plt.contour(X, Y, Z,[1,2,3],cmap='jet')中的[1,2,3]参数即可。
from matplotlib.ticker import MultipleLocator, FormatStrFormatter
pc = plt.contour(X, Y, Z,[1,2,3],cmap='jet')#注意这里的X ,Y,Z为大写。只想画出 z=1,z=2,z=3 这 3 条等高线:
#设置主刻度标签的位置,标签文本的格式。
pc.ax.xaxis.set_major_locator(MultipleLocator(0.5)) #将x主刻度标签设置为20的倍数
pc.ax.xaxis.set_major_formatter(FormatStrFormatter('%1.1f')) #设置x轴标签文本的格式
pc.ax.yaxis.set_major_locator(MultipleLocator(0.5)) #将y轴主刻度标签设置为0.5的倍数
pc.ax.yaxis.set_major_formatter(FormatStrFormatter('%1.1f')) #设置y轴标签文本的格式
#设置次刻度标签的位置,请注意次标签没有标签文本,这也是它和主刻度的区别
pc.ax.xaxis.set_minor_locator(MultipleLocator(0.1)) #将x轴次刻度标签设置为5的倍数
pc.ax.yaxis.set_minor_locator(MultipleLocator(0.3)) #将此y轴次刻度标签设置为0.1的倍数
#设置坐标系中,x轴和y轴坐标网络使用主刻度还是次刻度。
pc.ax.xaxis.grid(True, which='major') #x坐标轴的网格使用主刻度
pc.ax.yaxis.grid(True, which='minor') #y坐标轴的网格使用次刻度
plt.show()
运行结果如下如所示,从内到外分别为z=1,z=2,z=3 这3条等高线。这里加了x,y轴的刻度线,很容易看出每条线的任意一个点的(x,y)值都等于一个常数z。