# # PlotList: Widget to plot a list of points # Gustavo Rodriguez-Rivera, Purdue University # grr@cs.purdue.edu # import string from Tkinter import * class PlotList( Canvas ): def __init__( self, points, master = None ): Canvas.__init__( self, master ) self.pack() self._font = "-Adobe-Helvetica-Medium-R-Normal--*-140-*-*-*-*-*-*" self._points = points if ( self._points ): self.redraw( self._points ) def redraw( self, points ): self.delete("all") self._points = points self._screenWidth = string.atoi( self.config( "width" )[ 4 ] ) self._screenHeight = string.atoi( self.config( "height" )[ 4 ] ) # Get max X and Y from list of points [ minX, minY] = self._points[ 0 ] [ maxX, maxY] = self._points[ 0 ] for point in self._points: if ( point[ 0 ] < minX ): minX = point[ 0 ] if ( point[ 1 ] < minY ): minY = point[ 1 ] if ( point[ 0 ] > maxX ): maxX = point[ 0 ] if ( point[ 1 ] > maxY ): maxY = point[ 1 ] if ( maxX == minX ): maxX = maxX + 1 minX = minX - 1 if ( maxY == minY ): maxY = maxY + 1 minY = minY - 1 ( refX, refY ) = ( minX, minY ) if ( minX <= 0 and maxX >= 0 ): refX = 0 if ( minY <= 0 and maxY >= 0 ): refY = 0 offsetScreen = 40 maxXScreen = self._screenWidth - offsetScreen minXScreen = offsetScreen maxYScreen = offsetScreen minYScreen = self._screenHeight - offsetScreen scaleX = ( 1.0 * maxXScreen - minXScreen )/(maxX-minX) scaleY = ( 1.0 * maxYScreen - minYScreen )/(maxY-minY) refXScreen = (refX - minX) * scaleX + minXScreen refYScreen = (refY - minY) * scaleY + minYScreen self.create_line( minXScreen, refYScreen, maxXScreen, refYScreen, {"width": 2 } ) self.create_line( refXScreen, minYScreen, refXScreen, maxYScreen, {"width": 2 } ) divisions = 5 for i in range( 0, divisions + 1 ): x = 1.0 * i * (maxX - minX)/divisions + minX xScreen = (x - minX) * scaleX + minXScreen self.create_line( xScreen, refYScreen, xScreen, refYScreen - 5, { "width": 2 } ) self.create_text( xScreen, refYScreen + 4, { "text": "%5.2lf" % x, "anchor": "n", "font": self._font } ); for i in range( 0, divisions + 1 ): y = 1.0 * i * (maxY - minY)/divisions + minY yScreen = (y - minY) * scaleY + minYScreen self.create_line( refXScreen, yScreen, refXScreen + 5, yScreen, { "width": 2 } ) self.create_text( refXScreen - 8, yScreen + 4, { "text": "%5.2lf" % y, "anchor": "e", "font": self._font} ); [ lastX, lastY ] = self._points[0] lastXScreen = (lastX - minX) * scaleX + minXScreen lastYScreen = (lastY - minY) * scaleY + minYScreen for point in self._points: [ x, y ] = point xScreen = (x - minX) * scaleX + minXScreen yScreen = (y - minY) * scaleY + minYScreen; self.create_line( lastXScreen, lastYScreen, xScreen, yScreen, { "width": 1, "fill":"red"} ); lastXScreen = xScreen; lastYScreen = yScreen; #To test uncomment next lines #app = PlotList( [ [0,0], [3,3], [5,7] ] ) #app.mainloop()