参考网址
0/绘图有2种方式
import matplotlib.pyplot as plt
fig,ax = plt.subplots(2,2,figsize=(20,8),dpi=150)
ax1 = ax[0,0]
ax2 = ax[0,1]
fig = plt.figure(figsize=(20,8),dpi=200)
ax1 = fig.add_subplot(211,polar=False)
ax2 = fig.add_subplot(212)
1/什么是matplotlib
matplotlib是一个python的一个库包,用于数据的可视化。
它有一个名为pyplot的模块(模块指的是.py脚本文件),通过提供控制线条样式,字体属性,格式化轴等功能,使得绘图变得容易。
import matplotlib.pyplot as plt
pyplot是一个.py文件的名字,也就是一个模块,把这个模块抽象出来,命名为plt,然后就可以调用该模块中的所有功能函数了。
主要作用是进行数据的可视化,绘制各种图,比如折线图,柱状图,饼图,散点图,象限图,帕累托图等。
另外,还有像pyecharts,seaborn这样的可视化的扩展包。本篇文章不做赘述。
使用方法:import matplotlib.pyplot as plt
2/figure/axes/axis的区别
figure是总的画布
axes是画布中的子图,也就是每一个绘图的区域。可以在fig中有多个绘图区域。
axis是每个子图中的坐标轴。

从上图可以知道:
figure是总画布
axex是画布中的子图,画布中可以有一个或者多个子图。子图与子图之间是呈矩阵排列的。
axis是坐标轴,每个子图中都有坐标轴。

将各个图形绘制在一张画布中,并以矩阵的形式进行排列,就形成了矩阵子图。
子图可以帮我们更方便地对比各数据变化趋势。
在一张画布中,绘制多个子图,可以更直观的对比多个图之间的差别。
3/matplotlib怎么用
<1> 初始化总画布fig和子图axes
import matplotlib.pylot as plt
fig,ax = plt.subplots(2,2,
figsize=(30,8),
dpi=200,
facecolor=None,
edgecolor=None,
frameon=True)
plt.subplots_adjust(left=?,
bottom=?,
right=?,
top=?,
wspace=?,
hspace=?)
fig.suptitle("总标题",fontsize=50,color='black',alpha=1)
<2>获取子图进行绘制
import matplotlib.pyplot as plt
ax1 = ax[0,0]
ax2 = ax[0,1]
ax3 = ax[1,0]
ax4 = ax[1,1]
<3>给子图设置标题
ax1.set_title("图1",fontsize=30,color='black',alpha=1)
<4>在子图上进行绘制
ax1.plot([1,2,3], label="111")
ax1.plot([4,5,6], label="222")
<5>显示图例
ax1.legend(title='xxx',
fancybox=False,
loc='lower left',
prop={'family':'SimHei','weight':'normal','size':15})
图例的所有位置选项如下:

