数据可视化——子图的绘制及坐标轴共享

article/2025/9/22 11:11:24

一、绘制固定区域的子图

matplotlib可以将整个画布规划成等分布的m*n(行 x 列)的矩阵区域,并对每个区域进行编号。

1.1、绘制单子图
使用pyplot()函数的subplot()可以在规划好的某个区域中绘制单个子图。
语法格式如下:

subplot(nrowos,ncols,index,projection,polar,sharex,sharey,label,**kwargs)

该函数的常用参数含义如下:

  • nrows:表示规划区域的行数
  • ncols:表示规划区域的列数
  • index:表示选择区域的索引,默认从1开始编号
  • projection:表示子图的投影类型,可以为None、‘aitoff’、‘hanmmer’、‘lambert’、‘mollweide’,‘prolar’、‘rectiliinear’中任取一值。
  • polar:表示是否使用极坐标,默认值为False
  • sharex,sharey:表示是否共享子图的x轴或y轴

subplot()函数会返回一个Axes类的子类SubplotBase对象

需要说明的是,Figure类对象可以使用add_subplot()方法绘制单子图,此方法与subplot()函数的作用是等价的

例如,将画布规划成32的矩阵区域,并在索引为6的区域中绘制子图。再将画布规划成31的矩阵区域
代码如下:

import matplotlib.pyplot as plt
ax_one=plt.subplot(326)
ax_one.plot([1,2,3,4,5])
ax_two=plt.subplot(312)
ax_two.plot([1,2,3,4,5])
plt.title("39")
plt.show()

运行结果如下:
在这里插入图片描述

Jupyter Notebook的绘图模式
当Jupyter Notebook工具运行程序时,默认会以静态图片的形式显示运行结果。此时的图片不支持放大或缩小等交互操作。
Jupyter Notebook支持两种绘制模式。
1、控制台绘图
2、弹出窗绘制

1.2、实例:

import numpy as np 
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
x=[x for x in range(1,13)]
y1=[20,28,23,16,29,36,39,33,31,19,21,25]
y2=[17,22,39,26,35,23,25,27,29,38,28,20]
labels=['1月','2月','3月','4月','5月','6月','7月','8月','9月','10月','11月','12月']
ax1=plt.subplot(211)
ax1.plot(x,y1,'m--o',lw=2,ms=5,label='产品A')
ax1.plot(x,y2,'g--o',lw=2,ms=5,label='产品B')
ax1.set_title("产品A与产品B的销售额趋势 39",fontsize=11)
ax1.set_ylim(10,45)
ax1.set_ylabel('销售额(亿元)')
ax1.set_xlabel('月份')
for xy1 in zip(x,y1):ax1.annotate("%s"% xy1[1],xy=xy1,xytext=(-5,5),textcoords='offset points')
for xy2 in zip(x,y2):ax1.annotate("%s"% xy2[1],xy=xy2,xytext=(-5,5),textcoords='offset points')
ax1.legend()
ax2=plt.subplot(223)
ax2.pie(y1,radius=1,wedgeprops={'width':0.5},labels=labels,autopct='%3.lf%%',pctdistance=0.75)
ax2.set_title('产品A的销售额 39')
ax3=plt.subplot(224)
ax3.pie(y2,radius=1,wedgeprops={'width':0.5},labels=labels,autopct='%3.lf%%',pctdistance=0.75)
ax3.set_title('产品B的销售额 39')
plt.tight_layout()
plt.show()

运行结果:
整个窗口同时显示了3个图表
在这里插入图片描述
1.3、绘制多子图
使用pyplot的subplots()函数可以在规划好的所有区域中一次绘制多个子图。
语法格式如下:

