VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > 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:在坐标轴上绘制图层

  1. 绘制折线图
    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


相关教程