Bootstrap

数据分析——Matplotlib数据可视化

编辑器:jupyter notebook 

一、简单图表

1.  单条折线图

import matplotlib.pyplot as plt

# plt.plot(*args, scalex=True, scaley=True, data=None, **kwargs)
x = [1, 2, 3, 4, 5]     # numpy 或 pandas 的数据结构均可
y = [2, 4, 6, 8, 10]    # numpy 或 pandas 的数据结构均可
plt.plot(x, y)
plt.show()

 2.  多条折线图

x = [1, 2, 3, 4, 5]
y1 = [2, 4, 6, 8, 10]
y2 = [3, 5, 7, 9, 11]
plt.plot(x, y1, '--')
plt.plot(x, y2, '-.')
plt.show()

 3.  散点图

x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]
plt.plot(x, y, '*')
plt.show()

二、图标配置

1.  默认配置

import pandas as pd
import matplotlib.pyplot as plt

1.1  rcParams

  • runtime configuration Parameters
  • 运行时配置参数
# 在线画图
%matplotlib inline
# 正常显示中文
plt.rcParams['font.sans-serif'] = 'SimHei'
# 正常显示负号
plt.rcParams['axes.unicode_minus'] = False
# 设置矢量图
%config Inlinebackend.figure_format = 'svg'



df = pd.read_excel('./data/plot.xlsx', sheet_name='sales')

df

 

x = df['日期']  # x轴数据
y = df['销量']  # y轴数据
plt.plot(x, y)  # 折线图
plt.show()

 2.  自定义配置

# plt.figure(
#     num=None,
#     figsize=None,  ——————>   画布大小
#     dpi=None,  ——————>   分辨率
#     facecolor=None,  ——————>   画布背景颜色
#     edgecolor=None,  ——————>   设置边框颜色
#     frameon=True,
#     FigureClass=<class 'matplotlib.figure.Figure'>,
#     clear=False,
#     **kwargs,
# )
plt.figure(figsize=(5,3),dpi=200,facecolor='#eae4d1',edgecolor='red')
x = df['日期']
y = df['销量']
# color:调节线条颜色
# linestyle:线条样式
# linewidth:设置线条宽度
# marker:标记样式
# markersize:标记大小
# mfc:marker face color 标记的背景颜色
plt.plot(x,y,color='green',linestyle='-.',linewidth=2,marker='o',markersize=5,mfc='white')

# 添加标题
# plt.title(label, fontdict=None, loc=None, pad=None, *, y=None, **kwargs)
# label:设置标题
# loc:标题对齐方式,默认是剧中
# fontsize:设置标题字体大小
plt.title(label='2021年6月1号——25号销量折线图',loc='center',fontsize=10)

# 添加x轴标题(非刻度标签)
# plt.xlabel(xlabel, fontdict=None, labelpad=None, *, loc=None, **kwargs)
plt.xlabel('2021年6月')

# 添加y轴标题(非刻度标签)
# plt.ylabel(ylabel, fontdict=None, labelpad=None, *, loc=None, **kwargs)
# rotation:调节字的旋转角度
plt.ylabel('销量',rotation=0)

# 设置x轴刻度标签
# plt.xticks(ticks=None, labels=None, **kwargs)
labels = [str(x)+'日' for x in df['日期']]
plt.xticks(ticks=df['日期'],labels=labels,rotation=30)

# 设置x轴刻度范围
# plt.xlim(0,20)

# 设置y轴刻度范围
plt.ylim(0,120)

# 添加网格线
# plt.grid(b=None, which='major', axis='both', **kwargs)
# color:设置线的灰度0——1之间越大越浅
# linestyle:设置线的样式
# axis:设置x,y方向是否显示网格线
# linewidth:设置线的宽度
plt.grid(color='0.8',linestyle=':',axis='y',linewidth=1)

# 添加数据标签
# plt.text(x, y, s, fontdict=None, **kwargs)
# plt.text(x=8,y=100,s='94')
# 批量添加数据标签
for a,b in zip(x,y):
    plt.text(x=a, # x坐标值
             y=b+3, # y坐标值
             s=b, # 数据标签内容
             ha='center', # 水平剧中
             va = 'bottom',  # 垂直靠下
             fontsize=8   # 设置字体大小
            )

