Python 将多个matplotlib图形合并为一个

Python 将多个matplotlib图形合并为一个,python,numpy,matplotlib,dicom,Python,Numpy,Matplotlib,Dicom,我有一个函数,它接受增强的dicom文件,并执行以下操作: 使用for循环从dicom文件创建一个切片,然后将其索引到一个较小的数组中,该数组围绕一组六个斑点 第二个用于循环,在六个斑点周围绘制圆圈,另一个用于背景 显示绘制了所有圆和当前切片位置的图像 当我调用该函数时,我可以创建多个显示在单独图形中的图像。那么,我如何将所有这些数字合并成一个呢?理想情况下,我希望以3x3的网格显示它们 这是我目前的代码: import matplotlib.pyplot as plt import pydic

我有一个函数,它接受增强的dicom文件,并执行以下操作:

  • 使用for循环从dicom文件创建一个切片,然后将其索引到一个较小的数组中,该数组围绕一组六个斑点
  • 第二个用于循环,在六个斑点周围绘制圆圈,另一个用于背景
  • 显示绘制了所有圆和当前切片位置的图像
  • 当我调用该函数时,我可以创建多个显示在单独图形中的图像。那么,我如何将所有这些数字合并成一个呢?理想情况下,我希望以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)
    

    在下文中,我们将使用该方法生成一个图形和一个轴的栅格,有人将Matplotlib对象理解为子地块

    二维网格上的迭代首先给出网格的一行,该行上的第二次迭代给出单个子地块。当我们挑出一个轴时,是时候调用你的函数了(你有责任区分要绘制的数据,因为你的问题不清楚你想做什么),但是需要一个额外的参数,即当前轴

    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')
    

    创建具有3x3子地块的地物。然后将每个图像绘制到其中一个轴上。你能给我一些关于如何做的更多信息吗?我想出了如何创建一个带有3x3子图的图形,但无法将我的图形放入其中。我正在使用此页面中的说明:。您的回答帮助我更接近我要查找的内容。但是,当我运行你给我的函数时,它会打印每个窗口中的所有图片,然后将每个图片堆叠在一起。下面的图片是当我尝试将三张图片绘制到网格中时发生的情况:在我的回答中,我写道“你有责任区分要绘制的数据,因为你的问题不清楚你想做什么”-请写一个更好的问题,也许你会得到更好的答案抱歉这里的沟通错误,但我确实在你的回答中看到了这一点,我试图理解如何区分要绘制的数据。所以,让我试着澄清一下我想做什么。每次通过drawCircle()函数中的for循环,都会创建一张新图片,其中包含斑点周围的圆圈以及该图片的切片位置。我正试图把每一张图片放到3x3的网格中,放在它自己的位置上。我搞不懂为什么每张照片都被画了九次,然后叠在一起。你能帮我修一下吗?