设置子图布局subplot2grid / 嵌套图

这篇博客介绍了如何使用matplotlib库在Python中创建子图和嵌套图。通过subplot2grid和add_axes方法展示了不同布局的图形创建,包括3x3网格中的子图以及自定义大小和位置的嵌套图。此外,还演示了inset_axes函数的用法,用于在主图中插入小图,例如在条形图中添加饼图。这些例子对于理解和构建复杂的可视化布局非常有用。

本章节是代码笔记

子图布局

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

ax1 = plt.subplot2grid((3,3),(0,0)) # 3*3的矩阵,在(00)位置
ax2 = plt.subplot2grid((3,3),(1,0))
ax3 = plt.subplot2grid((3,3),(0,2),rowspan=3) #占3行
ax4 = plt.subplot2grid((3,3),(2,0),colspan = 2) # 占2列
ax5 = plt.subplot2grid((3,3),(0,1),rowspan=2)

输出结果图:

在这里插入图片描述
嵌套图 fig.add_axes() :

x = np.linspace(0,10,1000)
y1 = x**2
y2 = np.sin(x**2)

fig,ax1 = plt.subplots() # s 不能缺少
left,bottom,width,height = [0.22,0.45,0.3,0.35] #设置大小
ax2 = fig.add_axes([left,bottom,width,height])#在ax1中嵌入ax2
ax1.plot(x,y1)
ax2.plot(x,y2)

输出结果图:在这里插入图片描述
还有一种写法 inset_axes()-需要导入这个模块:

from mpl_toolkits.axes_grid1.inset_locator import inset_axes

#导入数据:
top10_arrivals_countries = ['CANADA','MEXICO','UNITED\nKINGDOM',\
                            'JAPAN','CHINA','GERMANY','SOUTH\nKOREA',\
                            'FRANCE','BRAZIL','AUSTRALIA']
top10_arrivals_values = [16.625687, 15.378026, 3.934508, 2.999718,\
                         2.618737, 1.769498, 1.628563, 1.419409,\
                         1.393710, 1.136974]
arrivals_countries = ['WESTERN\nEUROPE','ASIA','SOUTH\nAMERICA',\
                      'OCEANIA','CARIBBEAN','MIDDLE\nEAST',\
                      'CENTRAL\nAMERICA','EASTERN\nEUROPE','AFRICA']
arrivals_percent = [36.9,30.4,13.8,4.4,4.0,3.6,2.9,2.6,1.5]

fig,ax1 = plt.subplots(figsize=(20,12))
data = ax1.bar(range(10),top10_arrivals_values,color='blue')
plt.xticks(range(10),top10_arrivals_countries,fontsize=18)
explode = (0.08, 0.08, 0.05, 0.05,0.05,0.05,0.05,0.05,0.05)
ax2 = inset_axes(ax1,width = 6,height = 6,loc = 5)
ax2.pie(arrivals_percent,labels = arrivals_countries,autopct='%1.1f%%',explode=explode)
for text in texts+autotexts:
    text.set_fontsize(16)
for spine in ax1.spines.values():
    spine.set_visible(False)

输出结果图:
在这里插入图片描述

1234以优化完成,请继续优化函数5 %% ========== 函数 5: visualizeMultiChannel ========== function visualizeMultiChannel(allData, titles, ylabels, validIndex) % 绘制四通道纵向图(修正版:避免嵌套函数导致的参数错误) %position[],用于设置图形窗口的位置,像素大小 %...是matlab中的续行符,表示当前命令继续延升到下一行 %name''则是设置图的名字,color则是设置背景颜色 figure('Position', [100, 100, 800, 900], ... 'Name', '四通道数据可视化', 'Color', 'w'); for i = 1:4 % 固定四个图位置 subplot(4, 1, i); %ismember的返回值是逻辑真假,用于判断i是否在vlidInex中 if ~ismember(i, validIndex) || isempty(allData{i}) %0.5,0.5是位置,后面是文本位置尺寸颜色等设置 text(0.5, 0.5, '无数据', 'HorizontalAlignment', 'center', ... 'VerticalAlignment', 'middle', 'FontSize', 12, 'Color', 'r'); title(titles{i}); xlabel('时间/索引'); ylabel(ylabels{i}); %box开启坐标轴的边框显示 box on; %grid坐标轴的网格线显示 grid on; %continue用于跳出本次循环,然后往后走 continue; end data = allData{i}; % 特殊处理第二个文件:WDP → 散点图 if i == 2 %先判断了data的列数是否大于2 if size(data, 2) >= 2 x = data(:, 1); y = data(:, 2); %scatter用于绘制散点图,并设置大小颜色空心/实心透明度 scatter(x, y, 4, 'b', 'filled', 'MarkerFaceAlpha', 0.4); xlabel('时间'); else y = data(:); scatter(1:length(y), y, 4, 'b', 'filled', 'MarkerFaceAlpha', 0.4); xlabel('索引'); end ylabel(ylabels{i}); title(titles{i}); grid on; box on; else % 其他文件用折线图 if size(data, 2) == 1 %plot绘制折线图,并设置颜色宽度 plot(data, 'b-', 'LineWidth', 1.2); xlabel('时间/索引'); elseif size(data, 2) >= 2 x = data(:, 1); y = data(:, 2); plot(x, y, 'b-', 'LineWidth', 1.2); xlabel('时间'); else plot(data, 'b-', 'LineWidth', 1.2); xlabel('索引'); end ylabel(ylabels{i}); title(titles{i}); grid on; box on; end end %sgtitle为所有图的整个图像窗口加总标题,内容尺寸加粗 sgtitle('【焊接过程多源数据可视化】', 'FontSize', 14, 'FontWeight', 'bold'); %drawnow刷新命令,立即更新图形窗口,强制matlab处理所有待处理的绘图操作和事件 drawnow; end
最新发布
10-17
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值