文章目录

一、子图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()

还可以这样创建图:一个子图占用多个位置,如下:

plt.figure(figsize=(18,4))

ax1 = plt.subplot(221)

ax2 = plt.subplot(2,2,3)

ax3 = plt.subplot(2,2,(2,4))

plt.show()

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()

3、共享x轴或y轴

共享y轴

fig,(ax1,ax2)=plt.subplots(1,2,sharey=True)

plt.show()

共享x轴

fig,(ax1,ax2)=plt.subplots(2,1,sharex=True)

plt.show()

共享刻度线 同时刻度都会显示

# 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()

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()

二、组合图

如果想要把柱状图和折线图同时展示在一张图中,可以使用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()

相关链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: