NumPy Beginner's Guide 2e 带注释源码 九、使用 Matplotlib 绘图

本文涉及的产品
移动研发平台 EMAS,开发者版免费套餐
简介: 版权声明:License CC BY-NC-SA 4.0 https://blog.csdn.net/wizardforcel/article/details/73008658 # ...
版权声明:License CC BY-NC-SA 4.0 https://blog.csdn.net/wizardforcel/article/details/73008658
# 来源:NumPy Biginner's Guide 2e ch9

绘制多项式函数

import numpy as np
import matplotlib.pyplot as plt

# 创建函数 func = x ** 3 + 2 * x ** 2 + 3 * x + 4
# poly1d 根据系数数组创建函数,高项系数在前
func = np.poly1d(np.array([1, 2, 3, 4]).astype(float))
# x 值是 -10 ~ 10 取 30 个点
x = np.linspace(-10, 10, 30)
# 计算相应的 y 值
y = func(x)

# 绘制函数,plot 并不会立即显示
plt.plot(x, y)
# 设置两个轴的标签
plt.xlabel('x')
plt.ylabel('y(x)')
# 显示图像
plt.show()

绘制多项式函数及其导函数

import numpy as np
import matplotlib.pyplot as plt

# func = x ** 3 + 2 * x ** 2 + 3 * x + 4
# func1 是它的导数,func' = 3 * x ** 2 + 4 * x + 3
func = np.poly1d(np.array([1, 2, 3, 4]).astype(float))
func1 = func.deriv(m=1)
x = np.linspace(-10, 10, 30)
y = func(x)
y1 = func1(x)

# 将原函数绘制为红色的散点
# 导函数绘制为绿色的虚线
plt.plot(x, y, 'ro', x, y1, 'g--')
plt.xlabel('x')
plt.ylabel('y')
plt.show()
# 可以看到这里导函数的零点是原函数的驻点

分别绘制多项式函数及其导数

import numpy as np
import matplotlib.pyplot as plt

# func = x ** 3 + 2 * x ** 2 + 3 * x + 4
func = np.poly1d(np.array([1, 2, 3, 4]).astype(float))
x = np.linspace(-10, 10, 30)
y = func(x)
# func1 是它的导数,func' = 3 * x ** 2 + 4 * x + 3
func1 = func.deriv(m=1)
y1 = func1(x)
# func2 是二阶导数,func'' = 6 * x + 4
func2 = func.deriv(m=2)
y2 = func2(x)

# 三行一列的第一个位置
plt.subplot(311)
# 将原函数绘制为红色曲线
plt.plot(x, y, 'r-')
plt.title("Polynomial")

# 三行一列的第二个位置
plt.subplot(312)
# 将一阶导函数绘制为蓝色三角
plt.plot(x, y1, 'b^')
plt.title("First Derivative")

# 三行一列的第三个位置
plt.subplot(313)
# 将一阶导函数绘制为绿色散点
plt.plot(x, y2, 'go')
plt.title("Second Derivative")
plt.xlabel('x')
plt.ylabel('y')
plt.show()

K 线图

from matplotlib.dates import DateFormatter
from matplotlib.dates import DayLocator
from matplotlib.dates import MonthLocator
from matplotlib.finance import quotes_historical_yahoo
from matplotlib.finance import candlestick
import sys
from datetime import date
import matplotlib.pyplot as plt

today = date.today()
start = (today.year - 1, today.month, today.day)

alldays = DayLocator()              
months = MonthLocator()
month_formatter = DateFormatter("%b %Y")

symbol = 'DISH'

if len(sys.argv) == 2:
   symbol = sys.argv[1]

# 导入 DISH 一年的股票数据
quotes = quotes_historical_yahoo(symbol, start, today)

