金融数据可视化小总结版本

本文详细介绍了如何在Python中使用matplotlib库创建二维线图、双轴线图、子图绘制以及三维图,包括设置坐标轴、颜色映射和仿射变换等功能,旨在帮助读者理解《Python金融风险管理》一书中的相关内容。
摘要由CSDN通过智能技术生成

主要总结一些matplotlib的应用,是《Python金融风险管理》一书的学习笔记,保存自用。

 

 

一、二维线图

图片来源于python金融风险分析

下面展示书中二维线图的例子,这个例子和之前用的代码风格不一样,不是很好理解,所以加了很多解释。 

###############
import numpy as np
import matplotlib as mp
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator
# Fixing random state for reproducibility
np.random.seed(19680801)

t = np.arange(0, 30, 0.01)
nse1 = np.random.randn(len(t))                 # white noise 1
nse2 = np.random.randn(len(t))                 # white noise 2

# Two signals with a coherent part at 2Hz and a random part
s1 = np.sin(2 * np.pi * 2 * t) + nse1
s2 = np.sin(2 * np.pi * 2 * t) + nse2

fig,ax = plt.subplots(figsize=(9,6))#创建一个图形fig和一个轴ax,制定图形大小
plt.plot(t, s1, t, s2)#画上面创建的四个数组

font = {'family':'Times New Roman','weight':'normal', 'size'   : 8}
mp.rc('font', **font)
mp.rcParams['axes.linewidth'] = 0.5 #将坐标轴的宽度设置为0.5
#font字典用于定义字体的相关属性,这个字典包含三个键值对,
#'family': 'Times New Roman':指定字体族为 "Times New Roman",即使用这种字体。
#'weight': 'normal':指定字体的粗细为正常(即不加粗)。
#'size': 8:指定字体大小为8
#这个字典后面通过 mp.rc('font', **font) 语句将这些字体属性应用于Matplotlib的全局字体设置。这样,整个图形中的文本将使用指定的字体、粗细和大小。
ax.set_xlim(0,2)
ax.set_ylim(-4,4)
ax.set(xlabel='Time [s]', ylabel='Magnitude',title='Figure Title: White Noise')
ax.xaxis.set_major_locator(MultipleLocator(0.5))#设置主轴主刻度定位器,设置x轴每隔0,5单位显示一个刻度
ax.xaxis.set_minor_locator(MultipleLocator(0.25))#这行代码的作用是在 x 轴上设置次要刻度的位置定位器,使得次要刻度的位置每隔 0.25 个单位就会显示一个刻度线。次要刻度线是介于主刻度之间的刻度线,用于更精细地划分坐标轴。
ax.yaxis.set_major_locator(MultipleLocator(1))
ax.yaxis.set_minor_locator(MultipleLocator(0.5))
ax.tick_params(which='major', length=7,width = 0.5)
#which='major':指定设置主刻度的参数。
#length=7:设置主刻度的长度为 7。
#width=0.5:设置主刻度的宽度为 0.5。
#这行代码的作用是为 x 轴的主刻度设置参数,包括刻度的长度和宽度。这样的设置可以影响刻度线的外观,使其更符合特定的图形风格或需求。
ax.tick_params(which='minor', length=4,width = 0.5)
ax.grid(linewidth=0.5,linestyle='--')#背景网格线设置
plt.legend(['White noise 1', 'White noise 2'],edgecolor = 'none', facecolor = 'none',loc='upper center')#图列设置
plt.show()

关于为什么用ax.set()这样的形式,而不是plt.ylim()的形式:

plt.xlim() 和ax.set_xlim() 这两者功能是相似的,但他们的使用场景略有不同。

plt.xlim()适用于简单的图形(只有一个轴时),可以直接在全局范围内设置x轴的限制。

ax.set_xlim()适用于更复杂的图形(有多个子图时),这种更灵活。

在绘制双y轴时更容易理解为什么用ax.set

###############
import numpy as np
import matplotlib.pyplot as plt
import math
# 是使用 NumPy 库中的 linspace 函数创建一个包含20个元素的等差数列(线性空间),其范围在0到6之间。
x1 = np.linspace(0, 6, 20)
#使用 NumPy 库中的 linspace 函数创建一个等差数列,范围是从0到4π(4倍的π),并且包含60个元素
x2 = np.linspace(0,4*math.pi,60)
#使用numpy中的函数创建一个新的数组有y1,先计算的是 x1 数组中每个元素的指数值,然后从每个元素的指数值中减去5。
y1 = np.exp(x1)-5
y2 = np.sin(x2)*5

fig,ax1 = plt.subplots(figsize=(9,6))
ax1.plot(x1, y1,'b',linewidth = 1)
ax1.set_xlabel('X',color = 'b')
ax1.set_ylabel('Y1',color='b')
#Add the second y axis
ax2=ax1.twinx()#x轴是相同的
ax2.set_ylabel('Y1',color='r')
ax2.plot(x2, y2,'r:')
plt.show()