# 添加注释
# plt.annotate(text, xy, *args, **kwargs)
plt.annotate(
    text='最高销量', # 注释内容
    xy=(13,98), # 被注视的坐标点
    xytext=(12,50), # 注释内容的坐标点
    arrowprops={'width':1,'headwidth':4} # width:箭柄宽度;headwidth:箭头宽度;
)

# 添加图例(插入数据后再添加图例)
# plt.legend(*args, **kwargs)
plt.legend(fontsize=6,loc='upper left',labels=['成绩'])

# 保存图片(要在展示图片之前)
plt.savefig('./figure/02图标配置.png')

plt.show()

2.1 pyplot的常用配置及其说明

基础语法说明
plt.figure创建空白画布,在一幅画中可省略
figure.add_subplot第一个参数表示行,第二个参数表示列,第三个参数表示选中的子图编号
plt.title标题
plt.xlabelx轴名称
plt.ylabely轴名称
plt.xlimx轴范围
plt.ylimy轴范围
plt.xticks第一个参数为范围,数组类型;第二个参数是标签;第三个是控制标签
plt.yticks同 plt.xticks 
plt.legend图例
plt.savefig保护图形
plt.show在本机显示

2.2各样式说明

 

参数参数值描述
colorb蓝色
g绿色
r红色
y黄色
k黑色
w白色
0.5灰度
linestyle-实线
:虚线
--双划线
-.点划线
marker.
,像素
o实心圆
v倒三角
^上三角
>右三角
<左三角
1下花三角
2上花三角
3左花三角
4右花三角
s实心正方形
p实心五角星
*星形
h竖六边形
H横六边形
+加号
x叉号
D大菱形
d小菱形
|垂直线

三、折线图

import pandas as pd
import matplotlib.pyplot as plt


%matplotlib inline
# 正常显示中文
plt.rcParams['font.sans-serif'] = 'SimHei'
# 正常显示负号
plt.rcParams['axes.unicode_minus'] = False
# 设置矢量图
%config Inlinebackend.figure_format = 'svg'


df = pd.read_excel('./data/plot.xlsx', sheet_name='line')

 1.  准备数据

df

x,y1,y2,y3 = df['月份'],df['语文'],df['数学'],df['英语']

2.  绘制折线图

plt.figure(figsize=(5,3),dpi=200)
# mfc:marker face color,标记的背景颜色
# ms:marker size,标记的大小
# alpha:透明度,0—1
plt.plot(x,y1,label='语文',color='y',marker='+',mfc='w',ms=6,alpha=0.8)
plt.plot(x,y2,label='数学',color='b',marker='o',mfc='w',ms=6,alpha=0.8)
plt.plot(x,y3,label='英语',color='g',marker='*',mfc='w',ms=6,alpha=0.8)
# 添加水平线
plt.hlines(y=90,xmin=0,xmax=10,colors='red',linestyles=':')
# 添加网格
plt.grid(color='0.8',linestyle=':',axis='y',linewidth=1)
# 设置y轴值范围
plt.ylim(0,110)
# 设置标题
plt.title('各科成绩的折线图')
# 设置y轴标题
plt.ylabel('成绩',rotation=0)
# 添加图例
plt.legend()
plt.show()

四、柱形图

import pandas as pd
import matplotlib.pyplot as plt

%matplotlib inline
# 正常显示中文
plt.rcParams['font.sans-serif'] = 'SimHei'
# 正常显示负号
plt.rcParams['axes.unicode_minus'] = False
# 设置矢量图
%config Inlinebackend.figure_format = 'svg'

1.  简单柱形图

x = [1, 2, 3, 4, 5, 6]
y = [10, 20, 30, 40, 50, 60]
plt.bar(x, y)
plt.show()

 2.  普通柱形图

df = pd.read_excel('./data/plot.xlsx', sheet_name='bar1')
df

x,y = df['年份'],df['销售额']
# 设置画布
plt.figure(figsize=(5,3),dpi=200)
# 添加标题
plt.title('14-20年销售额趋势')
plt.xlabel('年份')
plt.ylabel('销售额')