# 获取 Figure 和 Axes 实例
fig = plt.figure()
ax = fig.add_subplot(111)
# 设置 Locator 和 Formatter
ax.xaxis.set_major_locator(months)
ax.xaxis.set_minor_locator(alldays)
ax.xaxis.set_major_formatter(month_formatter)

# candlestick 用于绘制 K 线图
# ax 是 Axes 实例
# quotes 是股票数据,行是记录,列是属性
candlestick(ax, quotes)
fig.autofmt_xdate()
plt.show()

绘制收盘价分布图

from matplotlib.finance import quotes_historical_yahoo
import sys
from datetime import date
import matplotlib.pyplot as plt
import numpy as np

today = date.today()
start = (today.year - 1, today.month, today.day)

symbol = 'DISH'

if len(sys.argv) == 2:
   symbol = sys.argv[1]

# 导入 DISH 一年的股票数据
# 行为记录,列为属性
# 分别为日期、开盘价、最高价、最低价、收盘价、成交量
quotes = quotes_historical_yahoo(symbol, start, today)
# 获取收盘价
quotes = np.array(quotes)
close = quotes.T[4]

# 绘制直方图,横轴是数据分布,纵轴是频数
# 第一个参数是数据,第二个参数是分组数量,默认为 10
plt.hist(close, np.sqrt(len(close)))
plt.show()

绘制对数刻度

from matplotlib.finance import quotes_historical_yahoo
from matplotlib.dates import DateFormatter
from matplotlib.dates import DayLocator
from matplotlib.dates import MonthLocator
import sys
from datetime import date
import matplotlib.pyplot as plt
import numpy as np

today = date.today()
start = (today.year - 1, today.month, today.day)

symbol = 'DISH'

if len(sys.argv) == 2:
   symbol = sys.argv[1]

# 获取 DASH 一年的日期和成交量
quotes = quotes_historical_yahoo(symbol, start, today)
quotes = np.array(quotes)
dates = quotes.T[0]
volume = quotes.T[5]


alldays = DayLocator()              
months = MonthLocator()
month_formatter = DateFormatter("%b %Y")

fig = plt.figure()
ax = fig.add_subplot(111)
# semilogy 将 y 轴绘制为对数刻度
# 也就是绘制 date 与 log10(volume) 的图像
# 但是刻度标签是 volume,也就是 10 ** 1, 10 ** 2, ....
plt.semilogy(dates, volume)
ax.xaxis.set_major_locator(months)
ax.xaxis.set_minor_locator(alldays)
ax.xaxis.set_major_formatter(month_formatter)
fig.autofmt_xdate()
plt.show

绘制收益和成交量差值的散点图

from matplotlib.finance import quotes_historical_yahoo
import sys
from datetime import date
import matplotlib.pyplot as plt
import numpy as np

today = date.today()
start = (today.year - 1, today.month, today.day)

symbol = 'DISH'

if len(sys.argv) == 2:
   symbol = sys.argv[1]

# 获取 DISH 一年的收盘价和成交量
quotes = quotes_historical_yahoo(symbol, start, today)
quotes = np.array(quotes)
close = quotes.T[4]
volume = quotes.T[5]
# 计算收益和成交量差值
ret = np.diff(close)/close[:-1]
volchange = np.diff(volume)/volume[:-1]

fig = plt.figure()
ax = fig.add_subplot(111)
# 绘制散点图,参数分别为横轴、纵轴、颜色、大小、透明度
# 横轴为收益,纵轴为成交量差值
# 颜色随收益变化,大小随成交量变化
ax.scatter(ret, volchange, c=ret * 100, s=volchange * 100, alpha=0.5)
ax.set_title('Close and volume returns')
ax.grid(True)

plt.show()

基于条件填充区域

from matplotlib.finance import quotes_historical_yahoo
from matplotlib.dates import DateFormatter 
from matplotlib.dates import DayLocator 
from matplotlib.dates import MonthLocator
import sys
from datetime import date
import matplotlib.pyplot as plt
import numpy as np

