gpt4 book ai didi

python - matplotlib 中的 set_xlim、set_ylim、set_zlim 命令无法裁剪显示的数据

转载 作者:太空狗 更新时间:2023-10-30 00:07:44 30 4
gpt4 key购买 nike

我正在使用 Tkinter 和 ttk 构建一个 GUI,并使用 matplotlib 来创建交互式绘图 - 同样,就像其他数百万人所做的那样。尽管到目前为止我遇到的大多数问题都有详细记录,但这个问题似乎很少见:

当在 3d 中绘图并随后使用 set_lim() 命令调整轴比例时,绘制的线超出了看起来不太好的坐标系。另外,我对看起来有点小的框架不满意。这是一个例子:

# Missmatch.py
"""Graphical User Interface for plotting the results
calculated in the script in Octave"""

# importing libraries
import matplotlib, ttk, threading
matplotlib.use('TkAgg')
import numpy as nm
import scipy as sc
import pylab as pl
import decimal as dc
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure
from mpl_toolkits.mplot3d import Axes3D
from oct2py import octave as oc
import Tkinter as tki

class CS:
"""CS - Controlset. This part creates the GUI with all important
Elements. Major changes and calculations will be executed
in the Calculation-Class in a seperate thread. This prevents the
GUI from hanging"""

def __init__(self,parent):
"""Building the main GUI"""
self.ThisParent=parent
### Entire Window
# Mainframe that contains everything.
self.main=tki.Frame(parent)
# Pack manager to expand the mainframe as the windowsize changes.
self.main.pack(fill=tki.BOTH, expand=tki.YES)
# Configure the grid of the mainframe so that only the top left
# cell grows if the users expands the window.
self.main.grid_rowconfigure(0, weight=1)
self.main.grid_rowconfigure(1, weight=1)


### Canvas for drawings
# Creating a figure of desired size
self.f = Figure(figsize=(6,6), dpi=100)
# Creating a canvas that lives inside the figure
self.Paper=FigureCanvasTkAgg(self.f, master=self.main)
# Making the canvas's drawings visible (updating)
self.Paper.show()
# positioning the canvas
self.Paper.get_tk_widget().grid(row=0,rowspan=3, column=0, sticky='NSWE')
# creating a toolbarframe for options regarding the plots
self.toolbarframe=tki.Frame(self.main)
self.toolbarframe.grid(row=3, column=0, sticky='NWE')
# Creating a toolbar for saving, zooming etc. (matplotlib standard)
self.toolbar = NavigationToolbar2TkAgg(self.Paper, self.toolbarframe)
self.toolbar.grid(row=0,column=0, sticky='NWE')
# setting the standard option on zoom
self.toolbar.zoom()



### Axis configuration toolbar
# A frame containing the axis config-menu
self.axisscaleframe=tki.Frame(self.main)
self.axisscaleframe.grid(row=5, column=0, sticky='SNEW')
# In that Frame, some Entry-boxes to specify scale
self.xaxisscalef=ttk.Entry(self.axisscaleframe, width=10)
self.xaxisscalef.insert(0,0)
self.xaxisscalet=ttk.Entry(self.axisscaleframe, width=10)
self.xaxisscalet.insert(0,15)
self.yaxisscalef=ttk.Entry(self.axisscaleframe, width=10)
self.yaxisscalef.insert(0,0)
self.yaxisscalet=ttk.Entry(self.axisscaleframe, width=10)
self.yaxisscalet.insert(0,15)
self.zaxisscalef=ttk.Entry(self.axisscaleframe, width=10)
self.zaxisscalef.insert(0,0)
self.zaxisscalet=ttk.Entry(self.axisscaleframe, width=10)
self.zaxisscalet.insert(0,15)
# And some Labels so we know what the boxes are for
self.xaxlab=ttk.Label(self.axisscaleframe, text='X-Axis', width=10)
self.yaxlab=ttk.Label(self.axisscaleframe, text='Y-Axis', width=10)
self.zaxlab=ttk.Label(self.axisscaleframe, text='Z-Axis', width=10)
self.axinfolab=ttk.Label(self.axisscaleframe, text='Adjust axis scale:')
# And a Button to validate the desired configuration
self.scaleset=ttk.Button(self.axisscaleframe, text='Set', command=self.SetAxis2)
self.scaleset.bind('<Return>', self.SetAxis)
# Let's organize all this in the axisscaleframe-grid
self.axinfolab.grid(row=0, column=0, sticky='W')
self.xaxlab.grid(row=1, column=0, sticky='W')
self.yaxlab.grid(row=2, column=0, sticky='W')
self.zaxlab.grid(row=3, column=0, sticky='W')
self.xaxisscalef.grid(row=1,column=1, sticky='W')
self.yaxisscalef.grid(row=2,column=1, sticky='W')
self.xaxisscalet.grid(row=1,column=2, sticky='W')
self.yaxisscalet.grid(row=2,column=2, sticky='W')
self.zaxisscalef.grid(row=3,column=1,sticky='W')
self.zaxisscalet.grid(row=3,column=2,sticky='W')
self.scaleset.grid(row=3,column=3,sticky='E')


