matplotlib绘制图片

一,绘制线性图。

用于画抛物线,直线,折线等。反映二维数组中,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()#显示图片。

参数说明:

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

参数说明:

#np.random.normal(loc=mu,scale=sigma,size=1000)#由均值mu和标准差sigma,获得一个长度为1000的正态分布数组。若np.random.normal(loc=0, scale=1, size),则等价于np.random.randn(size)得到标准正态分布。

参数的意义为:
locfloat,表此概率分布的均值(对应着整个分布的中心centre
scalefloat,表此概率分布的标准差(对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高)

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

五、绘制散点图

与线性图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()

七、绘制等高线

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。


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值