matplotlib中关于画布的相关知识总结

本文详细介绍了在Python的Matplotlib库中如何创建和管理多个子图,包括figure()函数、subplot()、subplots()以及add_subplot()和add_axes()方法的使用。通过实例代码展示了如何自定义画布并绘制不同类型的图表,如折线图和柱状图,帮助读者更好地理解和应用这些功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【前言】:
1、在上一篇文章中,我们讲述了如果画一些简单的图表,比如:柱状图、条形图、饼图等等。
2、这篇文章就来一些干货,总结一下关于画布的相关知识,以及如何创建多个子图。

fihure() 函数

在这里插入图片描述
在这里插入图片描述

生成一个画布--代码实现


import matplotlib.pyplot as plt
import  pandas as pd


Data_fram=pd.read_excel('E:\pythonProject\matplotlib各种图表\line_chart_bar.xlsx')
print(Data_fram.head())

plt.rcParams['font.sans-serif'] = ['KaiTi']  # 指定默认字体,解决中文不显示的问题
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题

# 生成一个画布
canvas=plt.figure()
# 生成一个两行两列的图,可以用逗号隔开,也可以写在一起。
#参数含义为:2行2列的第一个图,2行2列的第二个图,2行2列的第三个图,2行2列的第四个图
map1=canvas.add_subplot(2,2,1)
map2=canvas.add_subplot(222)
map3=canvas.add_subplot(223)
# 在map3 下面使用plt.plot() 就意味着该图会在map3中生成。
plt.plot(Data_fram['水果'],Data_fram['销售百分比'],color='red',marker='*',ms=10)
map4=canvas.add_subplot(224)
plt.bar(Data_fram['水果'],Data_fram['销售量'],color='orange')

plt.show()

效果展示

在这里插入图片描述

subplot创建单个子图

在这里插入图片描述

生成单个子图--代码实现


import matplotlib.pyplot as plt
import  pandas as pd


Data_fram=pd.read_excel('E:\pythonProject\matplotlib各种图表\line_chart_bar.xlsx')
print(Data_fram.head())

plt.rcParams['font.sans-serif'] = ['KaiTi']  # 指定默认字体,解决中文不显示的问题
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题

# 生成一个画布
canvas=plt.figure()
# subplot创建单个子图
plt.subplot(221)
plt.subplot(222)
plt.plot(Data_fram['水果'],Data_fram['销售百分比'],color='red',marker='*',ms=10)
plt.subplot(223)
plt.bar(Data_fram['水果'],Data_fram['销售量'],color='blue')
plt.show()

效果展示
在这里插入图片描述

subplots创建多个子图

与上面的subplots就多了一个s
生成单多个子图--代码实现


import matplotlib.pyplot as plt
import  pandas as pd


Data_fram=pd.read_excel('E:\pythonProject\matplotlib各种图表\line_chart_bar.xlsx')
print(Data_fram.head())

plt.rcParams['font.sans-serif'] = ['KaiTi']  # 指定默认字体,解决中文不显示的问题
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题

# subplots创建多个子图,生成一个画布,和图
canvas,map=plt.subplots(2,2)
map1=map[0,0]
map2=map[0,1]
map3=map[1,0]
map4=map[1,1]

# 在对应的区域开始画图
map3.plot(Data_fram['水果'],Data_fram['销售百分比'],color='red',marker='*',ms=10)
map4.bar(Data_fram['水果'],Data_fram['销售量'],color='blue')
plt.show()

效果展示

在这里插入图片描述

add_subplots与add_axes新增子图或区域

add_subplots

add_subplots--代码实现


import matplotlib.pyplot as plt
import  pandas as pd


Data_fram=pd.read_excel('E:\pythonProject\matplotlib各种图表\line_chart_bar.xlsx')
print(Data_fram.head())

plt.rcParams['font.sans-serif'] = ['KaiTi']  # 指定默认字体,解决中文不显示的问题
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题

# (1) add_subplot新增子图
canvas=plt.figure()
map1=canvas.add_subplot(221)
map1.plot(Data_fram['水果'],Data_fram['销售百分比'],color='red',marker='*',ms=10)
map4=canvas.add_subplot(224)
map4.bar(Data_fram['水果'],Data_fram['销售量'],color='blue')
plt.show()

效果展示

在这里插入图片描述

add_axes

add_axes--代码实现


import matplotlib.pyplot as plt
import  pandas as pd

Data_fram=pd.read_excel('E:\pythonProject\matplotlib各种图表\line_chart_bar.xlsx')
print(Data_fram.head())

plt.rcParams['font.sans-serif'] = ['KaiTi']  # 指定默认字体,解决中文不显示的问题
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题

# (1) add_axes新增区域
canvasss=plt.figure()
# 自定义距离
left,bottom,width,height = 0.1,0.1,0.8,0.8
mapp1=canvasss.add_axes([left,bottom,width,height ])
mapp1.plot(Data_fram['水果'],Data_fram['销售百分比'],color='red',marker='*',ms=10)
mapp1.set_title("销售量")