today = date.today()
start = (today.year - 1, today.month, today.day)

symbol = 'DISH'

if len(sys.argv) == 2:
   symbol = sys.argv[1]

quotes = quotes_historical_yahoo(symbol, start, today)
quotes = np.array(quotes)
dates = quotes.T[0]
close = quotes.T[4]


alldays = DayLocator()              
months = MonthLocator()
month_formatter = DateFormatter("%b %Y")

fig = plt.figure()
ax = fig.add_subplot(111)
# 绘制收盘价
ax.plot(dates, close)
# fill_between 用于填充区域
# 参数依次为 x 值,y 值下界,y 值上界,
# 需要填充的位置(布尔索引),填充色,不透明度
# 如果收盘价高于均值,将收盘价和最小值之间填充为绿色
plt.fill_between(dates, close.min(), close, where=close>close.mean(), facecolor="green", alpha=0.4)
# 如果收盘价低于均值,将收盘价和最小值之间填充为红色
plt.fill_between(dates, close.min(), close, where=close<close.mean(), facecolor="red", alpha=0.4)
ax.xaxis.set_major_locator(months)
ax.xaxis.set_minor_locator(alldays)
ax.xaxis.set_major_formatter(month_formatter)
ax.grid(True)
fig.autofmt_xdate()
plt.show()

使用图例和标注

from matplotlib.finance import quotes_historical_yahoo
from matplotlib.dates import DateFormatter
from matplotlib.dates import DayLocator
from matplotlib.dates import MonthLocator
import sys
from datetime import date
import matplotlib.pyplot as plt
import numpy as np

today = date.today()
start = (today.year - 1, today.month, today.day)

symbol = 'DISH'

if len(sys.argv) == 2:
   symbol = sys.argv[1]

# 读取 DISH 的日期和收盘价
quotes = quotes_historical_yahoo(symbol, start, today)
quotes = np.array(quotes)
dates = quotes.T[0]
close = quotes.T[4]

# 获取 Figure 和 Axes 对象
fig = plt.figure()
ax = fig.add_subplot(111)

emas = []

# 计算窗口为 9、12、15 的指数滑动平均
for i in range(9, 18, 3):
   # 计算权重
   weights = np.exp(np.linspace(-1., 0., i))
   weights /= weights.sum()

   # 计算滑动平均
   ema = np.convolve(weights, close)[i-1:-i+1]
   idx = (i - 6)/3
   # 绘制滑动平均
   # 我们使用 label 关键字参数来添加标签
   ax.plot(dates[i-1:], ema, lw=idx, label="EMA(%s)" % (i))
   data = np.column_stack((dates[i-1:], ema))
   emas.append(np.rec.fromrecords(data, names=["dates", "ema"]))   

# 寻找前两个滑动平均的交点
first = emas[0]["ema"].flatten()
second = emas[1]["ema"].flatten()
bools = np.abs(first[-len(second):] - second)/second < 0.0001
xpoints = np.compress(bools, emas[1])

# 使用箭头来标注
for xpoint in xpoints:
   # annotate 函数用于标注
   # 第一个参数:标注文本
   # xy:被标注位置(箭头指向的点)
   # xytext:文本位置(箭头起始的点)
   # xycoords:xy 的坐标类型
   # textcoords:xytext 的坐标类型
   # arrowprops:箭头样式
   ax.annotate('x', xy=xpoint, textcoords='offset points',
                xytext=(-50, 30),
                arrowprops=dict(arrowstyle="->"))
   
# 设置图例,loc='best' 让 Matplotlib 决定放在哪里
leg = ax.legend(loc='best', fancybox=True)
# 设置不透明度为 0.5
leg.get_frame().set_alpha(0.5)

