自制变焦显示错误

2024-10-02 04:22:42 发布

您现在位置:Python中文网/ 问答频道 /正文

嘿,我正在为一个实习项目制作缩放功能。通常我会使用matplotlib中已经提供的plots和诸如此类的缩放功能,但是有一种特殊的方式,我们希望一次分析多个图像,而zoom不支持这种方式。我试图编写一种缩放函数,它将获取一个数组,并仅对我想用imshow()显示的片段进行切片。下面是我正在尝试做的一个例子:

import matplotlib.pyplot as plt
from matplotlib.widgets import Button, Slider 
import numpy as np

arr = np.zeros([100,100])
for i in range(0,99):
    for j in range(0,99):
        if i % 2 == 0 and j % 2 == 0:
            arr[i][j] = 10
        if i % 3 == 0 and j % 3 == 0:
            arr[i][j] = -7
plt.figure(1)
axpic = plt.subplot2grid((1,1),(0,0), rowspan = 1, colspan = 1)

plt.figure(2)
ax1 = plt.subplot2grid((5,5),(0,0), rowspan = 1, colspan = 4)
ax2 = plt.subplot2grid((5,5),(1,0), rowspan = 1, colspan = 4)
ax3 = plt.subplot2grid((5,5),(2,0), rowspan = 1, colspan = 4)
ax4 = plt.subplot2grid((5,5),(3,0), rowspan = 1, colspan = 4)

axbutton = plt.subplot2grid((5,5),(4,4), rowspan = 1, colspan = 1)

s1 = Slider(ax1, 'Row Begin', 0, 99, valinit=0)
s2 = Slider(ax2, 'Row End', 0, 99, valinit=99)
s3 = Slider(ax3, 'Col Begin', 0, 99, valinit=0)
s4 = Slider(ax4, 'Col End', 0, 99, valinit=99)

zoom = Button(axbutton, 'Zoom')

def dat_view_doe(event):
    if event == 'Nothing':
        axpic.imshow(arr, cmap = 'RdBu')
    else:
        plt.figure(1)
        axpic.cla()
        axpic.imshow(arr[int(s1.val):int(s2.val)][int(s3.val):int(s4.val)], cmap = 'RdBu')
        plt.ylim(0, s2.val-s1.val)
        plt.xlim(0, s4.val-s3.val)

zoom.on_clicked(dat_view_doe)

dat_view_doe('Nothing')
plt.show()

缩放会剪切过多的行,而不会剪切图像数组中的任何列。我不确定是否有语法方面的错误,或者是否有更深层次的问题。谢谢你的帮助


Tags: importifmatplotlibpltvalintsliderarr
1条回答
网友
1楼 · 发布于 2024-10-02 04:22:42

代码中至少有一个可能的问题是,在调用imshow时,您都在分割arr,同时更改轴限制(并将这些限制从零设置为max-min)。我建议每次只需使用以下代码调整轴:

import matplotlib.pyplot as plt
from matplotlib.widgets import Button, Slider 
import numpy as np

arr = np.zeros([100,100])
for i in range(0,99):
    for j in range(0,99):
        if i % 2 == 0 and j % 2 == 0:
            arr[i][j] = 10
        if i % 3 == 0 and j % 3 == 0:
            arr[i][j] = -7
plt.figure(1)
axpic = plt.subplot2grid((1,1),(0,0), rowspan = 1, colspan = 1)

plt.figure(2)
ax1 = plt.subplot2grid((5,5),(0,0), rowspan = 1, colspan = 4)
ax2 = plt.subplot2grid((5,5),(1,0), rowspan = 1, colspan = 4)
ax3 = plt.subplot2grid((5,5),(2,0), rowspan = 1, colspan = 4)
ax4 = plt.subplot2grid((5,5),(3,0), rowspan = 1, colspan = 4)

axbutton = plt.subplot2grid((5,5),(4,4), rowspan = 1, colspan = 1)

s1 = Slider(ax1, 'Row Begin', 0, 99, valinit=0)
s2 = Slider(ax2, 'Row End', 0, 99, valinit=99)
s3 = Slider(ax3, 'Col Begin', 0, 99, valinit=0)
s4 = Slider(ax4, 'Col End', 0, 99, valinit=99)

zoom = Button(axbutton, 'Zoom')

def dat_view_doe(event):
    if event == 'Nothing':
        axpic.imshow(arr, cmap = 'RdBu')
    else:
        plt.figure(1)
        plt.xlim(s1.val, s2.val)
        plt.ylim(s3.val, s4.val)
        plt.draw()

zoom.on_clicked(dat_view_doe)

dat_view_doe('Nothing')
plt.show()

相关问题 更多 >

    热门问题