下面展示双x轴的线图 

###############
import numpy as np
import matplotlib.pyplot as plt
import math
#和双x轴图用的数据是一样的,不再解释 
x1 = np.linspace(0, 6, 20)
x2 = np.linspace(0,4*math.pi,60)
y1 = np.exp(x1)-5
y2 = np.sin(x2)*5

fig,ax1 = plt.subplots(figsize=(9,6))
ax1.plot(x1, y1,'b',linewidth = 1)
ax1.set_xlabel('X1',color = 'b')
ax1.set_ylabel('Y1',color='b')
#Add the second y axis
ax2=ax1.twiny()#相同的y轴
ax2.set_xlabel('X2',color='r')
ax2.plot(x2, y2,'r:')

plt.show()

 二、子图绘制

三种创建子图的方式:subplots(), subplot(), add_subplot()

首先创建了画图用的数据集。

###############
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mp

plt.close('all')
#plt.close('all') 会关闭所有的图形窗口,释放相关的资源。
#如果你只想关闭某个特定的图形窗口,可以使用 plt.close(fig_number),其中 fig_number 是要关闭的图形窗口的编号。
#如果没有指定参数,例如 plt.close(),它将关闭当前活动的图形窗口。
#这样的操作在需要清理图形窗口、释放资源或者确保下一次运行代码时开始一个新的图形时非常有用
font = {'family':'Times New Roman','weight':'normal', 'size'   : 10}
mp.rc('font', **font)
#创建用于画图的数据,前面也已经总结过
t = np.linspace(-5,5,300)
y1 = np.sin(t)+np.random.ranf(size = t.size)*0.2
y2 = np.sin(t ** 2)
n = 500
normal_2D_data =  np.random.normal(0, 2, (n, 2)) 
T = np.arctan2(normal_2D_data[:, 0],normal_2D_data[:, 1]) # for color value

先使用subplots()函数

#左右分布的两个子图,使用的是subplots()函数
#plot #1
fig, axs = plt.subplots(1, 2,figsize=(8,5))
axs[0].plot(t,y1)
axs[0].set_xlim(-6,6)
axs[0].set_ylim(-1,2)
axs[0].set_xlabel(r'$\mathit{x}_1$')#将子图 axs[0] 的 x 轴标签设置为 "$\mathit{x}_1$",这样标签文本将显示为意大利体,带有下标 1
axs[0].set_ylabel(r'$\mathit{y}_1$')
axs[0].set_title('Plot#1')
axs[0].set_yticks([-1.5,-1,0,1,1.5])
axs[1].scatter(normal_2D_data[:, 0], normal_2D_data[:, 1], s=10, c=T, edgecolors = 'none',alpha=.6, cmap='Set1')
#normal_2D_data[:, 0] 和 normal_2D_data[:, 1] 分别表示二维数据的第一列和第二列,即 x 和 y 坐标。
#s=10 指定散点的大小为10。
#c=T 指定散点的颜色,颜色由变量 T 控制。
#edgecolors='none' 表示散点之间没有边缘颜色。
#alpha=.6 设置散点的透明度为0.6。
#cmap='Set1' 指定颜色映射为 'Set1'。
axs[1].set_xlim(-7,7)
axs[1].set_ylim(-6,6)
axs[1].set_xlabel(r'$\mathit{x}_2$')
axs[1].set_ylabel(r'$\mathit{y}_2$')
axs[1].set_title('Plot#2')

 

 

#上下分布的两个子图,和上图相比两个图形的设置是相同的,不同的是这个例子用的subplot()函数。
#注意这里原书代码中有一个小错误,下面的展示中已经纠正
#plot #2
plt.figure(2,figsize=(8,6))
plt.subplot(211)#211代表绘制二行一列的第一个图
plt.xlim(-6,6)
plt.ylim(-1.5,1.5)
plt.xlabel(r'$\mathit{x}_1$')
plt.ylabel(r'$\mathit{y}_1$')
plt.title('Plot#1')
plt.plot(t,y1)
plt.show()

plt.subplot(212)#2行1列的第二个图
plt.scatter(normal_2D_data[:, 0], normal_2D_data[:, 1], s=10, c=T, edgecolors = 'none',alpha=.6, cmap='Set1')
plt.xlim(-7,7)
plt.ylim(-6,6)
plt.xlabel(r'$\mathit{x}_2$')
plt.ylabel(r'$\mathit{y}_2$')
plt.title('Plot#2')
plt.show()

 

 

三、三维图

例子来源于mat官网,在GPT的帮助下加了一些注释方便理解。

import matplotlib.pyplot as plt
import numpy as np

import matplotlib.transforms as mtransforms


def get_image():
    delta = 0.25 #定义步长,用于生成 x 和 y 的取值范围。
    x = y = np.arange(-3.0, 3.0, delta)#使用 np.arange 生成一维数组,表示 x 和 y 的取值范围。步长为 delta,范围在 -3.0 到 3.0 之间。
    X, Y = np.meshgrid(x, y)#使用 np.meshgrid 生成网格,其中 X 和 Y 是 x 和 y 的二维坐标矩阵
    Z1 = np.exp(-X**2 - Y**2)#定义第一个高斯分布,其中 np.exp 是指数函数,-X**2 - Y**2 是高斯分布的指数部分
    Z2 = np.exp(-(X - 1)**2 - (Y - 1)**2)#定义第二个稍微偏移的高斯分布,其中 (X - 1)**2 和 (Y - 1)**2 使得分布发生了平移
    Z = (Z1 - Z2)#将两个高斯分布叠加得到最终的图像数据 Z。
    return Z #返回生成的二维图像数据。这样的图像数据通常在可视化和图像处理中使用。


def do_plot(ax, Z, transform):
    im = ax.imshow(Z, interpolation='none',
                   origin='lower',
                   extent=[-2, 4, -3, 2], clip_on=True)
    #使用 imshow 方法在坐标轴 ax 上绘制图像。Z 是图像数据,interpolation='none' 表示不进行插值,origin='lower' 表示原点位于底部,extent=[-2, 4, -3, 2] 指定了图像数据的范围,clip_on=True 表示在数据范围之外的部分将被剪切。

    trans_data = transform + ax.transData #创建一个新的变换对象 trans_data,将输入的变换 (transform) 与 ax.transData(坐标轴的数据变换)相加。
    im.set_transform(trans_data)#将图像 im 的变换设置为新创建的 trans_data。

    # display intended extent of the image
    x1, x2, y1, y2 = im.get_extent()#获取图像的范围。
    ax.plot([x1, x2, x2, x1, x1], [y1, y1, y2, y2, y1], "y--",
            transform=trans_data)#在坐标轴 ax 上绘制图像的预期范围,用虚线 "y--" 表示。
    ax.set_xlim(-5, 5)
    ax.set_ylim(-4, 4)
#设置坐标轴的 x 和 y 范围,确保显示整个图形的范围。

# prepare image and figure
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2)#用 Matplotlib 的 subplots 函数创建一个包含 2 行和 2 列的图形,并返回一个包含四个子图对象的元组。每个子图对象分别对应于 ax1、ax2、ax3 和 ax4。
Z = get_image()#调用先前定义的 get_image 函数,生成一个二维的图像数据 Z。

# image rotation
do_plot(ax1, Z, mtransforms.Affine2D().rotate_deg(30))#创建了一个仿射变换对象,通过 rotate_deg(30) 方法实现了30度的逆时针旋转。
#这样,do_plot 函数将图像 Z 在 ax1 子图中绘制,并对图像进行了30度的逆时针旋转。这种变换在图像处理和可视化中经常用于展示数据在不同角度的观察。
# image skew
do_plot(ax2, Z, mtransforms.Affine2D().skew_deg(30, 15))#创建了一个仿射变换对象,通过 skew_deg(30, 15) 方法实现了30度的 x 轴方向的倾斜和15度的 y 轴方向的倾斜。
#do_plot 函数将图像 Z 在 ax2 子图中绘制,并对图像进行了30度 x 轴方向和15度 y 轴方向的倾斜。这种变换可以用于展示数据在不同方向上的形变。
# scale and reflection
do_plot(ax3, Z, mtransforms.Affine2D().scale(-1, .5))#创建了一个仿射变换对象,通过 scale(-1, .5) 方法实现了沿 x 轴方向的镜像翻转和沿 y 轴方向的缩放。
#do_plot 函数将图像 Z 在 ax3 子图中绘制,并对图像进行了沿 x 轴方向的镜像翻转和沿 y 轴方向的缩放。这种变换可以用于展示数据的镜像和缩放效果。
# everything and a translation
do_plot(ax4, Z, mtransforms.Affine2D().
        rotate_deg(30).skew_deg(30, 15).scale(-1, .5).translate(.5, -1))
#创建了一个复合的仿射变换对象,依次应用了旋转、倾斜、缩放和平移。
#rotate_deg(30):30度逆时针旋转。
#skew_deg(30, 15):30度 x 轴方向的倾斜和15度 y 轴方向的倾斜。
#scale(-1, .5):沿 x 轴方向的镜像翻转和沿 y 轴方向的缩放。
#translate(.5, -1):沿 x 轴方向平移0.5单位,沿 y 轴方向平移-1单位。
plt.show()

 

未完,先去做点其他事情。。。。 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值