# 设置日期 Locator 和 Formatter
alldays = DayLocator()              
months = MonthLocator()
month_formatter = DateFormatter("%b %Y")
# 绘制原始收盘价
ax.plot(dates, close, lw=1.0, label="Close")
ax.xaxis.set_major_locator(months)
ax.xaxis.set_minor_locator(alldays)
ax.xaxis.set_major_formatter(month_formatter)
ax.grid(True)
fig.autofmt_xdate()
plt.show()

三维绘图

# 绘制 z = x ** 2 + y ** 2
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import cm

# 获取 Figure 实例
fig = plt.figure()
# 获取 Axes 实例,projection='3d' 表示三维绘图
ax = fig.add_subplot(111, projection='3d')

u = np.linspace(-1, 1, 100)

# x 和 y 从 -1 到 1 取 100 个点
# meshgrid 创建二维的网格,包含每一组 x, y
x, y = np.meshgrid(u, u)
z = x ** 2 + y ** 2
# plot_surface 用于绘制曲面
# rstride 和 cstride 是行和列步长
# 从输入数组中每四个点取一个点
# cmap 是颜色映射表
ax.plot_surface(x, y, z,  rstride=4, cstride=4, cmap=cm.YlGnBu_r)

plt.show()

热力图

# 绘制 z = x ** 2 + y ** 2 的热力图
# 热力图的横轴是 x,纵轴是 y,颜色是 z
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import cm

fig = plt.figure()
ax = fig.add_subplot(111)

u = np.linspace(-1, 1, 100)

x, y = np.meshgrid(u, u)
z = x ** 2 + y ** 2
# contourf 用于绘制热力图
ax.contourf(x, y, z)

plt.show()

绘制动画

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation

fig = plt.figure()
ax = fig.add_subplot(111)
# x, y, z 都是 10 个 0 ~ 1 的随机值
N = 10
x = np.random.rand(N)
y = np.random.rand(N)
z = np.random.rand(N)
# 绘制 x, y, z,并获取 Axes 实例
circles, triangles, dots = ax.plot(x, 'ro', y, 'g^', z, 'b.')
ax.set_ylim(0, 1)
# 去掉坐标轴
plt.axis('off')

# 动画需要有帧函数,定期执行
# 这个函数将 data 的第一行作为圆圈的 y 值
# 第二行作为三角的 y 值
def update(data):
    circles.set_ydata(data[0])
    triangles.set_ydata(data[1])
    return circles, triangles

# 动画需要一个数据序列(可迭代对象)
# 这是一个长度无限的生成器,每次迭代都返回 2xN 的随机值数组
def generate():
    while True: yield np.random.rand(2, N)

# FuncAnimation 用于绘制对象
# 参数一次是 Figure 实例,帧函数,数据序列,以及刷新间隔
# 每次刷新时,都会用数据序列的当前值调用帧函数
anim = animation.FuncAnimation(fig, update, generate, interval=150)
plt.show()