# 画图
plt.bar(x=x,height=y,width=0.5)

# 添加网格线
plt.grid(axis='y')

# 循环批量添加文本标签
for a,b in zip(x,y):
    plt.text(x=a,y=b,s='{:.1f}万'.format(b/10000),ha='center',fontsize=8)

# 添加图例
plt.legend(['销售额'])

# 展示
plt.show()

 3.  簇状柱形图

df = pd.read_excel('./data/plot.xlsx', sheet_name='bar2')
df

x,y1,y2,y3 = df['年份'],df['北区'],df['中区'],df['南区']
# 设置画布
plt.figure(figsize=(5,3),dpi=200)
# 添加标题
plt.title('14-20年各区销售额对比')
plt.xlabel('年份')
plt.ylabel('销售额')

# 画图
# 避免图形重叠,柱形图的宽度必须与x值的偏移量保持一致
width = 0.2
plt.bar(x-width,y1,width=width)   # 北区
plt.bar(x,y2,width=width)   # 中区
plt.bar(x+width,y3,width=width)   # 南区

# 添加网格线
plt.grid(axis='y',color='0.9',linestyle=':')

# 添加图例
plt.legend(['北区','中区','南区'],fontsize=8,ncol=3)

# 展示
plt.show()

 4.  堆积柱形图

x,y1,y2,y3 = df['年份'],df['北区'],df['中区'],df['南区']
# 设置画布
plt.figure(figsize=(5,3),dpi=200)
# 添加标题
plt.title('14-20年各区销售额对比')
plt.xlabel('年份')
plt.ylabel('销售额')

# 画图
plt.bar(x,y1,label='北区')     # label 用于设置图例
plt.bar(x,y2,label='中区',bottom=y1)
plt.bar(x,y3,label='南区',bottom=y1+y2)

# 添加图例
plt.legend(ncol=3)

# 展示
plt.show()

五、直方图

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

%matplotlib inline
# 正常显示中文
plt.rcParams['font.sans-serif'] = 'SimHei'
# 正常显示负号
plt.rcParams['axes.unicode_minus'] = False
# 设置矢量图
%config Inlinebackend.figure_format = 'svg'

1.  简单直方图

# 随机生成100个[0, 100)的整数
np.random.seed(1)  # 随机种子
x = np.random.randint(0, 100, 100)
plt.hist(x, bins=range(0, 100, 10))
plt.show()

2.  绘制直方图

df = pd.read_excel('./data/plot.xlsx', sheet_name='hist')
df

# 建立画布
plt.figure(figsize=(5,3),dpi=200)
x = df['分数']
plt.title('数学成绩分布的直方图')
plt.xlabel('分数区间')
plt.ylabel('人数')

# 插入数据
plt.hist(x,bins=range(40,110,5),edgecolor='k',alpha=0.9)   # bins 分组

# 设置x轴刻度
plt.xticks(ticks=range(40,110,5))



# 展示
plt.show()

df['分数'].kurt()   # 峰度系数
# -0.14030776142606793

df['分数'].skew()   # 偏度系数
# -0.1022012815059641

六、饼状图

import pandas as pd
import matplotlib.pyplot as plt

%matplotlib inline
# 正常显示中文
plt.rcParams['font.sans-serif'] = 'SimHei'
# 正常显示负号
plt.rcParams['axes.unicode_minus'] = False
# 设置矢量图
%config Inlinebackend.figure_format = 'svg'

 1.  简单饼图

x = [10, 20, 30, 40]
plt.pie(x, autopct='%.2f%%')
plt.show()

 2.  普通饼图

df = pd.read_excel('./data/plot.xlsx', sheet_name='pie1')
df

lables = df['省份']
sizes = df['销量']
plt.figure(figsize=(5,3),dpi=300)
plt.pie(
    x=sizes,
    labels=lables,  # 分类标签
    autopct='%.2f%%',  # 百分比
    textprops={'fontsize':5},
    explode=(0.1,0.1,0,0,0,0,0,0,0,0),  # 设置分裂
)
plt.title('省销量占比情况')

