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).
- Możemy zmusić żółwia do wyświetlenia tekstu w miejscu, gdzie właśnie przebywa. Metoda ta nazywa się write. Przykładowo wyrażenie alex.write("Czesc") wypisze ciąg znaków Czesc w miejscu, gdzie obecnie znajduje się żółw.
- Dany kształt (koło, półkole, trójkąt, itp.) można wypełnić kolorem. Proces ten przebiega w dwóch etapach. Najpierw wołamy metodę begin_fill, na przykład alex.begin_fill(). Następnie rysujemy dany kształt. Na koniec wołamy metodę end_fill (alex.end_fill()).
- Już wcześniej ustawiliśmy kolor dla naszego żółwia - teraz możemy ustawić też kolor wypełnienia, który może różnić się od koloru kreski żółwia. Aby to zrobić, wołamy metodę fillcolor, np.: alex.fillcolor("red").
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ć.
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.
Informacja
Ten obszar roboczy jest tutaj dla Twojej wygody. Możesz tu wypróbować dowolny program.