600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > Python金融大数据分析——第五章数据可视化(1)二维绘图

Python金融大数据分析——第五章数据可视化(1)二维绘图

时间:2022-02-09 17:39:58

相关推荐

Python金融大数据分析——第五章数据可视化(1)二维绘图

目录

第五章 数据可视化

5.1 二维绘图

5.1.1 一维数据集

5.1.2 二维数据集

5.1.3绘制其他图表

5.1.3.1绘制散点图

5.1.3.2 直方图

5.1.3.3 箱型图

第五章 数据可视化

5.1 二维绘图

5.1.1 一维数据集

生成20个标准正态分布(伪)随机数,保存在Numpy ndarray中。

'''生成20个标准正态分布(伪)随机数,保存在Numpy ndarray中。'''import numpy as npimport matplotlib.pyplot as pltimport matplotlib as mplnp.random.seed(1000)y = np.random.standard_normal(20)x = range(len(y))plt.plot(x, y)plt.show()

plot会注意何时传递ndarray对象,此时没必要单独提供x值信息,只需要提供y值,plot就会以索引值作为对应的x值。如下:

'''生成20个标准正态分布(伪)随机数,保存在Numpy ndarray中。'''import numpy as npimport matplotlib.pyplot as pltimport matplotlib as mplnp.random.seed(1000)y = np.random.standard_normal(20)plt.plot(y)plt.show()

通过调用ndarray对象上的cumsum方法,可以获得这些数据的总和。

# 通过调用ndarray对象上的cumsum方法,可以获得这些数据的总和plt.plot(y.cumsum())plt.show()

默认绘图样式不能满足报表,一般都需要自定义样式。可以修改轴的范围,添加网格等,

# 上述默认绘图样式不能满足报表,一般都需要自定义样式。plt.plot(y.cumsum())plt.grid(True) # 添加网格plt.axis('tight') # 修改轴范围,tight使所有数据可见plt.show()

设置坐标轴的最小值最大值范围,通过xlim,ylim进行设置

# 可以设置坐标轴的最小值和最大值plt.plot(y.cumsum())plt.grid(True)plt.xlim(-1, 20)plt.ylim(np.min(y.cumsum()) - 1,np.max(y.cumsum()) + 1)plt.show()

为了让图表更容易理解,可以添加附加的信息。

# 为了让图标更容易理解,需要加些附加的信息plt.figure(figsize=(7, 4))plt.plot(y.cumsum(), 'b', lw=1.5) # 线宽1.5,蓝色直线plt.plot(y.cumsum(), 'ro') # 红色圆点plt.grid(True)plt.axis('tight')plt.xlabel('index') # x轴标识plt.ylabel('value') # y轴标识plt.title('A Simple Plot') # 标题plt.show()

这里颜色的缩写如下:

5.1.2 二维数据集

生成包含标准正态分布(伪)随机数的20x2Numpy ndarray。在这个数组上调用cumsum计算样本数据在0轴(第一维上)的总和。

# 二维数据集# 生成标准正态分布伪随机数的20x2的Numpy ndarraynp.random.seed(2000)y = np.random.standard_normal((20, 2)).cumsum(axis=0)# 一般来说,将这样的二维数组传递给plt.plot,将自动把包含的数据解释为单独的数据集(沿着1轴,即第二维plt.figure(figsize=(7, 4))plt.plot(y, lw=1.5)plt.plot(y, 'ro')plt.grid(True)plt.axis('tight')plt.xlabel('index')plt.ylabel('value')plt.title('A Simple Plot')plt.show()

在上述图表中,多个图表的集合,很难区分出单独的一条曲线,这时候需要使用legend进行区分。plt.legend接受不同的位置参数。0表示最佳位置,也就是尽可能的少覆盖数据。下述代码中没有传递整个ndarray对象,而是分别访问y集合中的两个数据子集y[:,0]和y[:,0]

# 使用legend区分不同的曲线np.random.seed(2000)y = np.random.standard_normal((20, 2)).cumsum(axis=0)plt.figure(figsize=(7, 4))plt.plot(y[:, 0], lw=1.5, label='1st')plt.plot(y[:, 1], lw=1.5, label='2nd')plt.plot(y, 'ro')plt.grid(True)plt.legend(loc=0)plt.axis('tight')plt.xlabel('index')plt.ylabel('value')plt.title('A Simple Plot')plt.show()

面对上述多条曲线的图表,往往会出现不同图表的y轴值在不同的范围内,这时需要设置两个不同的y轴范围,而不是单一的y轴刻度。

