首页 > 编程开发 > python数据分析 >
-
Matplotlib绘图核心逻辑:画布、坐标轴、图层
第6章 股票数据可视化进阶
6.1 Matplotlib绘图核心逻辑:画布、坐标轴、图层
6.1.1 先吐槽个真实经历:我用Matplotlib画了3天的图
我刚开始用Matplotlib画图时,总觉得它的逻辑很混乱,画一个简单的K线vb.net教程C#教程python教程SQL教程access 2010教程图花了3天时间。后来才明白,Matplotlib的核心逻辑是画布-坐标轴-图层,只要掌握了这个逻辑,画图就会变得很简单。今天我就把这个核心逻辑讲清楚,帮你快速上手Matplotlib画图。
6.1.2 核心逻辑拆解:画布、坐标轴、图层
Matplotlib的绘图逻辑就像画画一样:
1.画布(Figure):相当于一张白纸,所有的图形都画在这张白纸上
2.坐标轴(Axes):相当于白纸上的一个画框,一个画布可以有多个画框
3.图层(Artist):相当于画框里的内容,比如线条、文字、图片等,图层可以叠加
6.1.3 实战1:创建画布和坐标轴
python
# 1. 导入Matplotlib库
import matplotlib.pyplot as plt
# 2. 创建画布
fig = plt.figure(
figsize=(16, 9), # 画布大小,单位是英寸,16:9是常用的比例
dpi=100, # 分辨率,每英寸的像素数,dpi越高图片越清晰
facecolor='#f0f0f0', # 画布背景颜色,#f0f0f0是浅灰色
edgecolor='#333333', # 画布边框颜色,#333333是深灰色
linewidth=2 # 画布边框宽度
)
# 3. 创建坐标轴
ax = fig.add_subplot(
1, 1, 1, # 1行1列的第1个坐标轴,参数是(nrows, ncols, index)
facecolor='#ffffff', # 坐标轴背景颜色,#ffffff是白色
edgecolor='#333333', # 坐标轴边框颜色
linewidth=1 # 坐标轴边框宽度
)
# 4. 显示画布
plt.show()
逐行讲解:
plt.figure():创建画布,返回一个Figure对象
figsize=(16, 9):设置画布大小为16英寸宽,9英寸高,16:9是常用的比例,适合电脑屏幕
dpi=100:设置分辨率为100dpi,dpi越高图片越清晰,但文件也越大
facecolor='#f0f0f0':设置画布背景颜色为浅灰色,#f0f0f0是十六进制颜色代码
edgecolor='#333333':设置画布边框颜色为深灰色
linewidth=2:设置画布边框宽度为2像素
fig.add_subplot(1, 1, 1):在画布上创建一个坐标轴,1, 1, 1表示1行1列的第1个坐标轴
facecolor='#ffffff':设置坐标轴背景颜色为白色
edgecolor='#333333':设置坐标轴边框颜色为深灰色
linewidth=1:设置坐标轴边框宽度为1像素
plt.show():显示画布,会弹出一个窗口,显示创建的画布和坐标轴
运行结果:
会弹出一个窗口,显示一个浅灰色背景、深灰色边框的画布,里面有一个白色背景、深灰色边框的坐标轴。
6.1.4 实战2:在坐标轴上绘制图层
-
绘制折线图
python
# 1. 导入Matplotlib库和NumPy库
import matplotlib.pyplot as plt
import numpy as np
# 2. 创建画布和坐标轴
fig, ax = plt.subplots(
figsize=(16, 9), # 画布大小
dpi=100, # 分辨率
facecolor='#f0f0f0', # 画布背景颜色
edgecolor='#333333', # 画布边框颜色
linewidth=2 # 画布边框宽度
)
# 3. 生成数据
x = np.linspace(0, 10, 100) # 生成0到10的100个均匀分布的数
y1 = np.sin(x) # 正弦函数
y2 = np.cos(x) # 余弦函数
# 4. 绘制折线图(图层1:正弦曲线)
line1, = ax.plot(
x, y1, # X轴和Y轴数据
label='sin(x)', # 图例名称
color='#1f77b4', # 线条颜色,#1f77b4是蓝色
linestyle='-', # 线条样式,'-'是实线,'--'是虚线,':'是点线,'-.'是点划线
linewidth=2, # 线条宽度
marker='o', # 标记样式,'o'是圆形,'s'是正方形,'^'是三角形
markersize=5, # 标记大小
markerfacecolor='#ff7f0e', # 标记填充颜色,#ff7f0e是橙色
markeredgecolor='#333333', # 标记边框颜色
markeredgewidth=1 # 标记边框宽度
)
# 5. 绘制折线图(图层2:余弦曲线)
line2, = ax.plot(
x, y2,
label='cos(x)',
color='#2ca02c',
linestyle='--',
linewidth=2,
marker='s',
markersize=5,
markerfacecolor='#d62728',
markeredgecolor='#333333',
markeredgewidth=1
)
# 6. 设置坐标轴属性
ax.set_title(
'正弦函数和余弦函数的折线图', # 标题
fontsize=16, # 字体大小
fontweight='bold', # 字体粗细,'bold'是粗体
color='#333333', # 字体颜色
pad=20 # 标题与坐标轴的距离
)
ax.set_xlabel(
'X轴', # X轴标签
fontsize=14,
color='#333333',
labelpad=15 # 标签与坐标轴的距离
)
ax.set_ylabel(
'Y轴', # Y轴标签
fontsize=14,
color='#333333',
labelpad=15
)
ax.set_xlim(0, 10) # 设置X轴范围
ax.set_ylim(-1.2, 1.2) # 设置Y轴范围
ax.set_xticks(np.arange(0, 11, 1)) # 设置X轴刻度
ax.set_yticks(np.arange(-1.2, 1.3, 0.2)) # 设置Y轴刻度
ax.grid(
True, # 显示网格
linestyle='--', # 网格线条样式
alpha=0.7, # 网格透明度,0是完全透明,1是完全不透明
color='#cccccc' # 网格颜色
)
ax.legend(
handles=[line1, line2], # 要显示的图例
labels=['正弦函数', '余弦函数'], # 图例名称
loc='upper right', # 图例位置,'upper right'是右上角,'lower left'是左下角
fontsize=12,
frameon=True, # 显示图例边框
framealpha=0.8, # 图例边框透明度
facecolor='#ffffff', # 图例背景颜色
edgecolor='#333333' # 图例边框颜色
)
# 7. 保存图片
plt.savefig(
'正弦函数和余弦函数的折线图.png', # 保存的文件名
dpi=300, # 保存的分辨率
bbox_inches='tight' # 保存时裁剪空白区域
)
# 8. 显示画布
plt.show()
逐行讲解:
plt.subplots():同时创建画布和坐标轴,返回一个元组(fig, ax)
np.linspace(0, 10, 100):生成0到10的100个均匀分布的数
ax.plot():绘制折线图,返回一个Line2D对象
label:图例名称,会在图例中显示
color:线条颜色,可以用十六进制颜色代码、颜色名称(如'red')或RGB值(如(0.1, 0.7, 0.3))
linestyle:线条样式,'-'是实线,'--'是虚线,':'是点线,'-.'是点划线
linewidth:线条宽度
marker:标记样式,'o'是圆形,'s'是正方形,'^'是三角形,'*'是星形等
markersize:标记大小
markerfacecolor:标记填充颜色
markeredgecolor:标记边框颜色
markeredgewidth:标记边框宽度
ax.set_title():设置坐标轴标题
fontsize:字体大小
fontweight:字体粗细,'bold'是粗体,'normal'是正常
color:字体颜色
pad:标题与坐标轴的距离
ax.set_xlabel()和ax.set_ylabel():设置X轴和Y轴标签
ax.set_xlim()和ax.set_ylim():设置X轴和Y轴的范围
ax.set_xticks()和ax.set_yticks():设置X轴和Y轴的刻度
ax.grid():显示网格
linestyle:网格线条样式
alpha:网格透明度
color:网格颜色
ax.legend():添加图例
handles:要显示的图例对象,比如Line2D对象
labels:图例名称
loc:图例位置,'upper right'是右上角,'lower left'是左下角,'center'是中心等
plt.savefig():保存图片到本地
dpi:保存的分辨率,dpi越高图片越清晰
bbox_inches='tight':保存时裁剪空白区域,使图片更紧凑
运行结果:
会弹出一个窗口,显示正弦函数和余弦函数的折线图,同时会把图片保存到当前目录下。
2. 绘制柱状图
python
# 1. 导入Matplotlib库和NumPy库
import matplotlib.pyplot as plt
import numpy as np
# 2. 创建画布和坐标轴
fig, ax = plt.subplots(figsize=(16, 9), dpi=100)
# 3. 生成数据
x = np.arange(5) # X轴数据,0到4
y1 = np.random.randint(10, 50, 5) # 第一个柱状图数据
y2 = np.random.randint(10, 50, 5) # 第二个柱状图数据
# 4. 绘制柱状图
width = 0.35 # 柱状图的宽度
rects1 = ax.bar(
x - width/2, # 第一个柱状图的X轴位置
y1, # 第一个柱状图的Y轴数据
width, # 柱状图的宽度
label='柱状图1',
color='#1f77b4',
alpha=0.8, # 透明度
edgecolor='#333333',
linewidth=1
)
rects2 = ax.bar(
x + width/2, # 第二个柱状图的X轴位置
y2,
width,
label='柱状图2',
color='#ff7f0e',
alpha=0.8,
edgecolor='#333333',
linewidth=1
)
# 5. 在柱状图上添加数值标签
def autolabel(rects):
for rect in rects:
height = rect.get_height()
ax.annotate(
f'{height}', # 要显示的数值
xy=(rect.get_x() + rect.get_width()/2, height), # 数值的位置
xytext=(0, 3), # 数值与柱状图的距离
textcoords='offset points',
ha='center', # 水平对齐方式,'center'是居中
va='bottom', # 垂直对齐方式,'bottom'是底部
fontsize=12,
color='#333333'
)
autolabel(rects1)
autolabel(rects2)
# 6. 设置坐标轴属性
ax.set_title('两个柱状图的对比', fontsize=16, fontweight='bold')
ax.set_xlabel('X轴', fontsize=14)
ax.set_ylabel('Y轴', fontsize=14)
ax.set_xticks(x)
ax.set_xticklabels(['类别1', '类别2', '类别3', '类别4', '类别5'], fontsize=12)
ax.legend(fontsize=12)
# 7. 显示画布
plt.show()
逐行讲解:
ax.bar():绘制柱状图,返回一个BarContainer对象
x - width/2:第一个柱状图的X轴位置,x + width/2是第二个柱状图的X轴位置,这样两个柱状图会并排显示
width:柱状图的宽度
alpha:透明度,0是完全透明,1是完全不透明
ax.annotate():在图形上添加注释
xy:注释的位置,(rect.get_x() + rect.get_width()/2, height)表示柱状图顶部的中心位置
xytext:注释与位置的偏移量,(0, 3)表示向上偏移3个点
textcoords='offset points':偏移量的单位是点
ha='center':水平对齐方式为居中
va='bottom':垂直对齐方式为底部
运行结果:
会弹出一个窗口,显示两个并排的柱状图,每个柱状图顶部都有数值标签。
6.1.5 基础知识拓展:图层的顺序
Matplotlib的图层是按照绘制顺序叠加的,先绘制的图层在下面,后绘制的图层在上面。如果需要调整图层的顺序,可以用ax.set_zorder()方法。
实战代码:调整图层顺序
python
# 1. 创建画布和坐标轴
fig, ax = plt.subplots(figsize=(16, 9), dpi=100)
# 2. 绘制第一个图层(蓝色矩形)
rect1 = ax.add_patch(
plt.Rectangle(
(0.2, 0.2), # 左下角坐标
0.6, 0.6, # 宽度和高度
color='#1f77b4',
alpha=0.8
)
)
# 3. 绘制第二个图层(橙色圆形)
circle1 = ax.add_patch(
plt.Circle(
(0.5, 0.5), # 中心坐标
0.3, # 半径
color='#ff7f0e',
alpha=0.8
)
)
# 4. 调整图层顺序,把矩形放在上面
rect1.set_zorder(2)
circle1.set_zorder(1)
# 5. 设置坐标轴属性
ax.set_xlim(0, 1)
ax.set_ylim(0, 1)
ax.set_title('图层顺序调整', fontsize=16, fontweight='bold')
ax.set_aspect('equal') # 设置坐标轴的比例为1:1,使圆形看起来是圆形
# 6. 显示画布
plt.show()
逐行讲解:
ax.add_patch():添加一个图形对象,比如矩形、圆形等
plt.Rectangle((0.2, 0.2), 0.6, 0.6):创建一个矩形,左下角坐标是(0.2, 0.2),宽度是0.6,高度是0.6
plt.Circle((0.5, 0.5), 0.3):创建一个圆形,中心坐标是(0.5, 0.5),半径是0.3
rect1.set_zorder(2):设置矩形的图层顺序为2,数值越大图层越靠上
circle1.set_zorder(1):设置圆形的图层顺序为1
ax.set_aspect('equal'):设置坐标轴的比例为1:1,使圆形看起来是圆形,否则会因为坐标轴比例不同而变成椭圆形
运行结果:
会弹出一个窗口,显示一个蓝色矩形在橙色圆形的上面,因为矩形的图层顺序更高。
6.1.6 总结:Matplotlib绘图的核心流程
1.创建画布:用plt.figure()或plt.subplots()创建画布
2.创建坐标轴:用fig.add_subplot()或plt.subplots()创建坐标轴
3.绘制图层:用ax.plot()、ax.bar()、ax.scatter()等方法绘制图层
4.设置属性:用ax.set_title()、ax.set_xlabel()、ax.legend()等方法设置坐标轴和图层的属性
5.显示或保存图片:用plt.show()显示图片,用plt.savefig()保存图片
通过这个实战,你应该已经掌握了Matplotlib绘图的核心逻辑,接下来可以尝试用这个逻辑绘制股票的K线图、均线图、成交量图等。
下一节咱们就讲如何用Matplotlib绘制股票的K线图和成交量图,帮你更直观地分析股票走势。
本站原创,转载请注明出处:https://www.xin3721.com/ArticlePrograme/csharp49702.html










