6.11. Un gráfico de barra de tortuga
Recuerde de nuestra discusión de los módulos que había varias cosas que las tortugas pueden hacer. Aquí hay un par de trucos más (recuerde que todos se describen en la documentación del módulo).
Podemos obtener una tortuga para mostrar texto en el lienzo en la posición actual de la tortuga. Se llama al método
write
. Por ejemplo,alex.write("Hello")
Escribiría la cadena Hello en la posición actual.Uno puede llenar una forma (círculo, semicírculo, triángulo, etc.) con un color de relleno. Es un proceso de dos pasos. Primero llamas al método
begin_fill
, Por ejemploalex.begin_fill()
. Luego dibujas la forma. Finalmente, llamasend_fill
(alex.end_fill()
).Anteriormente hemos establecido el color de nuestra tortuga; ahora también podemos establecer su color de relleno, que no necesita ser lo mismo que la tortuga y el color de la pluma. Para hacer esto, utilizamos un método llamado
fillcolor
, Por ejemplo,alex.fillcolor("red")
.
Ok, entonces, ¿podemos hacer que Tess dibuje un gráfico de barras? Comencemos con algunos datos para ser trazados,
xs = [48, 117, 200, 240, 160, 260, 220]
En correspondencia con cada medición de datos, dibujaremos un rectángulo simple de esa altura, con un ancho fijo. Aquí hay una versión simplificada de lo que nos gustaría crear.
Podemos ver rápidamente que dibujar una barra será similar a dibujar un rectángulo o un cuadrado. Dado que tendremos que hacerlo
Varias veces, tiene sentido crear una función, drawBar
,
que necesitará una tortuga y la altura de la barra. Asumiremos que el
ancho de la barra será de 40 unidades. Una vez que tenemos la función,
podemos usar un bucle básico para procesar la lista de valores de datos.
>>def drawBar(t, height): """ Get turtle t to draw one bar, of height. """ >> t.left(90) # Point up >> t.forward(height) # Draw up the left side >> t.right(90) >> t.forward(40) # width of bar, along the top >> t.right(90) >> t.forward(height) # And down again! >> t.left(90) # put the turtle facing the way we found it. ... >>for v in xs: # assume xs and tess are ready >> drawBar(tess, v)
¡Es un buen comienzo! Lo importante aquí fue la fusión mental. Para resolver el problema, primero lo dividimos en piezas más pequeñas. En particular, Nuestro trozo es dibujar una barra. Luego implementamos ese fragmento con una función. Entonces, para el todo Gráfico, repetidamente llamamos nuestra función.
A continuación, en la parte superior de cada barra, imprimiremos el valor de los datos.
Haremos esto en el cuerpo de drawBar
Al agregar t.write(str(height))
Como la nueva cuarta línea del cuerpo.
Tenga en cuenta que tuvimos que girar el
número en una cadena.
Finalmente, agregaremos los dos métodos necesarios para llenar cada barra.
El único problema restante
está relacionado con el hecho de que nuestra tortuga vive en un mundo
donde la posición (0,0) está en el centro del lienzo de dibujo. En este
problema, ayudaría si (0,0) estuvieran en la esquina inferior izquierda.
Para resolver esto podemos usar nuestro setworldcoordinates
Método para rescalar la ventana. Mientras lo hacemos, debemos hacer que
la ventana se ajuste a los datos. La barra más alta corresponderá al
valor máximo de datos. El ancho de la ventana deberá ser proporcional al
número de barras (el número de valores de datos) donde cada uno tiene
un ancho de 40. Usando esta información, podemos calcular la coordenada
sistema que tiene sentido para el conjunto de datos. Para que se vea
bien, agregaremos un borde de 10 unidades alrededor de las barras.
Aquí está el programa completo. Pruébelo y luego cambie los datos para ver que puede adaptarse a los nuevos valores. Tenga en cuenta también que Hemos almacenado los valores de datos en una lista y utilizamos algunas funciones de lista. Tendremos mucho más que decir sobre las listas en un capítulo posterior.
>>import turtle
>>def drawBar(t, height):
""" Get turtle t to draw one bar, of height. """
>> t.begin_fill() # start filling this shape
>> t.left(90)
>> t.forward(height)
>> t.write(str(height))
>> t.right(90)
>> t.forward(40)
>> t.right(90)
>> t.forward(height)
>> t.left(90)
>> t.end_fill() # stop filling this shape
>>xs = [48, 117, 200, 240, 160, 260, 220] # here is the data
>>maxheight = max(xs)
>>numbars = len(xs)
>>border = 10
>>wn = turtle.Screen() # Set up the window and its attributes
>>wn.setworldcoordinates(0-border, 0-border, 40*numbars+border, maxheight+border)
>>wn.bgcolor("lightgreen")
>>tess = turtle.Turtle() # create tess and set some attributes
>>tess.color("blue")
>>tess.fillcolor("red")
>>tess.pensize(3)
>>for a in xs:
>> drawBar(tess, a)
>>wn.exitonclick()
PPI: La salida del código anterior es la siguiente:
Este código es bastante conciso, pero cada etiqueta de altura está parcialmente cubierta por la parte superior
segmento de su bar. ¿Puedes modificar el
drawBar
código, moviendo ligeramente la etiqueta
¿Pero no cambiar la barra?
Sugerencia: la etiqueta no se puede dibujar durante la secuencia de relleno de polígono.
No hay comentarios.:
Publicar un comentario