首先绘制错误不可取的图表信息(将其中一个的y值范围扩大100倍)。

# 错误示范,将其中一个的数据扩大100倍np.random.seed(2000)y = np.random.standard_normal((20, 2)).cumsum(axis=0)y[:, 0] = y[:, 0] * 100plt.figure(figsize=(7, 4))plt.plot(y[:, 0], lw=1.5, label='1st')plt.plot(y[:, 1], lw=1.5, label='2nd')plt.plot(y, 'ro')plt.grid(True)plt.legend(loc=0)plt.axis('tight')plt.xlabel('index')plt.ylabel('value')plt.title('A Simple Plot')plt.show()

上述的2nd曲线,完全看不出细节,这是不可取的,可以做如下操作,使绘制图表的细节看得更明显直观。

# 这里有两种方式:使用2个轴; 使用两个子图

首先是使用两个y轴

# 设置两条y轴坐标轴,避免丢失曲线细节可视化# 这里有两种方式:使用2个轴; 使用两个子图# 使用两个y轴np.random.seed(2000)y = np.random.standard_normal((20, 2)).cumsum(axis=0)y[:, 0] = y[:, 0] * 100fig, ax1 = plt.subplots()plt.plot(y[:, 0], 'b', lw=1.5, label='1st')plt.plot(y[:, 0], 'ro')plt.grid(True)plt.legend(loc=8)plt.axis('tight')plt.xlabel('index')plt.ylabel('value')plt.title('A Simple Plot')ax2 = ax1.twinx()plt.plot(y[:, 1], 'g', lw=1.5, label='2nd')plt.plot(y[:, 1], 'ro')plt.legend(loc=0)plt.ylabel('value 2nd')plt.show()

管理坐标轴的关键代码如下:

fig, ax1 = plt.subplots()

ax2 = ax1.twinx()

使用plt.subplots函数,可以直接访问底层绘图对象。可以生成和第一个子图共享x轴的第二个子图。其实就是两个完全重叠的子图。

方法二:生成两个单独的子图,这样的数据集的自由度更大。

# 生成两个单独的子图np.random.seed(2000)y = np.random.standard_normal((20, 2)).cumsum(axis=0)y[:, 0] = y[:, 0] * 100plt.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.legend(loc=0)plt.axis('tight')plt.ylabel('value')plt.title('A Simple Plot')plt.subplot(212)plt.plot(y[:, 1], 'g', lw=1.5, label='2nd')plt.plot(y[:, 1], 'ro')plt.grid(True)plt.legend(loc=0)plt.axis('tight')plt.xlabel('index')plt.ylabel('value')plt.show()

这里,figure对象中子图的定位是通过使用一种特殊的坐标系来实现的。plt.subplot有三个整数参数,numrows,numcols和fignum(可由逗号或者不加逗号)

numrows:指定行数 numcols:指定列数 fignum:指定子图编号(从1到 numrowsXnumcols)

例如绘制9个完全大小相等的子图图标,有numrows=3,numcols=3,fignum=1,2,3,...9,右下角的子图坐标为plt.subplot(3,3,9)或者plt.subplot(339)。

有时候,需要用两种不同形式的图表类型来可视化数据,此时需要自由得组合matplotlib提供的任意图标类型。

例:绘制线图/点图和柱状图:

# 生成两个不同类别的子图(线点图和柱状图)np.random.seed(2000)y = np.random.standard_normal((20, 2)).cumsum(axis=0)y[:, 0] = y[:, 0] * 100plt.figure(figsize=(9, 4))plt.subplot(1, 2, 1)plt.plot(y[:, 0], lw=1.5, label='1st')plt.plot(y[:, 0], 'ro')plt.grid(True)plt.legend(loc=0)plt.axis('tight')plt.xlabel('index')plt.ylabel('value')plt.title('1st Data Set')plt.subplot(122)plt.bar(np.arange(len(y)), y[:, 1], width=0.5,color='g', label='2nd')plt.grid(True)plt.legend(loc=0)plt.axis('tight')plt.xlabel('index')plt.title('2nd Data Set')plt.show()

5.1.3绘制其他图表

5.1.3.1绘制散点图

plot绘制散点图

##其他绘图样式# 散点图y = np.random.standard_normal((1000, 2))plt.figure(figsize=(7, 5))plt.plot(y[:, 0], y[:, 1], 'ro')plt.grid(True)plt.xlabel('1st')plt.ylabel('2nd')plt.title('Scatter Plot')plt.show()

