文章目录

  • 一、子图
  • 1、创建子图 plt.subplot() 或 fig.add_subplot()
  • 2、属性设置
  • 3、共享x轴或y轴
  • 4、例子
  • 二、组合图


  • 导包
import matplotlib.pyplot as plt 
import numpy as np
import pandas as pd
plt.rcParams['font.sans-serif'] =['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False

一、子图

1、创建子图 plt.subplot() 或 fig.add_subplot()

# 第一种
plt.subplot(nrows,ncols,index,  # nrows*ncols的画布,当前子图处于第index个 计数从左往右  
		  label,                # 标签
	      title,                # 标题
	      xlabel, ylabel        # x和y轴标签 
	      xlim, ylim            # x和y轴刻度范围
	      xticklabels, yticklabels # x和y轴刻度值  字符串格式输入 自动转化为列表 与xticks用法一致
	      xticks, yticks       # x和y轴的刻度值 列表格式输入
          )
# 第二种 
fig = plt.figure()
fig.add_sublpot(参数同上)	  

# 第三种
fig,((ax1,ax2),(ax3,ax4)) = plt.subplots(2,2) # 直接生成n*m的画布 同时ax需用元组将同一行的括起来 
# 第四种
fig,ax = plt.subplots(2,2)  # 这里ax相当于数组将四个子图包含在内
ax1 = ax[0,1] # 表示第1行第2列的图
  • 例子:
plt.figure(figsize=(18,4))
## 1、创建子图
ax1 = plt.subplot(1,3,1,ylim=(0,10),title='我是子图1')
ax2 = plt.subplot(1,3,2,xticks=[1,2,3,4,5])
ax3 = plt.subplot(1,3,3,yticklabels='一二三四五')
plt.show()


fig = plt.figure(figsize=(18,4))
ax1 = fig.add_subplot(1,3,1,ylim=(0,10),title='我是子图1')
ax2 = fig.add_subplot(1,3,2,xticks=[1,2,3,4,5])
ax3 = fig.add_subplot(1,3,3,yticklabels='一二三四五')
plt.show()

Python子图加背景色 python 子图_机器学习

  • 还可以这样创建图:一个子图占用多个位置,如下:
plt.figure(figsize=(18,4))
ax1 = plt.subplot(221)
ax2 = plt.subplot(2,2,3)
ax3 = plt.subplot(2,2,(2,4))
plt.show()

Python子图加背景色 python 子图_机器学习_02

2、属性设置

  • 多数命令都是在前面加ax.set_ 针对哪个子图就用哪个ax
子图标题 ax.set_title()
子图轴标签 ax.set_xlabel() ax.set_ylabel()
轴范围 (上限下限) ax.set_xlim() ax.set_ylim()
子图轴刻度 ax.set_xticks() ax.set_yticks()  ax.set_xticklabels() ax.set_yticklabels() 
子图四个边框 ax.spines[ ].set_color()
子图数据标签 ax.text()
子图带箭头的显示文本 ax.annotate()
修改子图间距离 fig.subplots_adjust(hspace|wspace) hspace垂直距离 ;wspace水平距离 

里面参数的取值与上篇博客基础图表的设置一样
  • 各属性展示例子
plt.figure(figsize=(10,5))
## 1、创建子图
ax1 = plt.subplot(121)
ax2 = plt.subplot(122)
## 2、子图标题 ax.title()
ax1.set_title('我是子图1')
ax2.set_title('我是子图2')
## 3、子图轴标签 plt.xlabel() plt.ylabel()
ax1.set_xlabel('我是x轴1')
ax2.set_ylabel('我是y轴2')
## 4、轴范围 (上限下限) plt.xlim() plt.ylim()
ax1.set_ylim(10,20)
## 5、子图轴刻度 plt.xticks() plt.yticks()
ax2.set_xticks(np.arange(1,6))
ax1.set_xticklabels('一二三四五')
## 7、子图四个边框 ax.spines[ ].set_color()
ax1.spines['top'].set_color(None)
ax2.spines['right'].set_color(None)
## 8、子图数据标签 plt.text()
ax2.text(1,0.5,'(2,0.5)',fontsize=20,color='blue')
## 9、子图带箭头的显示文本 plt.annotate()
ax1.annotate('hello',xytext=(0.3,16),xy=(0.5,15),fontsize=20,color='red')
plt.show()

Python子图加背景色 python 子图_子图_03

3、共享x轴或y轴

  • 共享y轴
fig,(ax1,ax2)=plt.subplots(1,2,sharey=True)
plt.show()

Python子图加背景色 python 子图_子图_04

  • 共享x轴
fig,(ax1,ax2)=plt.subplots(2,1,sharex=True)
plt.show()

Python子图加背景色 python 子图_子图_05

  • 共享刻度线 同时刻度都会显示
# 1和2共享y轴; 1和3共享x轴
fig = plt.figure(figsize=(10,4))
ax1 = fig.add_subplot(2,2,1) 
ax1.set_xlim(10,20)
ax1.set_ylim(100,200)
ax2 = fig.add_subplot(2,2,2,sharey=ax1)
ax3 = fig.add_subplot(2,2,3,sharex=ax2)

# 修改子图间距离
fig.subplots_adjust(hspace=0.5) 
fig.subplots_adjust(wspace=1) 
plt.show()

Python子图加背景色 python 子图_开发语言_06

4、例子

df_area = {'广东':21382,'上海':16031,'北京':15928,'江苏': 5561,'海南':5449,'四川':5445,'浙江':5370,'湖北':5355,'重庆':5342,'天津':5337,'湖南':5330}
df_sex = {'男': 77628,'女': 47235}
df_age = {'[20,30)':29596,'[30,40)':24451,'[40,50)':27308,'[10,20)':10917,'[50,60)':2724}

fig = plt.figure(figsize=(12,7),facecolor='Lavender')  # 设置画布大小和背景颜色

# 第一个子图:性别分布 
ax1 = fig.add_subplot(221)
patch,l_text,p_text = ax1.pie(df_sex.values(),labels=df_sex.keys(),colors=['b','r'],autopct='%.2f%%')
for i,j in zip(l_text,p_text):  # 设置标签文字大小 l_text外面的文字标签 p_text里面的百分数 
    i.set_size(15)
    j.set_size(15)
ax1.set_title('性别分布')  # 子图标题

# 第二个子图:年龄分布
ax2 = fig.add_subplot(222)
patch,l_text,p_text = ax2.pie(df_age.values(),labels=df_age.keys(),explode=(0,0,0,0,0.1),autopct='%.2f%%',colors=['skyblue','SpringGreen','DarkTurquoise','Gold','#FF4500'])
for i,j in zip(l_text,p_text): 
    i.set_size(12)
    j.set_size(12)
ax2.set_title('年龄分布')

# 第三个子图 :地区分布柱状图
ax3 = fig.add_subplot(212)  # 212将原来的2行2列图变为2行1列图 212 2行1列中的第二幅图
ax3.bar(df_area.keys(),df_area.values())

for i,j in enumerate(df_area.values()): # 标签位置与显示
    plt.text(i-0.3,j+40,j)
    
ax3.set_title('地区分布')
ax3.set_ylabel('人数(人)')
# 采用ggplot风格时,会显示网格线和灰色背景
# 不显示网格线  
#plt.grid(False)
# 子图的背景色透明
ax3.patch.set_alpha(0)

# 上和右边框不可见
ax3.spines['top'].set_visible(False)  
ax3.spines['right'].set_visible(False)
plt.show()

Python子图加背景色 python 子图_Python子图加背景色_07

二、组合图

  • 如果想要把柱状图和折线图同时展示在一张图中,可以使用ax2 = ax1.twinx()使用同一个x轴,而y轴分别位于图表的两侧。
month = ['2021-01', '2021-02', '2021-03', '2021-04', '2021-05', '2021-06',
          '2021-07', '2021-08', '2021-09', '2021-10', '2021-11', '2021-12']
count = [590,780,670,540,450,500,560,670,789,890,980,1200]
data = pd.DataFrame([month,count]).T
data.columns=['月份','销量']
data['月环比'] = round(data['销量'].pct_change()*100,2)
# 创建画布
fig = plt.figure(figsize=(10,4))
# 在画布中创建子图 这里(111)表示将画布划分为1行1列的子图,当前图为第一个子图 
ax1 = fig.add_subplot(111)
# 在当前子图中画柱状图
ax1.bar(data['月份'],data['销量'],color='skyblue') 
# 共用ax1图的x轴 在同一幅中
ax2 = ax1.twinx()
# 在当前子图中画折线图
ax2.plot(data['月份'],data['月环比'],color='red',marker='o')
ax2.set_ylim([-30,30])
for x,y in enumerate(data['月环比']):
    plt.text(x,y-4,'%.2f%%' % y,ha='center',fontsize=10)
plt.xticks(rotation=45)    
plt.show()

Python子图加背景色 python 子图_子图_08