Wykres słupkowy w wykonaniu żółwia

Przypomnij sobie tekst na temat modułów, gdzie można było znaleźć wiele informacji o tym co potrafią żółwie. Poniżej znajdziesz kilka trików więcej (przypominamy, że wszystkie one opisane są w dokumentacji modułu).

Ok, czyli można narysować wykres słupkowy za pomocą tess? Na początku zaczniemy od podania danych do narysowania.

xs = [48, 117, 200, 240, 160, 260, 220]

Dla każdej danej pomiarowej wyrysujemy prostokąt o właśnie takiej wysokości, mający założoną szerokość. Poniżej widnieje uproszczona wersja tego, co chcielibyśmy narysować.

../_images/tess_bar_1.png

Szybko możemy zauważyć, że rysowanie słupka to nic innego jak rysowanie prostokąta lub kwadratu. Jako, że będziemy rysować ów słupek kilkukrotnie, powinniśmy stworzyć funkcję draw_bar (narysuj słupek), która będzie pobierać żółwia oraz wysokość słupka. Szerokość słupka ustawimy domyślnie na 40 jednostek. Jak już będziemy mieli funkcję, to wystarczy prosta pętla, aby przetworzyć wszystkie dane z listy.

def draw_bar(t, height):
    """ Uzyj zolwia t do narysowania jednego slupka o wysokosci height. """
    t.left(90)               # Obrot do gory
    t.forward(height)        # Narysuj lewa krawedz
    t.right(90)
    t.forward(40)            # szeroskosc slupka, gorna krawedz
    t.right(90)
    t.forward(height)        # teraz w dol
    t.left(90)               # powrot do oryginalngo kata zolwia


...
for v in xs:                 # jezeli xs i tess istnieja
    draw_bar(tess, v)

Całkiem niezły start! Najważniejszą rzeczą w tym przykładzie jest myślowy podział problemu na kawałki. Aby ów problem rozwiązać, najpierw podzieliliśmy go na mniejsze kawałki. Takim kawałkiem jest: narysuj jeden słupek. Następnie zaimplementowaliśmy ten pojedynczy kawałek jako funkcję. A następnie, już dla całego wykresu, wielokrotnie wywołaliśmy naszą funkcję.

Następnie nad każdym słupkiem wypiszemy jego wysokość (wartość konkretnej danej). Zrobimy to w ciele funkcji draw_bar, dodając wyrażenie t.write(str(height)) jako nową, czwartą linię ciała funkcji. Proszę zauważyć, że musimy zamienić liczbę na ciąg znaków. Ostatecznie dodamy dwie metody potrzebne do wypełnienia każdego słupka.

Ostatnim problemem pozostałym do rozwiązania jest to, że żółwie żyją w świecie, gdzie położenie (0, 0) jest w centrum rysunku. W naszym przypadku, gdyby (0, 0) znajdowało się w lewym dolnym roku, życie stałoby się prostsze. Aby poradzić sobie z tym zagadnieniem możemy użyć metody setworldcoordinates, aby przeskalować okno. Jak już rozpatrujemy skalowanie, to nasze okno powinno móc w stanie pomieścić dane. Najwyższy słupek będzie odpowiadał największej wartości wśród danych. Szerokość okna musi odpowiadać ilości słupków (ilości danych), z których każdy będzie miał szerokość 40 jednostek. Dzięki tym danym możemy oszacować układ współrzędnych, który będzie odpowiadał zestawowi danych. Dodatkowo, aby wykres wyglądał lepiej, dookoła wykresu dodamy ramkę o szerokości 10 jednostek.

Poniżej widnieje kompletny program. Wypróbujcie go, a później zmieńcie nieco dane, aby zobaczyć, że poprawnie dostosowuje się do nowych wartości. Proszę też zauważyć, że dane przechowujemy w liście oraz że używamy kilku funkcji działających na listach. O listach opowiemy jeszcze w kolejnym rozdziale.




(ch05_barchart)

Informacja

Ten obszar roboczy jest tutaj dla Twojej wygody. Możesz tu wypróbować dowolny program.




(scratch_05_06)

Następna część - Słownik