plt.show()

 3.  单个圆环图

df = pd.read_excel('./data/plot.xlsx', sheet_name='pie1')

lables = df['省份']
sizes = df['销量']
plt.figure(figsize=(5,3),dpi=300)
plt.pie(
    x=sizes,
    labels=lables,  # 分类标签
    autopct='%.2f%%',  # 百分比
    textprops={'fontsize':5},
    wedgeprops={'width':0.4,'edgecolor':'w'},  # width:圆环宽度,edgecolor:边框颜色
    pctdistance=0.8     # 数据标签距离圆心的位置,0-1
)
plt.title('省销量占比情况')

plt.show()

4.  多个圆环图

df1 = pd.read_excel('./data/plot.xlsx', sheet_name='pie1')
df2 = pd.read_excel('./data/plot.xlsx', sheet_name='pie2')

df1

 

df2

 

x1 = df1['销量']   # 外圆环
x2 = df2['销量']   # 内圆环
plt.figure(figsize=(5,3),dpi=300)

# 外圆环
# 外圆的宽度 + 内圆的宽度 < 1
plt.pie(
    x1,
    autopct='%.1f%%',
    textprops={'fontsize':4},
    wedgeprops={'width':0.3,'edgecolor':'w'},  # width:圆环宽度,edgecolor:边框颜色
    pctdistance=0.85,     # 数据标签距离圆心的位置,0-1
    labels = df1['省份']
)

# 内圆环
plt.pie(
    x2,
    autopct='%.1f%%',
    radius=0.7,  # 半径,默认是
    textprops={'fontsize':4},
    wedgeprops={'width':0.3,'edgecolor':'w'},  # width:圆环宽度,edgecolor:边框颜色
    pctdistance=0.75     # 数据标签距离圆心的位置,0-1
)

plt.title('2021年1月与2月各省销售占比',fontsize=6)

# 添加图例
plt.legend(df1['省份'],fontsize=3)

plt.show()

七、散点图

import pandas as pd
import matplotlib.pyplot as plt

%matplotlib inline
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
%config Inlinebackend.figure_format = 'svg'

1.  简单散点图

x = range(1, 7, 1)
y1 = range(10, 70, 10)
y2 = range(15, 75, 10)
plt.scatter(x, y1, marker='*')
plt.scatter(x, y2, marker='+')
plt.show()

 2.  绘制散点图

df = pd.read_excel('./data/plot.xlsx', sheet_name='scatter')
df

x,y = df['广告费用'],df['销售收入']
plt.figure(figsize=(5,3),dpi=300)
plt.scatter(x,y)
plt.title('广告费用与销售收入的相关性')
plt.xlabel('广告费用')
plt.ylabel('销售收入')
# 相关系数
text = '相关系数:' + str(round(df['广告费用'].corr(df['销售收入']),2))
plt.text(x=5000,y=90000,s=text)

plt.show()

八、面积图

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

%matplotlib inline
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
%config Inlinebackend.figure_format = 'svg'

 1.  简单面积图

x = [1, 2, 3, 4, 5]
# 随机生成5个[10,100)的整数
y = np.random.randint(10, 100, 5)
plt.stackplot(x, y)
plt.show()

 2.  普通面积图

df = pd.read_excel('./data/plot.xlsx', sheet_name='stackplot1')
df

x,y = df['年份'],df['销售额']
plt.figure(figsize=(5,3),dpi=200)
plt.title('2014-2020年销售额趋势')
plt.stackplot(x,y)
# 去掉x轴刻度标签
plt.xticks([])


# 设置x轴的表格
# plt.table(
#     cellText=None,
#     cellColours=None,
#     cellLoc='right',
#     colWidths=None,
#     rowLabels=None,
#     rowColours=None,
#     rowLoc='left',
#     colLabels=None,
#     colColours=None,
#     colLoc='center',
#     loc='bottom',
#     bbox=None,
#     edges='closed',
#     **kwargs,
# )
plt.table(
    cellText= df[['销售额']].T.values.tolist(),  # 单元格内容,需要二维数据
    rowLabels= ['销售额'],   # 行标签 
    colLabels= df['年份'].values.tolist()  # 列标签
)