<6>移除图例
ax1.legend_.remove()
<7>设置xy轴的名称label
ax1.set_xlabel("data_month",fontsize=20,color='red',rotation=0)
ax1.set_ylabel("员工在职人数",fontsize=20,color='red',rotation=90)
<8>网格线grid
ax1.grid(which='major',axis='x',color='gray',linestyle='-.',linewidth=1)
ax1.grid(which='major',axis='y',color='gray',linestyle='-.',linewidth=1)
ax1.grid(which='major',axis='both',color='gray',linestyle='-.',linewidth=1)
<9>添加水平线和垂直线
ax1.axvline(x=1,ls="-",c="red")
ax1.axhline(y=1,ls="-",c="red")
<10>添加解释性文字
font = {'size':20,
'color':'red',
'family':'SimHei',
'style':'italic',
"alpha":0.3,
'ha':'left',
'va':'center'}
ax1.text(1,2,"红色竖线是实施聚焦日的日期",fontdict=font)
ax1.text(0.25,3,"边缘区域",fontsize=25,color='gray',ha='center',va='center',alpha=0.3)
<11>设置xy坐标轴的刻度,还可以设置精度
ax1.set_xticks(range(20),0.5)
ax1.set_yticks(range(20),0.5)
start, end = ax1.get_xlim()
ax1.xaxis.set_ticks(np.arange(start, end,1))
start, end = ax1.get_ylim()
ax1.yaxis.set_ticks(np.arange(start,end,1))
<12>设置xy轴的范围
ax1.set_xlim(0,50)
ax1.set_ylim(0,30)
<13>把y轴的刻度显示在左边还是右边
ax1.yaxis.tick_left()
ax1.yaxis.tick_right()
<14>绘制另一个子图,每个子图的绘制方法都是一样的。
ax2 = ax[0,1]
ax2.plot([11,22,33],label="中国")
ax2.plot([1,2,3],label="小日本")
<15>存储图
plt.savefig('../data/1.png')
plt.show()
<16>删除边框
一个axes子图是由4条边组成的,我们可以人为的决定这4条边框是否显示
删除边框有2种方法
一个axes子图是由4条边组成的,我们可以人为的决定这4条边框是否显示
ax = plt.gca()
ax1.spines["right"].set_color("none")
ax1.spines["top"].set_color("none")
ax1.spines["left"].set_color("none")
ax1.spines["bottom"].set_color("none")
<2>方法2
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
ax.spines['bottom'].set_visible(False)
ax.spines['left'].set_visible(False)
<17>移动坐标轴
ax1.spines["left"].set_position( ("data",0) )
ax1.spines["bottom"].set_position( ("data",0.05) )
<18>清除画布
plt.cla()
plt.clf()
plt.close()
<19>从整个画布的角度,来控制其中的子图
plt.setp(ax1.get_xticklabels(), rotation=45)
plt.setp(ax2.get_xticklabels(), rotation=45)
图例
ax1.plot(xaxis, yaxis1, linewidth=3, color="red", label="intercept_driver_cnt")
ax1.plot(xaxis, yaxis2, linewidth=3, color="blue", label="intercept_success_cnt")
ax1.legend(loc='upper left',fontsize=20)
即:要想用legend()函数,必须在上面绘图的时候,添加label参数
在图中每个节点标明数值
# 设置数字标签
for a, b in zip(xaxis, yaxis1):
ax1.text(a, b, b, ha='center', va='bottom', fontsize=15)
添加网格线grid
ax1.grid(True,axis='x')
ax1.grid(True,axis='y')
子图添加水平,垂直线
ax1.axvline(x='2023-04-24', color='blue', linestyle='-')
子图添加标题,横坐标,纵坐标
ax1.set_xlabel('Date')
ax1.set_ylabel('Number of successful interceptions')
ax1.set_title('title_1')
子图,设置坐标刻度的范围
ax1.set_ylim(0,2000)
ax1.set_xlim(0,100)
4/plt.rcParams
plt(matplotlib.pyplot)使用rc配置文件来自定义图形的各种默认属性,称之为rc配置或rc参数。
通过rc参数可以修改默认的属性,包括窗体大小、每英寸的点数、线条宽度、颜色、样式、坐标轴、坐标和网络属性、文本、字体等。
rc参数存储在字典变量中,通过字典的方式进行访问。

