matplotlib 的使用技巧(局部放大图坐标轴设置边框设置横纵比设置)

Posted ShuiFYC

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matplotlib 的使用技巧(局部放大图坐标轴设置边框设置横纵比设置)相关的知识,希望对你有一定的参考价值。

文章目录


前言

提示:Matplotlib 使用技巧
局部放大图
设置绘图横纵比
边框改变颜色、隐藏边框
翻转坐标轴、隐藏坐标轴、调整坐标轴显示范围


提示:以下是本篇文章正文内容,下面案例可供参考

使用步骤 提示:功能可相互独立,不必按此目录顺序执行

1.引入库

import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.inset_locator import mark_inset
from mpl_toolkits.axes_grid1.inset_locator import inset_axes

1.1 绘制初始图像

image = sitk.ReadImage('xxx.nii')  # <class 'SimpleITK.SimpleITK.Image'> 支持dcm\\nrrd\\nii
image_array = sitk.GetArrayFromImage(image)  # z,y,x shape z*512*512
fig, axes = plt.subplots()
axes.imshow(image_array[8,...], cmap='gray')

2.局部放大图(调整坐标轴显示范围、翻转坐标轴、隐藏坐标轴、边框改变颜色、隐藏边框)

2.1 绘制嵌入绘制局部放大图的坐标系

axins = inset_axes(axes, width="50%", height="50%",loc='upper right',
				   borderpad=0,
                   bbox_to_anchor=(0, 0, 1, 1),
                   bbox_transform=axes.transAxes)

inset_axes 参数说明
注意:bbox外的width height是对于bbox里的

axes:父坐标系
axins:子坐标系

width, height:子坐标系的宽度和高度(百分比形式或者浮点数个数)
	 浮点数:单位英寸
	 百分比:相对于axes的bbox的比例
	 
loc:子坐标系的位置
	'upper right' : 1,
	'upper left' : 2,
	'lower left' : 3,
	'lower right' : 4,
	'right' : 5,
	'center left' : 6,
	'center right' : 7,
	'lower center' : 8,
	'upper center' : 9,
	'center' : 10

borderpad: 在插图坐标空间与bbox_to_anchor之间填充
默认值是0.5 单位是axes的字体尺寸,默认字体尺寸是10points,所以borderpad=0.5等于填充5points
想要x0 y0 与原点对齐,则设置 borderpad=0

bbox_to_anchor:边界框,四元数组(x0, y0, width, height)
bbox_transform:从父坐标系到子坐标系的几何映射

固定坐标系的宽度和高度以及边界框,分别设置loc为左上、左下、右上(默认)、右下和中间,效果图如下:

上图为转载并进行修改:【Matplotlib】 局部放大图

2.2 在子坐标系中绘制原始数据

和父坐标系的画图一致

axins.imshow(image_array[z,:,:])

2.3 调整子坐标系的显示范围 ( 调整坐标轴显示范围)

# 调整子坐标系的显示范围
axins.set_xlim(200, 250)
axins.set_ylim(100, 150)

2.4 建立父坐标系与子坐标系的连接线

# 建立父坐标系与子坐标系的连接线
# loc1 loc2: 坐标系的四个角 1 (右上) 2 (左上) 3(左下) 4(右下)
# facecolor或fc - mpl color spec,默认为None,无颜色为'none'。内部颜色
# edgecolor或ec - mpl颜色规范,默认为None,无颜色为'none'。 外部颜色(可理解为边线)
# lw 线宽
mark_inset(axes, axins, loc1=2, loc2=4, fc="none", ec='r', lw=1)

2.5 父坐标系翻转y坐标轴,为了与子图显示方向一致 (翻转坐标轴)

#翻转y坐标轴
axes.invert_yaxis()

2.6 调整子坐标系边框 (边框颜色、边框隐藏)

# 4个边框 top、left、right、bottom
#设置所有边框颜色为红色
axins.spines[:].set_color('r')
#隐藏右上边框
axins.spines['right'].set_visible(False)
axins.spines['top'].set_visible(False)

2.7 子坐标系隐藏坐标轴(隐藏坐标轴)

注意:axins.set_axis_off()会影响轴线,刻度线,刻度标签,网格和轴标签

#去刻度线和标签 
axins.set_xticks([])
axins.set_yticks([])

2.8 局部放大图效果展示

3 设置绘图横纵比

使用 matplotlib.axes.Axes.set_aspect() 函数设置长宽比
如果在函数中使用等于作为长宽比,则得到的图在 X 轴和 Y 轴上从数据点到绘图单位的缩放比例相同

使用以下命令手动设置纵横比:
axes.get_data_ratio() 获取原始绘图数据的比率,倒数的值传递给 set_aspect()。

axes.set_aspect(1.0/(axes.get_data_ratio()), adjustable='box')

改变横纵比相等 效果展示

4 画图占满整个画图,无白边

w=image_array[z,...].shape[0]
h=image_array[z,...].shape[1]
dpi=100
fig,axes=plt.subplots(figsize=(w/dpi,h/dpi),dpi=dpi)
axes=fig.add_axes([0,0,1,1])
axes.set_axis_off()

axes.imshow()
plt.savefig('./test.png', bbox_inches='tight')

参考资料

【Matplotlib】 局部放大图
如何在 Matplotlib 中绘制等轴的正方形图
Matplotlib绘图(一)-边框线及坐标轴的设置
Matplotlib示例.256 如何绘制画中画效果
matplotlib隐藏刻度线、标签和边线
看回答:python matplotlib savefig的图片如何充满整个画布

实践Origin对图片局部放大

【实践】Origin将原图中一部分局部放大,并和原图在一张图上

  • 新建项目只有两列,列数不够通过右键选择Add New Column增加新列。

技术图片

 

  •  新增的列默认为Y(对应纵坐标),可以选中新增列右键,选择Set As-->X(对应横坐标)。

 技术图片

 

  • 选择要画图的列,右键在Plot中选择图的类型

技术图片

 

  •  图之间的切换

技术图片

 

  •  使用工具中的放大镜,按住Ctrl,鼠标选择需要局部放大的部分

技术图片

 

  •  下图中右边的图即为局部放大图

 技术图片

 

  •  选择局部放大图复制,在原图粘贴即可。再做微调。

技术图片

 

  •  设置选择区域框样式

技术图片

 

以上是关于matplotlib 的使用技巧(局部放大图坐标轴设置边框设置横纵比设置)的主要内容,如果未能解决你的问题,请参考以下文章

实践Origin对图片局部放大

python matplotlib 图表局部放大

python使用matplotlib可视化3D柱状图(3D bar plot三维柱状图包含三个坐标轴xyz)设置zdir参数为x改变3d图观察的角度

Sprite2d的尺寸折算

Python使用matplotlib可视化柱状图坐标轴标签的符号(-)显示为了方框□□设置rcParams参数配置解决

python使用matplotlib可视化3D柱状图(3D histogram三维柱状图包含三个坐标轴xyz)设置zdir参数为z改变3d图观察的角度