plt.show()

 

3.  堆积面积图

df = pd.read_excel('./data/plot.xlsx', sheet_name='stackplot2')
df

x,y1,y2,y3 = df['年份'],df['北区'],df['中区'],df['南区']
plt.figure(figsize=(5,3),dpi=200)
plt.title('2014-2020年销售额趋势')
plt.stackplot(x,y1,y2,y3)
# 去掉x轴刻度标签
plt.xticks([])
# 设置x轴的表格
# apply:单列字符串格式化
# applymap:多列字符串格式化
# map:字典映射
plt.table(
    cellText= df[['北区','中区','南区']].applymap(lambda x: '{:.1f}万'.format(x/10000)).T.values.tolist(),  # 单元格内容,需要二维数据
    rowLabels= ['北区','中区','南区'],   # 行标签 ,一维
    colLabels= df['年份'].values.tolist()  # 列标签,一维
)

plt.legend(['北区','中区','南区'],fontsize=8,loc='upper left')

plt.show()

九、热力图

import pandas as pd
import matplotlib.pyplot as plt

%matplotlib inline
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
%config Inlinebackend.figure_format = 'svg'

1.  简单热力图

  • 数据格式:列表内嵌列表
x = [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]    # 二维
plt.imshow(x)
plt.show()

 

2.  绘制热力图

df = pd.read_excel('./data/plot.xlsx', sheet_name='imshow')
df

# x轴刻度标签,产品
x = df.drop(labels='省份',axis=1).columns    # 注意不要在原表修改
# y轴刻度标签,省份
y = df['省份']
# 热力图数据,多行多列
data = df.drop(labels='省份',axis=1).values

# 建立画布
plt.figure(figsize=(5,8),dpi=200)
# 插入数据
plt.imshow(data,cmap='Blues')   # cmap:color map,颜色映射(视觉映射)
#  添加标签
for i in range(len(x)):
    for j in range(len(y)):
        plt.text(x=i,y=j,s=data[j,i],va='center',ha='center')
# 设置x轴刻度标签
plt.xticks(ticks=range(len(x)),labels=x)
# 设置y轴刻度标签
plt.yticks(ticks=range(len(y)),labels=y)
# 添加标题
plt.title('各省各产品销量热力图')
# 添加颜色条
plt.colorbar()
# 展示
plt.show()

3.  使用 seaborn 画热力图 

import seaborn as sns

# 设置索引
tb = df.set_index('省份')
plt.figure(dpi=200)
# cmap:color map 颜色映射
# annot:注释,数据标签
# fmt:format,数据显示格式
# d:digit,整型
# .1f:浮点型
sns.heatmap(tb,cmap='Greens',annot=True,fmt='d')
plt.show()

十、箱线图

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

%matplotlib inline
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
%config Inlinebackend.figure_format = 'svg'

1.  简单箱线图

x = [1, 2, 3, 5, 7, 9]
plt.boxplot(x)
plt.show()

2.  多组箱线图

# 随机生成100个[10,100)的整数
x1 = np.random.randint(10, 100, 100)
x2 = np.random.randint(10, 100, 100)
x3 = np.random.randint(10, 100, 100)
plt.boxplot([x1, x2, x3])
plt.show()

3.  绘制箱线图

  • 数据格式:列表内嵌列表
  • 检测异常值
df = pd.read_excel('./data/plot.xlsx', sheet_name='boxplot')
df.head()

labels = df['区域'].unique()
data = [df[df['区域']==i]['房价'].tolist() for i in labels]
# 建立画布
plt.figure(figsize=(5,3),dpi=200)
plt.boxplot(
    x=data,
    labels=labels,
    whis=1.5,   # 基于几倍的四分位距(IQR)来检测异常值
    # 异常值的标记格式
    flierprops={'markerfacecolor':'red', # 标记的背景颜色
                'markeredgecolor':'red', # 标记的边框颜色
                'markersize':4} # 标记的形状大小
)

# 展示
plt.show()

  • 筛选异常值
