Wykresy w WPF C# – OxyPlot

Wykresy w WPF C# – OxyPlot

Nieodłącznym elementem pracy na danych liczbowych jest ich analiza. A jaka forma interpretacji danych mogłaby być przyjemniejsza dla oka niż wykres zależności? Dlatego wpis dotyczył będzie narzędzia pozwalającego rysować wykresy w WPF C# – OxyPlot ułatwiającego to zadanie.

W projektach, które wymagają wyświetlenia kilku punktów w prosty sposób, spokojnie można to zrealizować za pomocą własnych klas. Czasem jednak ilość danych wzrasta oraz komplikuje się sposób wyświetlania np. poprzez skalę logarytmiczną, możliwość przybliżania fragmentu wykresu. W takich sytuacjach zaprogramowanie takiego narzędzia może zająć znaczną część czasu przeznaczonego na pierwotny projekt. Warto wtedy skorzystać z rozbudowanych narzędzi, które na pewno spełnią nasze wymagania.

Na rynku znajduje się wiele narzędzi wspomagających wyświetlanie wykresów np. XPlot, Chart, ZedGraph. Większość narzędzi napisana jest pod WinForms i tam znakomicie się spełniają. Co w sytuacji, gdy projekt od początku do końca projektowany jest w WPF? Można oczywiście połączyć projekt WPF z WinForms, ale istnieje narzędzie, które rozwiązuje ten problem.

OxyPlot jest biblioteką pozwalającą na bezpośrednią implementację w WPF, Windows 8, Windows Phone, Windows Phone Silverlight, Windows Forms, Silverlight, GTK#, Xwt, Xamarin.iOS, Xamarin.Android, Xamarin.Forms and Xamarin.Mac. Udostępniona jest na licencji MIT, która pozwala na swobodne korzystanie, dopóki w programach pochodnych zamieszczana jest treść licencji.

 

 

Od czego zacząć

Pracę z OxyPlot należy rozpocząć od dodania bibliotek do własnego projektu WPF. Dostępne są trzy sposoby dodania odpowiednich referencji:

  1. Najłatwiejszym sposobem na to jest skorzystanie z nuget. Po uruchomieniu Package Manager Console należy wpisać:

    • Install-Package Oxyplot.Core
    • Install-Package Oxyplot.Wpf
  2. Drugim sposobem jest wyszukanie bibliotek Oxyplot.Core oraz Oxyplot.Wpf poprzez interfejs nugetManage Nuget Packages w sposób zaprezentowany poniżej:nuget - Wykresy w WPF C# - OxyPlot

  3. Trzeci sposób jest dla tych, którym nie działają poprzednie sposoby.

Z tego sposobu należy skorzystać jeżeli podczas instalacji wystąpił problem, nie działają pewne funkcje OxyPlot lub z jakiegoś powodu nie chcesz korzystać z nuget.

UWAGA

Zarówno poniższy opis, jak i przykłady podawane przez producenta odnoszą się do wersji 2013.1.38.1, niestety wersja obecnie znajdująca się w nuget to 2014.1.546 i może powodować to błędy. Jednym z nich jest:

The name „plot” does not exist in the namespace „http://oxyplot.codeplex.com”

Rozwiązaniem tego problemu jest dodanie referencji do starszej wersji plików, które można pobrać stąd: OxyPlot

 

Pobrany plik należy rozpakować, a następnie dodać referencję do nich w sposób przedstawiony poniżej.

  1. W Solution Explorer należy znaleźć referencję, kliknąć prawym przyciskiem myszy i wybrać Add Reference.ref1 - Wykresy w WPF C# - OxyPlot
  2. W nowo otwartym oknie należy kliknąć Browse i znaleźć pobrane pliki, następnie kliknąć Add.
    ref2 - Wykresy w WPF C# - OxyPlot
  3. Ostatecznie należy sprawdzić czy są zaznaczone na liście i kliknąć OK.
    ref3 - Wykresy w WPF C# - OxyPlot

UWAGA

Dodanie dowolnego pliku przez nuget spowoduje aktualizację plików do nowszej wersji. W przypadku występowania wymienionego wcześniej błędu, pojawi się on ponownie.

 