def SetAxis(self,event):
self.SetAxis2()

def SetAxis2(self):
self.x1=float(self.xaxisscalef.get())
self.x2=float(self.xaxisscalet.get())
self.y1=float(self.yaxisscalef.get())
self.y2=float(self.yaxisscalet.get())
self.z1=float(self.zaxisscalef.get())
self.z2=float(self.zaxisscalet.get())
self.a.set_xlim(self.x1, self.x2)
self.a.set_ylim(self.y1, self.y2)
self.a.set_zlim(self.z1, self.z2)
self.Paper.show()
print "Set axis"



class Calculate3D(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)

def run(self):
self.x=range(100)
self.y=range(100)
self.z=range(100)
print 'Done!'
controlset.a = controlset.f.add_subplot(111, projection='3d')
controlset.a.clear()
controlset.a.plot(self.x,self.y,self.z)
controlset.a.mouse_init()
controlset.a.set_xlabel('X')
controlset.a.set_ylabel('Y')
controlset.a.set_zlabel('Z')
controlset.a.set_title('Title')
controlset.Paper.show()
return


mainw=tki.Tk()
mainw.title("Example")
mainw.geometry('+10+10')
controlset=CS(mainw)
#for this example code, we run our Calculate3D class automatically
CL=Calculate3D()
CL.run()

mainw.mainloop()

只需运行代码,然后点击“SET”按钮。这是我的问题。

编辑:添加截图: enter image description here

最佳答案

这里的问题是,mplot3d 没有 OpenGL 后端。因此,用于显示数据的计算基于 2d。我发现了同样的问题 here和解决方法 here .尽管我认为解决方法不是最好的,因为它取决于数据的分辨率。

我关注了the second link反正。所以,我现在正在做的是复制数组并将所有高于和低于我想要的比例的值设置为 NaN。绘制这些时,线条将在数据点超过所需限制的地方被切断。

def SetAxis2(self):
self.dummyx=CL.x*1
self.dummyy=CL.y*1
self.dummyz=CL.z*1
#clipping manually
for i in nm.arange(len(self.dummyx)):
if self.dummyx[i] < self.x1:
self.dummyx[i] = nm.NaN
else:
pass

for i in nm.arange(len(self.dummyy)):
if self.dummyy[i] < self.y1:
self.dummyy[i] = nm.NaN
else:
pass

for i in nm.arange(len(self.dummyz)):
if self.dummyz[i] < self.z1:
self.dummyz[i] = nm.NaN
else:
pass

controlset.a.plot(self.dummyx,\
self.dummyy,\
self.dummyz)

self.a.set_xlim3d(self.x1, self.x2)
self.a.set_ylim3d(self.y1, self.y2)
self.a.set_zlim3d(self.z1, self.z2)

如果现在您的比例设置为从 0 到 10,并且您有六个数据点:[-1, 3 4 12 5 1] 该行将从 3 到 4 和 5 到 1,因为 - 1 和 12 将被设置为 NaN。关于那个问题的改进会很好。 Mayavi可能会更好,但我还没有尝试过,因为我想坚持使用 matplotlib。

关于python - matplotlib 中的 set_xlim、set_ylim、set_zlim 命令无法裁剪显示的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16143493/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com