subplots(nrowos=1,ncols=1,sharex=False,sharey=False,squeeze=True,subplot_kw=None,
gridspec_kw=None,**fig_kw

常用的参数的含义如下:

  • nrows:表示规划区域的行数,默认为1。
  • ncols:表示规划区域的列数,默认为1。
  • sharex,sharey:表示是否共享子图的x轴或y轴。
  • squeeze:表示是否返回压缩的Axes对象的数组,默认为True。
  • gridspec_kw:表示用于控制区域结构属性的字典。

subplots()函数会返回一个包含两个元素的元组,其中元组的第一个元素为Figure对象,第二个元素为Axes对象或Axse对象数组。

import matplotlib.pyplot as plt
fig,ax_arr=plt.subplots(2,2)
ax_thr=ax_arr[0,1]
ax_thr.plot([1,2,3,4,5])
plt.title("39")
plt.show()

运行代码,效果如下:
在这里插入图片描述
1.4、实例2
将整个画布规划成1x 2的矩阵区域
代码如下:

import numpy as np 
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
def autolabel(ax,rects):for rect in rects:width= rect.get_width()ax.text(width+3,rect.get_y(),s='{}'.format(width),ha='center',va='bottom')
y=np.arange(12)
x1=np.array([20,28,23,16,57,36,39,33,6,19,21,25])   
x2=np.array([17,22,39,15,35,23,25,11,29,38,28,50])
labels=np.array(['中国','加拿大','巴西','澳大利亚','日本','墨西哥','俄罗斯','韩国','瑞士','土耳其','英国','美国'])
fig,(ax1,ax2)=plt.subplots(1,2)
barh1_rects=ax1.barh(y,x1,height=0.5,tick_label=labels,color='#FFA500')
ax1.set_label('人群比例(%)')
ax1.set_title('部分国家养cat人群的比例 39')
ax1.set_xlim(0,x1.max()+10)
autolabel(ax1,barh1_rects)barh2_rects=ax2.barh(y,x2,height=0.5,tick_label=labels,color='#20B2AA')
ax2.set_label('人群比例(%)')
ax2.set_title('部分国家羊狗人群的比例 39')
ax2.set_xlim(0,x1.max()+10)
autolabel(ax2,barh2_rects)
plt.tight_layout()
plt.show()

运行代码效果如下:
在这里插入图片描述

二、绘制自定义区域的子图

2.1、绘制单子图
使用pyplot的subplot2grid()函数可以将整个画布规划成非等分布局的区域,并在可选的某个区域中绘制单个子图,语法格式如下:

subplot2grid(shape,loc,rowspan,colspan=1,fig=None,**kwargs)

该函数常用参数的含义如下:

  • shape:表示规划的区域结构,它是一个包含两个整数的元组,其中第一个元素表示规划区域的行数,第2个元素表示规划区域的列数。
  • loc:表示选择区域的位置,它是包含两个整型数据的元组。
  • rowspan:表示向下跨越的行数,默认为1。
  • colspan:表示向右跨越的列数,默认为1。
  • fig:表示放置子图的画布,默认为当前画布。

列如,将画布规划成3x 2的矩阵区域,并在0行第2列的区域中绘制子图。

import matplotlib.pyplot as plt
ax1=plt.subplot2grid((2,3),(0,2))
ax1.plot([1,2,3,4,5])
ax2=plt.subplot2grid((2,3),(1,0),colspan=2)
ax2.plot([1,2,3,4,5])
plt.title("39")
plt.show()

代码运行,效果如下:
在这里插入图片描述
2.2、实例
使用3个子图进行展示

import numpy as up
import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"] = ["SimHei"]
data_2017 = np.array([21,35,22,19,3])
data_2018 = np.array([13,32,27,27,1])
x = np.arange(5)
y = np.array([51,73,99,132,45])
labels = np.array(['一线城市','二线城市','三线城市','四线及以外','其他国家及地区'])
average = 75
bar_width = 0.5
def autolabel(ax,rects):for rect in rects:height = rect.get_height()ax.text(rect.get_x()+bar_width/2,height + 3,s = '{}'.format(height),ha = 'center',va = 'bottom')
ax_one = plt.subplot2grid((3,2),(0,0),rowspan=2,colspan=2)
bar_rects = ax_one.bar(x,y,tick_label=labels,color='#20B2AA',width=bar_width)
ax_one.set_title('抖音2018vs2017人群增长倍速 39')
ax_one.set_ylabel('增长倍速')
autolabel(ax_one,bar_rects)
ax_one.set_ylim(0,y.max()+20)
ax_one.axhline(y=75,linestyle='--',linewidth=1,color='gray')
ax_two = plt.subplot2grid((3,2),(2,0))
ax_two.pie(data_2017,radius = 1.5,labels = labels,autopct = '%3.1f%%',colors=['#2F4F4F','#FF0000','#A9A9A9','#FFD700','#B0C4DE'])
ax_thr.set_title('2017年抖音用户地区分布的比例')
plt.title("39")
ax_two = plt.subplot2grid((3,2),(2,1))
ax_two.pie(data_2018,radius = 1.5,labels = labels,autopct = '%3.1f%%',colors=['#2F4F4F','#FF0000','#A9A9A9','#FFD700','#B0C4DE'])
ax_thr.set_title('2018年抖音用户地区分布的比例')
plt.title("39")
plt.tight_layout()
plt.show

代码运行,效果:
在这里插入图片描述

三、共享子图的坐标轴

3.1、共享相邻子图的坐标轴当pyplot()函数绘制子图时,可以通过sharex或sharey参数控制是否享受x轴或y轴。

  • True或‘all’:表示所有子图之间共享x轴或y轴。
  • False或‘none’:表示所有子图之间不共享x轴或y轴。
  • ‘row’:表示每一行的子图之间共享x轴或y轴。
  • ‘col’:表示每一列的子图之间共享x轴或y轴。

例如,将画布规划成2 x 2的矩阵区域,在每一列子图之间共享x轴。示例代码如下:

import numpy as np 
import matplotlib.pyplot as plt
plt.rcParams['axes.unicode_minus']=False
x1=np.linspace(0,2*np.pi,400)
x2=np.linspace(0.01,10,100)
x3=np.random.rand(10)
x4=np.arange(0,6,0.5)
y1=np.cos(x1**2)
y2=np.sin(x2)
y3=np.linspace(0,3,10)
y4=np.power(x4,3)
fig,ax_arr=plt.subplots(2,2,sharex='col')
ax1=ax_arr[0,0]
ax1.plot(x1,y1)
ax2=ax_arr[0,1]
ax2.plot(x2,y2)
ax3=ax_arr[1,0]
ax3.scatter(x3,y3)
ax4=ax_arr[1,1]
ax4.scatter(x4,y4)
plt.title("39")
plt.show()

运行结果效果如下:
在这里插入图片描述
3.2、共享非相邻子图的坐标轴
当pyplot使用subplot()函数绘制子图时,也可以将代表其他子图的变量赋值给sharex或sharey参数,此时可以共享非相邻子图之间的坐标轴。

x1=np.linspace(0,2*np.pi,400)
y1=np.cos(x1**2)
x2=np.linspace(0.01,10,100)
y2=np.sin(x2)
ax_one=plt.subplot(221)
ax_one.plot(x1,y1)
ax_two=plt.subplot(224,sharex=ax_one)
ax_two.plot(x2,y2)
plt.title("39")
plt.show()

代码运行效果如下:
在这里插入图片描述
3.3、实例

import numpy as np 
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams["axes.unicode_minus"]=False
month_x=np.arange(1,13,1)
data_tem=np.array([2.0,2.2,3.3,4.5,6.3,10.2,20.3,33.4,23.0,16.5,12.0,6.2])
data_precipitation=np.array([2.6,5.9,9.0,26.4,28.7,70.7,175.6,182.2,48.7,18.8,6.0,2.3])
data_evaporation=np.array([2.0,4.9,7.0,23.2,25.6,76.7,135.6,162.2,32.6,20.0,6.4,3.3])
fig,ax=plt.subplots()
bar_ev=ax.bar(month_x,data_precipitation,color='pink')
bar_pre=ax.bar(month_x,data_precipitation,bottom=data_evaporation,color='green')
ax.set_ylabel('水量(ml)')
ax.set_title('平均气温与降水量、蒸发量的关系 39')
ax_right=ax.twinx()
line=ax_right.plot(month_x,data_tem,'o-m')
ax_right.set_ylabel('气温($^\circ$C)')
plt.legend([bar_ev,bar_pre,line[0]],['蒸发量','降水量','平均气温'],shadow=True,fancybox=True)plt.show()

代码运行效果如下:
在这里插入图片描述

四、子图的布局

4.1、约束布局

import matplotlib.pyplot as plt
fig,axs=plt.subplots(2,2,constrained_layout=True)
ax_one=axs[0,0]
ax_one.set_title('Title 39')
ax_two=axs[0,1]
ax_two.set_title('Title 39')
ax_thr=axs[1,0]
ax_thr.set_title('Title 39')
ax_fou=axs[1,1]
ax_fou.set_title('Title 39')
plt.show()

代码运行效果如下:
在这里插入图片描述

4.2、紧密布局

import matplotlib.pyplot as plt
fig, axs=plt.subplots(2,2)
ax_one=axs[0,0]
ax_one.set_title('Title 39')
ax_two=axs[0,1]
ax_two.set_title('Title 39')
ax_thr=axs[1,0]
ax_thr.set_title('Title 39')
ax_fou=axs[1,1]
ax_fou.set_title('Title 39')
plt.tight_layout(pad=0.4,w_pad=0.5,h_pad=2)
plt.show()

代码运行效果:
在这里插入图片描述
4.3、自定义布局

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
fig2=plt.figure()
spec2=gridspec.GridSpec(ncols=2,nrows=2,figure=fig2)
f2_ax1=fig2.add_subplot(spec2[0,0])
f2_ax2=fig2.add_subplot(spec2[0,1])
f2_ax3=fig2.add_subplot(spec2[1,0])
f2_ax4=fig2.add_subplot(spec2[1,1])
plt.title("39")
plt.show()

代码运行效果:
在这里插入图片描述
(2)

fig3=plt.figure()
gs=fig3.add_gridspec(3,3)
f3_ax1=fig3.add_subplot(gs[0,:])
f3_ax1.set_title('gs[0,:] 39')
f3_ax2=fig3.add_subplot(gs[1,:-1])
f3_ax2.set_title('gs[1,:-1 ]')
f3_ax3=fig3.add_subplot(gs[1:,-1])
f3_ax3.set_title('gs[1:,-1]')
f3_ax4=fig3.add_subplot(gs[-1,0])
f3_ax4.set_title('gs[-1,0]')
f3_ax5=fig3.add_subplot(gs[-1,-2])
f3_ax5.set_title('gs[-1,-2]')

代码运行效果:
在这里插入图片描述
4.4、实例

import numpy as np 
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
plt.rcParams["font.sans-serif"]=["SimHei"]
x_month=np.array(['1月','2月','3月','4月','5月','6月'])
y_sales=np.array([2150,1050,1560,1480,1530,1490])
x_citys=np.array(['北京','上海','广州','深圳','浙江','山东'])
y_sale_count=np.array([83775,62860,59176,64205,48671,39968])
fig=plt.figure(constrained_layout=True)
gs=fig.add_gridspec(2,2)
ax_one=fig.add_subplot(gs[0,:])
ax_two=fig.add_subplot(gs[1,0])
ax_thr=fig.add_subplot(gs[1,1])
ax_one.bar(x_month,y_sales,width=0.5,color='#3299CC')
ax_one.set_title(' 2018年上半年某品牌汽车销售额 39')
ax_one.set_ylabel('销售额(亿元)')
ax_two.plot(x_citys,y_sale_count,'m--o',ms=8)
ax_two.set_title(' 分公司某品牌汽车的销量 39')
ax_two.set_ylabel('销量(辆)')
ax_thr.stackplot(x_citys,y_sale_count,color='#9999EF')
ax_thr.set_title(' 分公司某品牌汽车的销量 39')
ax_thr.set_ylabel('销量(辆)')
plt.show()

运行效果:
在这里插入图片描述


http://chatgpt.dhexx.cn/article/dPeSbQ7X.shtml

相关文章

子图

前言 子图是指说绘制的图形是有多个图形组成的,通过子图能否进行数据的不同比较。其主要是通过subplot方法实现的。 其中有规范划分和不规则划分。 subplot(numRows, numCols, plotNum) numRows:子图总行数 numCols:子图总列数 plotNum:子图编号(从左到右&#xf…

Matplotlib(二)—— 子图

Python模块 —— Matplotlib Matplotlib(二)—— 子图四、子图4.1 均匀子图4.1.1 plt.subplots4.1.2 plt.subplot 4.2 非均匀子图4.2.1 fig.add_gridspec 4.3 子图上的方法4.4 墨尔本温度数据集4.5 画出数据的散点图和边际分布图 Matplotlib(…

物联网和海计算有什么关系,主要具有哪些优点?

物联网和海计算 海计算通过在物理世界的物体中融入计算与通信设备以及智能算法,让物物之间能够互连,在事先无法预知的场景中进行判断,实现物物之间的交互作用。海计算一方面通过强化融入在各物体中的信息装置,实现物体与信息装置…

再谈智能

1. 智能的产生 1.1 智能生成机理 有关智能生成的机理,一直是许多领域关注的焦点问题,涉及面之广、深很是少见,初步梳理可能会与这样几个最基本的问题有关:认知生成的机理、知识生成的机理、意义生成的机理、情感生成的机理、…

神码ai人工智能写作机器人_神经符号AI为我们提供具有真正常识的机器

神码ai人工智能写作机器人 By Katia Moskvitch 卡蒂亚莫斯科维奇(Katia Moskvitch) “那只狗躲在床底下。 再次。” (“The dog hid under the bed. Again.”) At any other time, IBM computer scientist Danny Gutfreund, then at IBM’s Haifa lab in Israel, would’ve pr…

关于人机智能的一点思考

0.小序 人智的“是”离不开非(不是),机智的“是”离开了非(不是)。真正的自主不是自己去决定什么,而是在随机中应变,在变化的人机环境系统中动态而又恰当地决定什么。自主不是自己去决定&#x…

基于知识图谱的智能问答

基于知识图谱的相关应用大致可以分为搜索、问答、决策、推荐等几种常见的类别,对于知识图谱的理解,可以参考之前的文章《三个角度理解知识图谱》,本文主要就年初规划的xx智能问答建设方案,介绍一下基于知识图谱的智能问答&#xf…

Python相关的人工智能库

移动互联网取代PC互联网领跑在互联网时代的最前沿,Android和iOS一度成为移动互联网应用平台的两大霸主,成为移动开发者首选的两门技术,HTML5以其跨平台的优势在移动互联网应用平台占据重要位置,可以说是后来者居上。 由于技术的限…

基于知识图谱的智能问答方案

向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程 公众号:datayx 三个角度理解知识图谱 2012年谷歌首次提出“知识图谱”这个词,由此知识图谱在工业界也出现得越来越多,对于知识图谱以及相关概念的理解确实也是…

17届竞赛技术报告-越野组 | 山东大学(威海)-越野三队

学校:山东大学(威海) 队伍名称:越野三队 参赛队员:郑睿、茅陈昕、余海波 带队教师:王小利刘萍萍 01 引 言 第十七届全国大学生智能车竞赛将于2022年七至八月在全国各赛区有序展开,大赛旨在培养…

龙口数字化转型果丰叶绿!华为城市智能体成就县域智慧城市新标杆

9月正是沿海城市开海的日子。而与大小渔港同样热闹的还有2022华为龙口城市智能体与云产业大会现场;27家企业正在与新近建成的龙口&华为工业互联网创新中心合作签约,投资总额634.77亿元。而这样的繁忙恰巧代表了龙口未来发展的新方向、新动能。 “一体…

智能研究的另类思考

【摘 要】 本文从教育实践长期存在的诸多矛盾困扰中引发了对智能科学的好奇和探索热情。将系统科学、思维科学、大成智慧引入到教育和智能科学研究中来,从方法论的高度,以东方人特有的整体思维优势,用系统的眼光、整体视野对人类智能进行系统…

人工智能

这是土盐的第118篇原创文章 1 大家好,我是土盐。 刚瞄了几眼《AI 未来》,其中有句话,让我印象深刻:人生是由无数转折点组成的。 这里再次推荐李开复的一本《人工智能》,也许人工智能是您职业的转折点。 人工智能 李开复…

美国海军计算机工作站,美国海军用上了3D打印,工控机智能支持3D打印技术

原标题:美国海军用上了3D打印,工控机智能支持3D打印技术 3D打印作为一种新型的制造加工模式,最近几年得到了迅猛发展。技术的不断成熟与完善,以及可打印的材料进一步拓展,使得3D打印开始渗透到很多重要领域与行业。比如…

人机混合智能的视角:军事人工智能的沿革与发展

本文摘自《智能安全》2022.12 摘要:随着技术的快速发展,战争的形态也在不断变化,军事智能化的议题越来越重要。人类智能与机器智能的有效协同在战争中会扮演越来越重要的角色。本文梳理了美军发展演进的作战概念后,结合当前人工智能的特点和不…

关于海底光缆不为人知的“秘密”

海底光缆是互联网的“中枢神经”,承载了全球90%以上的国际语音和数据传输,没有它,互联网只是一个局域 世界海底光缆分布图 一直以来,它因埋藏于海底深处而披上神秘面纱,今天我们带你走进海底光缆的世界。海底光缆与陆地…

从零开始嵌入聊天机器人服务(小白适用)

文章目录 一、为什么需要聊天机器人二、那么在哪里才能搞得到三、我搞到了,该怎么用(一)青云客(初学者强推)(二)图灵机器人(三)海知智能机器人 四、使用总结 一、为什么需…

知识图谱升温之势已现,不要错失下一个AI风口

近年来,随着大家对高级认知能力的积极探索,知识图谱因为表达能力强,扩展性好,并能兼顾人类认知与机器自动处理,引起了学术界、工业界以及政府部门的高度关注。 最先被大家熟知的应用领域应属搜索引擎,为了让…

项目实训日志一

项目实训日志一 项目开始已经有几天了,一直在读《Approximation Algorithm》这本书,由于大部分概念都比较陌生,读得很慢,目前主要把第3章的阅读翻译工作完成了。 本章中关键问题是斯坦纳树问题和TSP旅行商问题,在看这…

实习日志(5)

2021.08.02 星期一 学习vue也有一段时间时间了,回想一下学的都是一些概念,实际操作很少,所以今天我在网上重新又找了一个博主的视频讲解,看了一下之后,感觉他每次讲一个小内容的时候,都会有好几个小案例&am…