相关文章
|
17天前
|
数据采集 数据可视化 数据处理
如何使用Python实现一个交易策略。主要步骤包括:导入所需库(如`pandas`、`numpy`、`matplotlib`)
本文介绍了如何使用Python实现一个交易策略。主要步骤包括:导入所需库(如`pandas`、`numpy`、`matplotlib`),加载历史数据,计算均线和其他技术指标,实现交易逻辑,记录和可视化交易结果。示例代码展示了如何根据均线交叉和价格条件进行开仓、止损和止盈操作。实际应用时需注意数据质量、交易成本和风险管理。
37 5
|
2月前
|
Python
Matplotlib 教程 之 Matplotlib 绘图标记 9
在本教程中,我们将探讨如何使用 Matplotlib 的 `plot()` 方法中的 `marker` 参数来自定义图表标记。您可以选择不同的线类型(如实线 `&#39;-&#39;`、虚线 `&#39;:&#39;` 等),以及颜色类型(如红色 `&#39;r&#39;`、绿色 `&#39;g&#39;` 等)。同时,通过调整 `markersize (ms)`、`markerfacecolor (mfc)` 和 `markeredgecolor (mec)` 参数,可以定制标记的大小和颜色。
31 1
|
2月前
|
数据可视化 Python
NumPy 教程 之 NumPy Matplotlib 7
使用Python的绘图库Matplotlib与NumPy结合进行数据可视化,提供Matplotlib作为MatLab开源替代方案的有效方法,以及如何利用plt()函数将数据转换成直观的直方图示例。
38 11
|
2月前
|
Python
NumPy 教程 之 NumPy Matplotlib 6
Matplotlib 是一个强大的 Python 绘图库,能与 NumPy 协同工作,提供类似 MatLab 的开源替代方案,并支持 PyQt 和 wxPython 等图形工具包。通过 `numpy.histogram()` 函数示例,展示了如何创建数据频率分布图,该函数接受输入数组和 bin 参数,生成对应频率的直方图。示例代码及输出清晰展示了 bin 的边界与对应频率的关系。
32 11
|
2月前
|
Python
NumPy 教程 之 NumPy Matplotlib 4
使用 Python 的绘图库 Matplotlib,结合 NumPy,生成各种图形,作为 MatLab 的开源替代方案。您将学习到如何用 matplotlib 和 NumPy 包来创建正弦波图形,以及如何在同一图中利用 subplot() 函数组织和展示不同的子图,例如同时绘制正弦和余弦曲线。通过实际代码示例,加深对这些功能的理解。
41 12
|
2月前
|
Python
NumPy 教程 之 NumPy Matplotlib 3
使用Python的绘图库Matplotlib与NumPy结合,创建有效的MatLab开源替代方案。它还支持与PyQt和wxPython等图形工具包搭配使用。通过向`plot()`函数添加特定格式字符串,可以展示离散值而非线性图。提供了多种线型和标记选项,例如实线`-`、虚线`--`、点标记`.`等,以及颜色缩写如蓝色`b`、绿色`g`等。示例代码展示了如何用圆点表示数据点而非线条。
38 10
|
2月前
|
Python
Matplotlib 教程 之 Matplotlib 绘图标记 3
这段Matplotlib教程展示了如何通过`plot()`方法的`marker`参数来自定义图表标记,为数据点添加独特的视觉风格。例如,通过设置`marker = &#39;*&#39;`,可以使每个数据点显示为星形标记。这在需要对坐标轴进行特殊标注时尤为有用。下面的示例代码生成了一个带有星形标记的简单折线图。
32 1
|
2月前
|
Python
NumPy 教程 之 NumPy Matplotlib 5
Matplotlib 是 Python 的绘图库,配合 NumPy 可作为 MatLab 的开源替代方案,并能与 PyQt 和 wxPython 等图形工具包共同使用。本教程重点讲解 `bar()` 函数用于生成条形图的方法,并通过实例展示了如何创建并显示两组数据的条形图。
33 7
|
2月前
|
Python
NumPy 教程 之 NumPy Matplotlib 2
Matplotlib 是 Python 的绘图库,能与 NumPy 结合使用,提供 MatLab 的开源替代方案,并支持 PyQt 和 wxPython 等图形工具包。由于 Matplotlib 默认不支持中文,可以使用思源黑体等字体或系统自带的中文字体(如仿宋)解决这一问题,通过指定字体路径或设置 `plt.rcParams[&#39;font.family&#39;]` 来实现中文显示。
23 1
|
2月前
|
存储 Ubuntu 数据可视化
NumPy 教程 之 NumPy Matplotlib 1
Matplotlib作为Python的绘图库,能够与NumPy结合使用,提供了类似MatLab的开源替代方案,并支持与PyQt和wxPython等图形工具包一同使用。本教程将指导你如何在不同系统环境下安装matplotlib,并通过实例演示如何利用它进行数据可视化,包括创建坐标轴标签、绘制线性图表并展示结果。
23 1