# 自定义距离
left,bottom,width,height = 0.65,0.6,0.25,0.25
mapp2=canvasss.add_axes([left,bottom,width,height ])
mapp2.bar(Data_fram['水果'],Data_fram['销售量'],color='blue')
mapp2.set_title("销售百分比")
plt.show()

效果展示
在这里插入图片描述

<think>好的,我需要回答用户关于如何在Python Matplotlib中生成或自定义导航栏的问题。首先,我应该回忆一下Matplotlib的导航工具栏相关知识。 记得Matplotlib提供了默认的导航工具栏,支持缩放、平移和保存图像等功能。用户可能想自定义这个工具栏,比如添加按钮或修改现有功能。根据用户提供的引用,特别是引用[1]和[2],提到Qt后端和后端模块的结构。比如,在Qt后端中,使用`backend_qt5agg.py`中的`NavigationToolbar2QT`类。所以可能需要导入相应的后端模块来访问工具栏类。 然后,用户可能需要在Tkinter或其他GUI工具包中嵌入Matplotlib,但根据引用[3],用户提到了Tkinter的主窗口创建,但问题主要是关于导航栏的自定义,可能需要结合不同的后端处理。不过用户的问题集中在生成和自定义导航栏,因此需要分步骤说明。 首先,生成默认导航栏的方法。例如,在使用Qt5Agg后端时,可以通过`NavigationToolbar2QT`来创建工具栏,并将其添加到GUI窗口中。这需要先创建一个FigureCanvas实例,然后将工具栏附加到主窗口。 其次,关于自定义导航栏,可能需要继承原有的工具栏类,并重写或添加方法。比如添加一个按钮,并绑定自定义的函数。引用[2]提到可以参考Qt后端的实现来获取灵感,尤其是在Tkinter中实现类似功能,可能需要查看源代码了解其结构。 还需要考虑不同后端之间的差异,比如Qt、Tkinter或GTK,每个后端的导航工具栏实现可能不同,因此用户需要根据自己使用的后端来选择相应的方法。例如,在Tkinter中使用的后端可能不同,但用户提供的引用[3]显示如何在Tkinter中创建窗口,可能需要使用`FigureCanvasTkAgg`和对应的导航工具栏类。 另外,引用[4]提到通过Anaconda环境查看安装的库,这可能帮助用户确认是否安装了必要的后端依赖。 总结回答的结构应该是:首先生成默认导航栏的方法,然后说明如何自定义,比如添加按钮或功能,最后提醒用户注意后端的选择和依赖。需要确保代码示例正确,比如导入正确的模块,创建工具栏的步骤,以及自定义方法的示例。</think>在Python Matplotlib中生成和自定义导航栏的实现方法如下,结合不同GUI后端(以Qt和Tkinter为例): ### 一、生成默认导航栏 Matplotlib的导航栏通过`NavigationToolbar`类实现,不同后端对应不同子类(如Qt用`NavigationToolbar2QT`,Tkinter用`NavigationToolbar2Tk`)。 #### 1. Qt后端示例 ```python from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar from matplotlib.figure import Figure import sys from PyQt5.QtWidgets import QApplication, QMainWindow app = QApplication(sys.argv) window = QMainWindow() # 创建画布 fig = Figure() canvas = FigureCanvas(fig) # 添加导航栏到主窗口 toolbar = NavigationToolbar(canvas, window) # 关键步骤 window.addToolBar(toolbar) window.setCentralWidget(canvas) window.show() sys.exit(app.exec_()) ``` #### 2. Tkinter后端示例 ```python import tkinter from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk from matplotlib.figure import Figure root = tkinter.Tk() fig = Figure() canvas = FigureCanvasTkAgg(fig, master=root) canvas.draw() # 创建并打包导航栏 toolbar = NavigationToolbar2Tk(canvas, root) # 关键步骤 toolbar.update() canvas.get_tk_widget().pack() root.mainloop() ``` ### 二、自定义导航栏 通过继承原工具栏类并重写方法实现功能扩展。以Qt后端为例添加"标记极值点"按钮: ```python class CustomToolbar(NavigationToolbar): def __init__(self, canvas, parent): super().__init__(canvas, parent) # 添加自定义按钮 self.addAction("标记极值", self.mark_extrema) def mark_extrema(self): ax = self.canvas.figure.axes[0] x, y = ax.lines[0].get_data() # 寻找极值点 max_idx = y.argmax() min_idx = y.argmin() ax.plot(x[max_idx], y[max_idx], 'ro') ax.plot(x[min_idx], y[min_idx], 'go') self.canvas.draw() # 使用时替换原有工具栏 toolbar = CustomToolbar(canvas, window) ``` ### 三、关键注意事项 1. **后端匹配**:必须导入与GUI框架对应的后端模块(如Qt用`backend_qt5agg`,Tkinter用`backend_tkagg`)[^1][^3] 2. **源代码参考**:自定义时可查阅Matplotlib源码的`lib/matplotlib/backends`目录,了解各后端实现细节[^2] 3. **依赖检查**:通过`conda list`或`pip list`确认已安装对应后端的依赖库(如PyQt5、tkinter等)[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值