创建自定义股票价格图表

PythonPythonBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,你将学习如何使用 Matplotlib 创建一个多个时间序列的图表,展示绘图框架、刻度线、刻度标签和折线图属性的自定义样式。该图表将显示 32 年间各公司的股票价格。

虚拟机提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,请随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。

导入必要的库

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.cbook import get_sample_data
import matplotlib.transforms as mtransforms

加载股票数据

with get_sample_data('Stocks.csv') as file:
    stock_data = np.genfromtxt(
        file, delimiter=',', names=True, dtype=None,
        converters={0: lambda x: np.datetime64(x, 'D')}, skip_header=1)

创建一个图形和轴对象

fig, ax = plt.subplots(1, 1, figsize=(6, 8), layout='constrained')

定义绘图中要使用的颜色

ax.set_prop_cycle(color=[
    '#1f77b4', '#aec7e8', '#ff7f0e', '#ffbb78', '#2ca02c', '#98df8a',
    '#d62728', '#ff9896', '#9467bd', '#c5b0d5', '#8c564b', '#c49c94',
    '#e377c2', '#f7b6d2', '#7f7f7f', '#c7c7c7', '#bcbd22', '#dbdb8d',
    '#17becf', '#9edae5'])

设置要绘制的股票名称和股票代码

stocks_name = ['IBM', 'Apple', 'Microsoft', 'Xerox', 'Amazon', 'Dell',
               'Alphabet', 'Adobe', 'S&P 500', 'NASDAQ']
stocks_ticker = ['IBM', 'AAPL', 'MSFT', 'XRX', 'AMZN', 'DELL', 'GOOGL',
                 'ADBE', 'GSPC', 'IXIC']

手动垂直调整标签位置以避免重叠

y_offsets = {k: 0 for k in stocks_ticker}
y_offsets['IBM'] = 5
y_offsets['AAPL'] = -5
y_offsets['AMZN'] = -6

用各自的颜色分别绘制每只股票

for nn, column in enumerate(stocks_ticker):
    ## 用各自的颜色分别绘制每条线。
    ## 不包括任何包含 NaN 的数据。
    good = np.nonzero(np.isfinite(stock_data[column]))
    line, = ax.plot(stock_data['Date'][good], stock_data[column][good], lw=2.5)

    ## 在每条线的右端添加一个文本标签。下面的大部分代码
    ## 是在添加特定的 y 轴位置偏移量,因为有些标签会重叠。
    y_pos = stock_data[column][-1]

    ## 对于任何需要上下微调的文本,使用以点为单位的偏移变换。
    offset = y_offsets[column] / 72
    trans = mtransforms.ScaledTranslation(0, offset, fig.dpi_scale_trans)
    trans = ax.transData + trans

    ## 同样,确保所有标签都足够大,以便查看者能够轻松阅读。
    ax.text(np.datetime64('2022-10-01'), y_pos, stocks_name[nn],
            color=line.get_color(), transform=trans)

设置 x 轴和 y 轴的范围,并添加标题和网格

ax.set_xlim(np.datetime64('1989-06-01'), np.datetime64('2023-01-01'))
fig.suptitle("Technology company stocks prices dollars (1990-2022)", ha="center")
ax.spines[:].set_visible(False)
ax.xaxis.tick_bottom()
ax.yaxis.tick_left()
ax.set_yscale('log')
ax.grid(True,'major', 'both', ls='--', lw=.5, c='k', alpha=.3)
ax.tick_params(axis='both', which='both', labelsize='large',
               bottom=False, top=False, labelbottom=True,
               left=False, right=False, labelleft=True)

显示图表

plt.show()

总结

在本实验中,你学习了如何创建一个多个时间序列的图表,该图表展示了如何使用 Matplotlib 对绘图框架、刻度线、刻度标签和折线图属性进行自定义样式设置。你还学习了如何用各自的颜色分别绘制每只股票,设置 x 轴和 y 轴的范围,以及添加标题和网格。