Deklaracja kontrolki wykresu

Kontrolkę należy zadeklarować w kodzie XAML projektu. W nagłówku Window należy dopisać linię:

Następnie w miejscu, w którym ma się pojawić wykres wpisać kod:

Parametrem wartym wyjaśnienia jest tu Model, do którego został ustawiony Binding. Jest to parametr, pozwalający na ustawienie wyglądu, przedziału, kolorów, serii danych itd.

OxyPlot pomimo funkcjonowania w WPF i bindowanego Model‚u nie wspiera w pełni modelu MVVM (Model View ViewModel). Oznacza to, że wyświetlenie zmian na wykresie wymaga uaktualnienia danych w obiekcie PlotModel w code-behind.

 

Implementacja obiektu PlotModel wykresu

Teraz, gdy w projekcie znajduje się już kontrolka, w której wyświetlany będzie wykres, należy zająć się jej wyglądem.

W modelu został ustawiony Binding, a więc konieczna jest deklaracja klasy z polem, którego zmiana będzie wywoływała reakcję poprzez akcesory. Taka klasa musi dziedziczyć z INotifyPropertyChanged i nadpisywać metodę OnPropertyChanged:

Obiekt tak zdefiniowanej klasy należy podpiąć pod interfejs z kontrolką wykresu.

 

Ustawianie parametrów wykresu

Teraz gdy wszystko jest już połączone ze sobą, pozostaje ustawienie odpowiednich parametrów polu PlotModel. W tym celu klasa OxyPlotModel zostanie rozbudowana. Sposób uzupełniania tych parametrów jest dowolny, ale w poniższym przykładzie zostało to rozdzielone na dwa etapy. Parametry, które się nie zmieniają uzupełniane są na początku, a te zależne od wykresu dopisywane są przed jego wyświetleniem. Stałymi parametrami są tu tylko te dotyczące legendy wykresu:

Nie zalecam wstępnej deklaracji osi wykresu, ponieważ mogą się wartości liczbowe z deklaracji i z samych danych wejściowych na siebie nachodzić i spowoduje to wizualny bałagan.

Drugą metodą klasy, wywoływaną zawsze gdy należy zmienić zawartość wykresu. Najprostszym przykładem pozwalającym narysować kosinusoidę jest metoda:

W przypadku wykresu na podstawie własnych punktów X i Y, ta sama klasa wyglądałaby tak:

lub:

Dodatkowo w tej metodzie można uzupełnić informację dotyczące parametrów osi wykresu takie jak liniowe/logarytmiczne, zakres danych, wartość minimalna/maksymalna:

Jeżeli serii danych jest więcej to warto by wyraźnie się różniły od siebie, dlatego należy zdefiniować parametry serii:

 

Zbierając wszystkie omówione informacje, poniżej został zaprezentowany kod dla serii danych, podanych jako listy w parametrze:

W powyższym kodzie dodawane serie korzystały z kolejnych wartości tablic ksztaltPunktowWykresu i koloryWykresow. Są to listy z wypisanymi wartościami tych parametrów, po to by można było korzystać z nich w pętli. Przykładowa implementacja takich tablic znajduje się poniżej:

 

Zapis wykresu do pliku

Gdy już się tak napracowaliśmy by wyświetlić wykres, to dobrze byłoby zachować go w formie pliku, do późniejszego odtworzenia. OxyPlot umożliwia skorzystania ze skrótu klawiszowego ctrl+c, by zapisać jego obraz w pamięci tymczasowej, następnie wystarczy go wkleić w dowolnym edytorze graficznym.

Wygodniejszą opcją jest jednak skorzystanie z metody, która pozwala na taki zapis do pliku:

Parametry metody to kolejno:

  • Obiekt z modelem wykresu;
  • Nazwa pliku, wraz z lokalizacją i rozszerzeniem;
  • Szerokość w pikselach;
  • Wysokość w pikselach;
  • Kolor tła wykresu;
  • Liczba pikseli przypadająca na cal długości;

 

Loading Facebook Comments ...

Dodaj komentarz

Or