sábado, 19 de abril de 2025

Thinkcspy. Funciones / 6.11 Un grafico de barras dibujado en turtle

 

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 ejemplo alex.begin_fill(). Luego dibujas la forma. Finalmente, llamas end_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. 

../_images/tess_bar_1.png 

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

Entradas recientes

Articulo: Predecir la resistencia a la traccion de un material con Python

  Desde ingeniero de materiales hasta desarrollador de aprendizaje automático: predecir la resistencia a la tracción con Python y Web Tech...

Entradas Populares