机器学习(四):初级matplitlib绘图-2维绘图

注:百度百科案例

首先,我们必须导入对应的库。主要的绘图函数在子库 matplotlib.pyplot

import numpy as np
import matplitlib as nml
import matplotlib.pyplot as plt
%matplotlib inline

注:%matplotlib inline是再使用jupyter notebook或者jupyter qtconsole的时候才会用到,如果用的是pycharm或者spyder即不需要使用这个(用了还会报错)。在notebook中使用这个的作用是在你调用matplotlib.pyplot的绘图函数plot()进行绘图的时候,或者生成一个figure画布的时候,可以直接在你的python console里面生成图像。

我们将按照存储在 NumPy ndarray 对象中的数据绘制图表。当然,matplotlib 也能够按照以不同的 Python格式存储的数据(如列表对象)绘制图表。首先,我们需要用于绘制图表的数据。为此,我们生成20个标准正态分布(伪)随机数,保存在一个NumPy ndarray

np.random.seed(1000)
y = np.random.standard_normal(20)

假定:

x值:包含x坐标(横坐标)的列表或者数组

y值:包含y坐标(纵坐标)的列表或者数组

x和y值的数量必须相等,如下述代码:

x = range(len(y)) 

plt.plot(x,y) 

plt.show()

显示如图:

我们用样板数据调用 ndarray 对象上的 cumsum 方法,可以获得这些数据的总和,并且和预想的一样得到不同的输出,如下图

plt.grid(True) #添加网格线
plt.axis('tight') #紧凑坐标轴
plt.show()

plt.axis选项:

empty:返回当前坐标轴限值

off:关闭当前坐标轴线和标签

equal:使用等刻度

scaled:通过尺寸变化平衡刻度

tight:是所有数据可见(缩小限值)

image:使所有数据可见(使用数据限值)

[xmin,xmax,ymin,ymax]:将设置限定为给定的一组值

可以使用 plt.xlim 和 plt.ylim 设置每个坐标轴的最小值和最大值。为了得到更好的易理解性,图表通常包含一些标签——例如描述x和y值性质的标题和标签。这些标签分别通过 plt.titleplt.xlabe和 plt.ylabel 添加。默认情况下,即使提供的数据点是离散的,plot也绘制连续线条。离散点的绘制通过选择不同的样式选项实现。下图覆盖(红色)点和线宽为1.5个点的(蓝色)线条:

plt.figure(figsize=(7,4))
plt.plot(y.cumsum(),'b',lw=1.5)
plt.plot(y.cumsum(),'ro')
plt.grid(True) #添加网格线
plt.axis('tight') #紧凑坐标轴
plt.xlabel('index')
plt.ylabel('value')
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
plt.title('梦里是客')
plt.xlim(-1,20) #坐标轴刻度的范围
plt.ylim(np.min(y.cumsum())-1,np.max(y.cumsum())+1)
plt.show()

plt.plot 支持的颜色等可查看如下链接:

https://blog.youkuaiyun.com/qq_26376175/article/details/67637151

特殊字符,例如公式查看以下链接:

https://matplotlib.org/users/mathtext.html

一般来说,数据集包含多个单独的子集。这种数据的处理遵循matplotlib处理一维数据时的原则。但是,这种情况会出现其他一些问题,例如,两个数据集可能有不同的刻度,无法用相同的y或x轴刻度绘制。另一个问题是,你可能希望以不同的方式可视化两组不同数据,例如,一组数据使用线图,另一组使用柱状图。

我们生成一个二维样本数据集。下面的代码生成包含标准正态分布(伪)随机数的20×2 NumPy ndarray。在这个数组上调用 cumsum 计算样本数据在0轴(即第一维)上的总和。可以为每个数据集添加单独的标签并在图例中列出。plt.legend 接受不同的位置参数。0表示“最佳位置”,也就是图例尽可能少地遮盖数据。下图展示了包含两个数据集的图表,这一次带有图例。在生成代码中,我们没有传递整个 ndarray 对象,而是分别访问两个数据子集(y[:, 0]和y[:, 1]),可以为它们附加单独的标签。数据集常常有不同的刻度,用单一 y轴刻度绘制这种数据的图表通常会导致可视化信息的显著丢失。为了说明这种效果,我们将两个数据子集中的第一个扩大 100倍,再次绘制该图

