python - 将多个 matplotlib 图形合二为一
问题描述
我有一个函数,它采用增强的 dicom 文件并执行以下操作:
- 使用 for 循环从 dicom 文件创建单个切片,然后将其索引到围绕一组六个斑点的较小数组中。
- 第二个 for 循环围绕六个斑点和一个背景绘制圆圈
- 显示所有绘制的圆圈和当前切片位置的图像。
当我调用该函数时,我可以创建多个图像,这些图像显示在单独的图中。那么,我怎样才能将所有这些数字合二为一呢?理想情况下,我想将它们显示在 3x3 网格中。
这是我当前的代码:
import matplotlib.pyplot as plt
import pydicom # Used for opening DICOM files
import numpy as np # General mathematical package
from pylab import text
# Import DICOM files
filename = "U:/File location"
ds = pydicom.dcmread(filename)
# Speck Locations
centerSpeck = (1690, 1477)
centerSpeck2 = (100, 100)
twelveOclockSpeck = (45, 84)
twoOkclockSpeck = (66, 148)
tenOclockSpeck = (136, 147)
fiveOclockSpeck = (157, 82)
sevenOclockSpeck = (102, 41)
backgroundSignalValue = (71, 63)
speckLocations = np.array([centerSpeck2, twelveOclockSpeck, twoOkclockSpeck, fiveOclockSpeck, sevenOclockSpeck, tenOclockSpeck, backgroundSignalValue])
# Function that draws a circle around a given pixel
def drawCircle(arrayToPLot, zeroIndex, oneIndex, specks, r = 10):
x = speckLocations[:,1] # get x axis variables from the speckLocations array
y = speckLocations[:,0] # get y axis variables from the speckLocations array
for i in range(zeroIndex,oneIndex,1): # For loop, note that the function range is: range(start, stop, step)
tempIm = arrayToPLot.pixel_array[i,:,:].astype(float) # Get one slice as float
slicedArray = tempIm[centerSpeck[0]-100:centerSpeck[0]+100, centerSpeck[1]-100:centerSpeck[1]+100].astype(float)
for x,y in (speckLocations):
plt.imshow(slicedArray, cmap='gray')
circle = plt.Circle((y, x),r, fc='none', ec="red")
plt.gca().add_patch(circle)
text(10, 180, i, fontsize=12, color='red') # Print the current slice on the image
plt.show() # Plot each slice with circles drawn around all the specks and the background signal value location
#Call the function
drawCircle(ds, 33, 34, speckLocations)
解决方案
在下文中,我们将使用该plt.subplots
方法生成一个图形和一个网格axes
,即有人理解为子图的 Matplotlib对象......
2D 网格上的迭代首先为您提供一行网格,第二次迭代为您提供单独的子图。当我们挑出一个轴时,是时候调用你的函数了(你有责任区分要绘制的数据,因为你的问题并不清楚你想要做什么),但有一个额外的参数,即当前轴。
fig, ax_grid = plt.subplots(3,3)
for ax_row in ax_grid:
for ax in ax_row:
drawCircle(ax, ds, 33, 34, speckLocations)
plt.tight_layout()
plt.show()
最后我们展示了这个图,呼吁tight_layout
更好地安排子图。
当然我们必须修改圆形绘图功能......首先我们添加ax
到参数列表中,接下来我们修改对plt
方法的调用以使用ax
对象的方法:
def drawCircle(ax, arrayToPLot, zeroIndex, oneIndex, specks, r = 10):
...
ax.imshow(...)
...
ax.add_patch(circle)
ax.text(10, 180, i, fontsize=12, color='red')
推荐阅读
- c# - 在 C# 中通过 TCP 套接字方法发送位类型数据
- java - AES 解密期间出错。非法块大小异常
- android - 关闭警报对话框
- wordpress - 复杂重定向的组合或重写规则
- usb - Windows 7 虚拟机无法识别具有最新 Virtualbox 扩展的 USB 密钥和该密钥的过滤器
- android - 问题在 Honor 6x 中不可见项目(带有 StaggeredGridLayoutManager 的 Recyclerview)
- android - Google Apps 脚本:将数据附加到电子表格(如果尚未存在)
- python - 井字游戏python的GUI逻辑
- python - 使用 GPU Nvidia 的张量流
- django - Django - 从用户名获取用户 ID