Q1 = df['房价'].quantile(0.25)
Q3 = df['房价'].quantile(0.75)
IQR = Q3 - Q1
upper = min(Q3+1*IQR, df['房价'].max())
lower = max(Q1-1*IQR, df['房价'].min())

df[(df['房价'] > upper) | (df['房价'] < lower)]

 

# pandas实现箱线图
df.boxplot(column='房价',by='区域')

十一、雷达图

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

%matplotlib inline
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
%config Inlinebackend.figure_format = 'svg'

df = pd.read_excel('./data/plot.xlsx', sheet_name='polar')
df.head()

 1.  准备数据

# 求男女各科平均值
male = df[df['性别']=='男'].mean().round(1)
female = df[df['性别']=='女'].mean().round(1)
labels = df.drop(columns=['学号','性别']).columns

2.  生成雷达图的角度

# linspace 生成等差数组
# 6个科目6个角度值,180 = 
angles = np.linspace(0,2*np.pi,6,endpoint=False)
angles


# array([0.        , 1.04719755, 2.0943951 , 3.14159265, 4.1887902 , 5.23598776])

3.  首尾相连形成闭合的多边形

male = np.concatenate((male,[male[0]]))
female = np.concatenate((female,[female[0]]))
angles = np.concatenate((angles,[angles[0]]))

4.  绘制雷达图

# 建立画布
plt.figure(dpi=200)
# 画图
plt.polar(angles,male,'blue',label='男')
plt.polar(angles,female,'green',label='女')
# 设置数据标签
plt.thetagrids(angles=range(0,360,60),labels=labels)
plt.ylim(0,100)
plt.legend(fontsize=6)
# 展示
plt.show()

十二、多子图

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

%matplotlib inline
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
%config Inlinebackend.figure_format = 'svg'

1.  subplot函数

# # subplot(
#     nrows,  # 几行
#     ncols,  # 几列
#     index,  # 从1开始索引,第几个图
#     **kwargs)
# 画第一个图
plt.subplot(2,2,1)
plt.title('A')
# 画第二个图
plt.subplot(2,2,2)
plt.title('B')
# 画第三个图
plt.subplot(2,2,3)
plt.title('C')
# 画第四个图
plt.subplot(2,2,4)
plt.title('D')
# 展示
plt.show()

2.  绘制多子图

  • 第1个子图-折线图
  • 第2个子图-饼图
  • 第3个子图-柱形图
df = pd.read_excel('./data/plot.xlsx', sheet_name='subplot')
df.head()

# 设置画布
plt.figure(figsize=(5,8),dpi=200)

# 画第一个子图——折线图
plt.subplot(3,1,1)
# 提取月份
df['月份'] = df['订单日期'].dt.month
# 按月份分组聚合
df1 = df.groupby('月份').agg({'销售额':'sum'}).reset_index()
# 画图
plt.plot(df1['月份'],df1['销售额'],label='销售额')
plt.title('各月的销售额趋势')
plt.xlabel('月份')
# 设置x轴刻度
plt.xticks(range(len(df1['月份'])+1))
# 设置y轴刻度范围
plt.ylim(0,max(df1['销售额'])+50000)
# 设置紧凑布局,避免重叠
plt.tight_layout()

# 画第二个子图——饼图
plt.subplot(3,1,2)
df2 = df.groupby('产品类别').agg({'销售额':'sum'}).reset_index()
plt.title('各产品销售额占比')
plt.pie(x=df2['销售额'],labels=df2['产品类别'],autopct='%.2f%%',wedgeprops={'edgecolor':'white'})
# 设置紧凑布局,避免重叠
plt.tight_layout()

# 画第三个子图——柱形图
plt.subplot(3,1,3)
df3 = df.groupby('地区').agg({'销售额':'sum'}).reset_index()
plt.bar(x=df3['地区'],height=df3['销售额'])
plt.title('各区的销售额对比')
for x,y in zip(df3['地区'],df3['销售额']):
    plt.text(x=x,y=y,s='{:.1f}万'.format(y/10000),ha='center')
# 设置紧凑布局,避免重叠
plt.tight_layout()

# 展示
plt.show()

 

;