np.random.seed(2000)
y = np.random.standard_normal((20,2)).cumsum(axis=0)
x = range(len(y))
y[:,0]=y[:,0]*100
plt.figure(figsize=(7,4))
plt.plot(y[:,0],lw=1.5,label='1st')
plt.plot(y[:,1],lw=1.5,label='2st')
plt.plot(y,'ro')
plt.grid(True) #添加网格线
plt.axis('tight') #紧凑坐标轴
plt.legend(loc=0)#0表示最佳位置,使图例尽可能少的遮盖数据
plt.xlabel('index')
plt.ylabel('value')
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
plt.title('梦里是客')
plt.show()

第一个数据集仍然是“在视觉上易于辨认的”,而第二个数据集在新的Y轴刻度上看起来像一条直线。在某种程度上,第二个数据集的有关信息现在“在视觉上已经丢失”。解决这个问题有两种基本方法:

1:使用 2 个 y 轴(左/右)

2:使用两个子图(上/下,左/右)

我们首先在图表中引入第二个 y 轴。下图中有两个不同的y轴,左侧的y轴用于第一个数据集,右侧的y轴用于第二个数据集,因此,有两个图例:

np.random.seed(2000)
y = np.random.standard_normal((20,2)).cumsum(axis=0)
x = range(len(y))
y[:,0]=y[:,0]*100
fig,ax1 = plt.subplots()
#plt.figure(figsize=(7,4))
plt.plot(y[:,0],'b',lw=1.5,label='1st')
plt.plot(y[:,0],'ro')
plt.grid(True) #添加网格线
plt.legend(loc=8)
plt.xlabel('index')
plt.ylabel('value 1st')
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
plt.title('梦里是客')
ax2=ax1.twinx()
plt.plot(y[:,1],'g',lw=1.5,label='2st')
plt.plot(y[:,1],'ro')
plt.legend(loc=0)
plt.ylabel('value 2st')
#plt.xlim(-1,20) #坐标轴刻度的范围
#plt.ylim(np.min(y.cumsum())-1,np.max(y.cumsum())+1)
plt.show()

通过使用 plt.subplots函数,可以直接访问底层绘图对象(图、子图等)。例如,可以用它生成和第一个子图共享x轴的第二个子图。上图中有两个相互重叠的子图。

接下来,考虑两个单独子图的情况。这个选项提供了处理两个数据集的更大自由度,如下图所示:

plt.figure(figsize=(7,5))
plt.subplot(211)
plt.plot(y[:,0],lw=1.5,label='1st')
plt.plot(y[:,0],'ro')
#plt.grid(True) #添加网格线
#plt.axis('tight')
plt.legend(loc=0)
plt.xlabel('index')
plt.ylabel('value')
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
plt.title('梦里是客')

plt.subplot(212)
plt.plot(y[:,1],'g',lw=1.5,label='2st')
plt.plot(y[:,1],'ro')
plt.legend(loc=0)
plt.xlabel('index')
plt.ylabel('value')
#plt.grid(True) #添加网格线
#plt.axis('tight')
#plt.xlim(-1,20) #坐标轴刻度的范围
#plt.ylim(np.min(y.cumsum())-1,np.max(y.cumsum())+1)
plt.show()

选择两个不同的图表类型来可视化数据可能是必要的或者是理想的。利用子图方法,就可以自由地组合matplotlib提供的任意图表类型,下图组合了线图/点图和柱状图:

plt.figure(figsize=(9,4))
plt.subplot(211)
plt.plot(y[:,0],lw=1.5,label='1st')
plt.plot(y[:,0],'ro')
#plt.grid(True) #添加网格线
#plt.axis('tight')
plt.legend(loc=0)
plt.xlabel('index')
plt.ylabel('value')
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
plt.title('梦里是客')

plt.subplot(212)
plt.bar(np.arange(len(y)),y[:,1],width=0.5,color='g',label='2st')
plt.grid(True)
plt.axis('tight')
plt.legend(loc=0)
plt.xlabel('index')
plt.ylabel('value')
plt.title('shiyp')
#plt.grid(True) #添加网格线
#plt.axis('tight')
#plt.xlim(-1,20) #坐标轴刻度的范围
#plt.ylim(np.min(y.cumsum())-1,np.max(y.cumsum())+1)
plt.show()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值