使用scatter绘图函数绘制散点图

# 使用Scatter绘制散点图y = np.random.standard_normal((1000, 2))plt.figure(figsize=(7, 5))plt.scatter(y[:, 0], y[:, 1], marker='o')plt.grid(True)plt.xlabel('1st')plt.ylabel('2nd')plt.title('Scatter Plot')plt.show()

利用scatter绘制可变色的散点图。

# 绘制第三维通过不同颜色可视化的散点图# 使用0-10之间的随机整数,生成第三个数据集。# 1000个随机数,在0-2中随机y = np.random.standard_normal((1000, 2))# 1000个随机数,在0-10中随机整数c = np.random.randint(0, 10, len(y))plt.figure(figsize=(7, 5))plt.scatter(y[:, 0], y[:, 1], c=c, marker='o')plt.colorbar()plt.grid(True)plt.xlabel('1st')plt.ylabel('2nd')plt.title('Scatter Plot')plt.show()

5.1.3.2 直方图

直方图常用于金融收益中。

例如:在同一个图表中放置两个数据集的频率值。

# 直方图# 例如:在同一个图表中放置两个数据集的频率值。plt.figure(figsize=(7, 4))##表示绘图画板尺寸为7*4y = np.random.standard_normal((1000, 2))#表示随机生成一个标准正态分布形状是1000*2的数组plt.hist(y, label=['1st', '2nd'], bins=25)#表示使用y绘制直方图,数据组数有25个,标签分别使用'1st'和'2nd';plt.grid(True)plt.legend(loc=0)plt.xlabel('value')plt.ylabel('frequency')plt.title('Histogram')plt.show()

直方图所用的函数为hist,plt.hist参数如下表

直方图中堆叠方式显示两个数据集的数据

# 两个数据集在直方图中堆叠y = np.random.standard_normal((1000, 2)) # 表示随机生成一个标准正态分布形状是1000*2的数组plt.figure(figsize=(7, 4))##表示绘图画板尺寸为7*4# 表示使用y绘制直方图,数据组数有20个,标签分别使用'1st'和'2nd',颜色分别为蓝色和绿色plt.hist(y, label=['1st', '2nd'], color=['b', 'g'],stacked=True, bins=20)plt.grid(True)plt.legend(loc=0)plt.xlabel('value')plt.ylabel('frequency')plt.title('Histogram')plt.show()

5.1.3.3 箱型图

箱型图可以简洁地描述数据集的特性,很容易比较多个数据集。

# 箱型图fig, ax = plt.subplots(figsize=(7, 4))y = np.random.standard_normal((1000, 2)) # 表示随机生成一个标准正态分布形状是1000*2的数组plt.boxplot(y)plt.grid(True)plt.setp(ax, xticklabels=['1st', '2nd'])plt.xlabel('data set')plt.ylabel('value')plt.title('Boxplot')plt.show()

有时,需要在图表中插入Latex公式,作为标签。

# LaTex公式标签from matplotlib.patches import Polygon# 定义积分的函数def func(x):return 0.5 * np.exp(x) + 1# 定义积分区间a, b = 0.5, 1.5x = np.linspace(0, 2)y = func(x)# 绘制曲线fig, ax = plt.subplots(figsize=(7, 5))plt.plot(x, y, 'b', linewidth=2)plt.ylim(ymin=0)# 在默认情况下,linspace函数可以生成元素为50的等间隔数列。而前两个参数分别是数列的开头与结尾。# 如果写入第三个参数,可以制定数列的元素个数。# 使用Polygon生成阴影部分Ix = np.linspace(a, b)Iy = func(Ix)verts = [(a, 0)] + list(zip(Ix, Iy)) + [(b, 0)]poly = Polygon(verts, facecolor='0.7', edgecolor='0.5')ax.add_patch(poly)# 添加数学公式和坐标轴标签# r“”中间为LaTex语法表示的公式plt.text(0.5 * (a + b), 1, r"$\int_a^b f(x)\mathrm{d}x$",horizontalalignment='center', fontsize=20)# 前两个参数是放置文本的坐标plt.figtext(0.9, 0.075, '$x$')plt.figtext(0.075, 0.9, '$f(x)$')ax.set_xticks((a, b))ax.set_xticklabels(('$a$', '$b$'))ax.set_yticks([func(a), func(b)])ax.set_yticklabels(('$f(a)$', '$f(b)$'))plt.grid(True)plt.show()

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。