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

文章目录

  • 前言
  • 使用步骤 提示:功能可相互独立,不必按此目录顺序执行
    • 1.引入库
      • 1.1 绘制初始图像
    • 2.局部放大图(调整坐标轴显示范围、翻转坐标轴、隐藏坐标轴、边框改变颜色、隐藏边框)
      • 2.1 绘制嵌入绘制局部放大图的坐标系
      • 2.2 在子坐标系中绘制原始数据
      • 2.3 调整子坐标系的显示范围 ( 调整坐标轴显示范围)
      • 2.4 建立父坐标系与子坐标系的连接线
      • 2.5 父坐标系翻转y坐标轴,为了与子图显示方向一致 (翻转坐标轴)
      • 2.6 调整子坐标系边框 (边框颜色、边框隐藏)
      • 2.7 子坐标系隐藏坐标轴(隐藏坐标轴)
      • 2.8 局部放大图效果展示
    • 3 设置绘图横纵比
    • 4 画图占满整个画图,无白边
    • 5 x轴y轴标签设置
      • y轴标签水平显示
  • 参考资料

前言

提示: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')

5 x轴y轴标签设置

y轴标签水平显示

使用rotation进行旋转、labelpad进行平移

#1
x = np.random.random((256,256))
plt.figure()
plt.imshow(x,cmap='gray')
plt.ylabel('test')
plt.title('ylabel')
plt.show()

#2
plt.figure()
plt.imshow(x,cmap='gray')
plt.ylabel('test', rotation=0)
plt.title('ylabel with rotation')
plt.show()

#3
plt.figure()
plt.imshow(x,cmap='gray')
plt.ylabel('test', rotation=0, labelpad=25)
plt.title('ylabel with rotation pad')
plt.show()

参考资料

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

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
社会演员多的头像社会演员多普通用户
上一篇 2023年6月4日
下一篇 2023年6月4日

相关推荐