5/折线图
适用场景:有一定的趋势,无论是时间趋势,还是大小趋势。
x轴代表趋势,每个x轴刻度尺只有一个数据点
import matplotlib.pyplot as plt
import pandas as pd
data_df = pd.read_excel("../data/final.xlsx")
print(data_df.head())
fig,ax= plt.subplots(2,1,figsize=(12,6),dpi=150)
plt.subplots_adjust(hspace=0.5)
ax1 = ax[0]
x = data_df["通勤距离"].tolist()
y1 = data_df["工作日不打车平均工时"].tolist()
y2 = data_df["工作日打车平均工时"].tolist()
ax1.plot(x,y1,label="工作日不打车时候平均工时")
ax1.plot(x,y2,label="工作日打车时候平均工时")
ax1.set_title("通勤距离_工时(20210101~20210707)",fontsize=15,color='black',alpha=1)
ax1.set_xlabel("通勤距离",fontsize=12,color='black',rotation=0)
ax1.set_ylabel("平均工时",fontsize=12,color='black',rotation=90)
ax1.legend(loc='lower right',prop = {'family':'SimHei','weight':'normal','size':6})
ax1.grid(axis='y',color='gray',linestyle='-.',linewidth=1)
ax1.xaxis.set_ticks(x)
ax2 = ax[1]
x = data_df["通勤距离"].tolist()
y = data_df["在职人数"].tolist()
ax2.plot(x,y,label="在职人数")
ax2.set_title("通勤距离_在职人数(截止到20210707)",fontsize=15,color='black',alpha=1)
ax2.set_xlabel("通勤距离",fontsize=12,color='black',rotation=0)
ax2.set_ylabel("在职人数",fontsize=12,color='black',rotation=90)
ax2.legend(loc='lower right',prop = {'family':'SimHei','weight':'normal','size':6})
ax2.grid(axis='y',color='gray',linestyle='-.',linewidth=1)
ax2.xaxis.set_ticks(x)
plt.savefig("../data/房补_通勤距离_工时.pdf",dpi=150,format="pdf")
plt.show()
6/散点图
适用场景:即可以看到数据的分布,也可以看到数据的大致走势。
每个x的刻度尺可以有多个数据点。
import matplotlib.pyplot as plt
fig,ax = plt.subplots(num="xxxx",figsize=(30,8),dpi=200)
ax.set_title("散点图").set_ha("center")
ax.set_xlim(-3,12)
ax.set_ylim(0,1.1)
xmin, xmax = ax.get_xlim()
ymin, ymax = ax.get_ylim()
ax.xaxis.set_ticks( np.arange(xmin,xmax,1) )
ax.yaxis.set_ticks( np.arange(ymin,ymax,0.1) )
ax.set_xlabel("月份")
ax.set_ylabel("人数")
ax.axhline(y=4,ls=":",c="yellow")
ax.axvline(x=4,ls="-",c="green")
ax.text(x,y,text,fontsize=25,color="gray",ha="center",va="center",alpha=0.3)
ax.scatter(list,
list,
label="xxxx",
c = xxx,
edgecolor='xxx',
facecolor='xxx',
alpha = 1,
s = 60 )
ax.legend(title="姓名",fancybox=False,loc='lower right')
7/饼状图
import pandas as pd
import nunpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
fig,ax = plt.subplots(figsize=(12,6),dpi=200)
fig.suptitle("总标题_饼状图",fontsize=50,color='black',alpha=1)
ax.set_title('2018年8月的编程语言指数排行榜',fontsize=50,colosr='black')
data = [0.1688,0.1496,0.0747,0.0699,0.0476,0.0354,0.0292,0.0241,0.0231,0.0140,0.3632]
labels = ['Java','C','C++','Python','Visual Basic.NET','C#','PHP','JavaScript','SQL','Assembly langugage','其他']
explode =[0,0,0,0.3,0,0,0,0,0,0,0]
colors = ['red','pink','magenta','purple','orange']
ax.set_aspect('equal')
ax.set_xlim(0,8)
ax.set_ylim(0,8)
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.spines['left'].set_color('none')
ax.spines['bottom'].set_color('none')
ax.pie(x=data,
labels=labels,
explode=explode,
colors=colors,
autopct='%.2f%%',
pctdistance=0.8,
labeldistance=1.0,
startangle=180,
center=(4,4),
radius=3.8,
shadow=False,
counterclock= False,
wedgeprops= {'linewidth':1,'edgecolor':'green'},
textprops= {'fontsize':12,'color':'black'},
frame=1
ax.set_xticks(())
ax.set_yticks(())
plt.show()
8/柱状图
适用场景:分类的数据。
比如某届奥运会,看看各个国家获得的奖牌的数量。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["font.family"] = ["Arial Unicode MS"]
plt.rcParams['font.sans-serif'] = ["Microsoft JhengHei"]
plt.rcParams['axes.unicode_minus'] = False
data_df = pd.read_excel('/Users/houzhen/Desktop/fangjia.xlsx')
data_df = data_df.sort_values(by="price",ascending=True)
fig,ax = plt.subplots(figsize=(12,6),dpi=144,facecolor='black',edgecolor='black')
ax.set_title("山东省各地级市房价一览表(元/平米)").set_ha("center")
x = data_df['region'].tolist()
y = data_df['price'].tolist()
barh = ax.barh(x,y,color=np.random.rand(4) )
barh[-1].set_color("r")
for y, x in enumerate(data_df['price'].tolist()):
ax.text(x+100, y-0.2, "%s" % x)
ax.spines["right"].set_visible(False)
ax.spines["top"].set_visible(False)
ax.spines["bottom"].set_visible(False)
ax.spines["left"].set_visible(False)
ax.tick_params(labelsize=14)
ax.set_xlabel("总价")
ax.set_ylabel("地区")
plt.show()
9/箱型图
箱型图的主要作用是发现数据内部整体的分布分散情况,包括上下限,各分位数,均值,异常值。
如下图所示:

基本语法
plt.boxplot( x,
notch=None,
sym=None, 指定异常点的形状
vert=None, 是否需要将箱线图垂直摆放
whis=None, 指定上下须与上下四分位的距离
positions=None, 指定箱线图的位置
widths=None, 指定箱线图的宽度
patch_artist=None, 是否填充箱体的颜色;
bootstrap=None,
usermedians=None,
conf_intervals=None,
meanline=None,
showmeans=None, 是否显示均值
showcaps=None, 是否显示箱线图顶端和末端的两条线
showbox=None, 是否显示箱线图的箱体
showfliers=None, 是否显示异常值
boxprops=None, 设置箱体的属性,如边框色,填充色等;
labels=None, 为箱线图添加标签
flierprops=None, 设置异常值的属性
medianprops=None, 设置中位数的属性
meanprops=None, 设置均值的属性
capprops=None, 设置箱线图顶端和末端线条的属性
whiskerprops=None, 设置须的属性
manage_xticks=True,
autorange=False,
zorder=None,
hold=None,
data=None)


基本用法:
import pandas as pd
import matplotlib.pyplot as plt
data = pd.read_excel('D:\\pythondata\\learn\\matplotlib.xlsx')
box_1, box_2, box_3, box_4 = data['收入_Jay'], data['收入_JJ'], data['收入_Jolin'], data['收入_Hannah']
fig,ax = plt.subplots(figsize=(12,6),api=144)
fig.suptitle("总标题",fontsize=50,color='black',alpha=1)
ax.set_title("xxx").set_ha("center")
labels = 'Jay','JJ','Jolin','Hannah'
ax.boxplot([box_1, box_2, box_3, box_4],labels = labels)
plt.show()
DataFrame.boxplot(column=None, 指定要进行箱型图绘制的列,默认是全部的列
by=None,
ax=None,
showmeans=False,
fontsize=None,
rot=0,
grid=True,
figsize=None,
layout=None,
return_type=None)
各个参数解释如下

import pandas as pd
import matplotlib.pyplot as plt
data_df = pd.read_excel('/Users/houzhen/Desktop/fangjia.xlsx')
fig,ax = plt.subplots(figsize=(12,6),dpi=144)
fig.suptitle("总标题",fontsize=50,color='black',alpha=1)
ax.set_title("xxx").set_ha("center)
data_df.boxplot(showmeans=True)
10/雷达图
雷达图一般用来对不同的人或事物,在多个维度进行比较.
雷达图的各个维度的取值范围一般是[0,1],所以对数据一般需要进行归一化或者标准化。
雷达图有2种方式:
<1>绘制一张雷达图,把多个人放在一张雷达图中比较。
<2>绘制多张雷达图,把多个人放在多张雷达图中进行比较。
比如,对如下数据绘制雷达图


import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams["font.family"] = ["Arial Unicode MS"]
plt.rcParams['font.sans-serif'] = ["SimHei"]
plt.rcParams['axes.unicode_minus'] = False
basic_df = pd.read_excel("/Users/houzhen/Desktop/111xlsx.xlsx",encoding="gb18030")
feature_name = basic_df.columns.tolist()[1:]
for each_feature in feature_name:
max_value = basic_df[each_feature].max()
min_value = basic_df[each_feature].min()
basic_df[each_feature] = basic_df[each_feature].apply(lambda v: (v - min_value) / (max_value - min_value))
feature_name = basic_df.columns.tolist()[1:]
dataLength = len( feature_name )
data = basic_df.values.tolist()
angles = np.linspace(0,2*np.pi,dataLength,endpoint=False)
fig = plt.figure(figsize=(13,7))
ax = fig.add_subplot(111,polar=True)
ax.set_title("xxx",fontproperties="SimHei",fontsize=16)
for i in data:
temp_data = np.concatenate( (i[1:], [i[1:][0]]) )
temp_angles = np.concatenate((angles,[angles[0]]))
ax.set_thetagrids(temp_angles * 180/np.pi,feature_name,fontproperties="SimHei")
ax.plot(temp_angles,temp_data,color=np.random.rand(4),linewidth=2,label=i[0])
ax.set_rlim(0,1)
ax.legend(title='xxx',
fancybox=False,
loc='lower left',
prop={'family':'SimHei','weight':'normal','size':15})
plt.show()
11/帕累托图
帕累托(Pareto)是Excel和Tableu中非常流行的diagarm。
在excel中,我们可以轻松地绘制帕累托图,但是我发现没有简单的方法可以在Python中绘制该图。
绘制完帕累托图之后,我们既可以知道任何一个类别的值,也可以知道哪些类别占据了总量的前xx
比如说,某届奥运会,我们知道每一个国家获得了多少枚金牌,同时,我们也可以知道哪些国家获得了前80
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.ticker import PercentFormatter
data_df = pd.DataFrame(data={'国家':['USA', 'Canada', 'Russia', 'UK', 'Belgium', 'Mexico','Germany', 'Denmark'],'金牌数':[177.0, 7.0, 4.0, 2.0, 2.0, 1.0, 1.0, 1.0]})
data_df = data_df.sort_values(by='金牌数',ascending=False)
data_df["cumpercentage"] = data_df["金牌数"].cumsum() / df["金牌数"].sum() * 100
fig,ax = plt.subplots(figsize=(10,6),dpi=100)
ax.set_title("帕累托图",fontproperties="SimHei",fontsize=16)
x = data_df['国家']
y = data_df["金牌数"]
ax.bar(x,y,color="C0")
ax2 = ax.twinx()
y = data_df["cumpercentage"]
ax2.plot(x,y,color="C1",marker="D",ms=7)
ax2.yaxis.set_major_formatter( PercentFormatter() )
ax.tick_params(axis="y",colors="C0")
ax2.tick_params(axis="y",colors="C1")
plt.show()

12/表格
pandas的dataframe数据结构在呈现的时候,
会出现列名和数据错位的情况,视觉效果不是很友好。
所以如果设置为表格的话,视觉效果会大大提升。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import datetime
import six
font = {'family' : 'SimHei',
'weight' : 'bold',
'size' : '16'}
plt.rc('font', **font)
plt.rc('axes', unicode_minus=False)
col_width, row_height = (5.0, 0.8)
size = (np.array(data.shape[::-1]) + np.array([0, 1])) * np.array([col_width, row_height])
fig, ax = plt.subplots(figsize=size,dpi=150)
ax.axis('off')
plt_table = ax.table(cellText=data.values,
bbox=[0, 0, 1, 1],
colLabels=data.columns,
cellLoc='center')
plt.title('【巨像文明】不删档测试机器人报数测试_',size = '20')
plt.text(0,-0.15,
"备注:截止日期:"+" 23:59:59。",
fontdict={'color': '#8E8E8E',
'size': '20',
'style': 'italic'})
plt_table.auto_set_font_size(False)
plt_table.set_fontsize(20)
row_colors = ['#f1f1f2', 'white']
edge_color = 'black'
header_color='steelblue'
for k, cell in six.iteritems(plt_table._cells):
text = cell._text.get_text()
cell.set_edgecolor(edge_color)
cell.set_text_props(ha='center')
if k[0] == 0:
cell.set_text_props(weight='bold',color='white')
cell.set_facecolor(header_color)
elif k[0] % 2 == 0:
cell.set_facecolor(row_colors[0])
else:
cell.set_facecolor(row_colors[1])
python matplotlib,我不初始化fig对象,而是直接采用plt绘制图,可以吗
是可以的。
你可以在不显式初始化`Figure`(`fig`)对象的情况下,直接使用`matplotlib.pyplot`(通常缩写为`plt`)来绘制图形。
`matplotlib.pyplot`模块提供了一个类似于MATLAB的绘图系统接口,它会自动管理图形和坐标轴(axes)的创建,使得绘图过程更加简便快捷。
当你调用`plt.plot()`、`plt.scatter()`等绘图函数时,如果当前没有活动的图形(figure)或坐标轴(axes),`matplotlib.pyplot`会自动为你创建一个新的图形和坐标轴来承载你的绘图数据。
下面是一个简单的例子,展示了如何在不显式初始化`Figure`对象的情况下,使用`plt`来绘制一个线图:
import matplotlib.pyplot as plt
plt.plot([1, 2, 3], [4, 3, 2])
plt.title('Simple Plot')
plt.xlabel('x axis')
plt.ylabel('y axis')
plt.grid(True)
plt.show()
在这个例子中,我们没有创建任何`Figure`或`Axes`对象,但仍然能够成功地绘制出一个线图,并添加了标题、轴标签和网格。`plt.show()`函数负责在屏幕上显示这个图形。
然而,当你需要对图形进行更复杂的布局控制(比如创建子图、调整坐标轴位置等)时,使用`matplotlib`的面向对象接口(即显式创建`Figure`和`Axes`对象)可能会更加灵活和强大。
但在简单的绘图任务中,`matplotlib.pyplot`提供的便捷接口已经足够使用了。
plt和fig之间,有什么关系
在`matplotlib`库中,`plt`(通常是`matplotlib.pyplot`的别名)和`fig`(代表`Figure`对象)之间的关系可以概括为:`plt`提供了一套面向过程的函数接口,用于创建和管理图形(`Figure`)及其上的各种元素(如坐标轴`Axes`、图例`Legend`、标题`Title`等),而`Figure`对象则是这些图形元素在内存中的具体表示。
当你使用`plt`的函数(如`plt.plot()`、`plt.scatter()`等)进行绘图时,如果当前没有活动的`Figure`对象,`plt`会自动为你创建一个新的`Figure`对象,并在其上创建一个或多个`Axes`对象(默认情况下是一个)。然后,绘图函数会将数据绘制到这些`Axes`对象上。
如果你需要更直接地控制图形的创建和管理,你可以使用`matplotlib`的面向对象接口,即显式地创建`Figure`和`Axes`对象。
这样,你就可以更灵活地控制图形的布局和样式。然而,在大多数情况下,使用`plt`提供的函数接口已经足够方便和强大。
以下是一个简单的例子,展示了使用`plt`和显式创建`Figure`对象之间的区别:
import matplotlib.pyplot as plt
plt.plot([1, 2, 3], [4, 3, 2])
plt.title('Plot using plt')
plt.show()
在这个例子中,`plt`自动为你创建了一个`Figure`对象和一个`Axes`对象,并将数据绘制在`Axes`上。
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot([1, 2, 3], [4, 3, 2])
ax.set_title('Plot using Figure and Axes')
plt.show()
在这个例子中,我们首先使用`plt.figure()`创建了一个`Figure`对象,然后使用`fig.add_subplot()`在`Figure`上创建了一个`Axes`对象,并通过`ax`(`Axes`对象的引用)来绘制数据和设置标题。虽然这种方法更加灵活,但在简单的绘图任务中,使用`plt`提供的函数接口通常更为方便。
针对matplotlib,如果我先初始化了一个fig对象,然后我再使用plt来绘制图形,那么是不是我所绘制的所有的元素都是在fig对象上绘制的呢
在matplotlib中,确实可以通过先初始化一个`Figure`对象(通常简称为`fig`),
然后在这个`Figure`对象上添加各种元素(如轴`Axes`,图形`plot`,图例`legend`等)来绘制图形。
然而,当你提到使用`plt`(即`matplotlib.pyplot`的常用缩写)来绘制图形时,情况略有不同,但基本上你的理解是正确的。
`matplotlib.pyplot`是一个面向绘图的模块,它提供了一个类似于MATLAB的绘图系统。
当你使用`plt`函数(如`plt.plot()`, `plt.scatter()`, `plt.hist()`等)时,matplotlib实际上会在内部为你管理一个或多个`Figure`和`Axes`对象。
如果在你调用`plt`绘图函数之前没有显式地创建并指定一个`Figure`对象,matplotlib会自动为你创建一个新的`Figure`和`Axes`。
但是,如果你已经创建了一个`Figure`对象(比如`fig = plt.figure()`),并且你希望在这个特定的`Figure`对象上绘图,你需要先获取或创建一个`Axes`对象(通过`fig.add_subplot()`, `fig.add_axes()`等方法),然后使用这个`Axes`对象来绘制图形,而不是直接使用`plt`的函数。这是因为直接使用`plt`的函数(如`plt.plot()`)默认是在当前激活的`Axes`上绘图,而当前激活的`Axes`可能不是你之前创建的`Figure`对象上的`Axes`。
然而,有一个例外是,如果你已经通过`plt.figure()`创建了一个`Figure`,并且没有切换到其他`Figure`,那么接下来直接使用`plt`的绘图函数(如`plt.plot()`)实际上是在这个`Figure`上绘制图形,因为matplotlib默认会将最近创建的`Figure`设置为当前`Figure`。
但是,为了代码的清晰和可维护性,建议明确地使用`Figure`和`Axes`对象来管理你的绘图。
总结来说,虽然直接使用`plt`的绘图函数在大多数情况下会在你期望的`Figure`上绘制图形(如果你没有创建多个`Figure`或没有明确切换到其他`Figure`),但最佳实践是显式地管理`Figure`和`Axes`对象,以确保绘图操作的精确控制。