#020 Diagram cięciw (ang. Chord diagram)

miroslawmamczur.pl 3 lat temu

Diagram cięciw (ang. chord diagram) to metoda wizualizacji pokazująca wzajemne relacje między danymi w macierzy. Diagram cięciw zawdzięcza swoją nazwę terminologii używanej w geometrii. Jak wiesz cięciwa koła to odcinek linii geometrycznej, którego oba końce leżą na okręgu.

Dane są ułożone promieniście wokół okręgu, a relacje między punktami danych są zwykle rysowane jako łuki łączące dane (inaczej zwane krzywymi Béziera). Połączenia między podmiotami używane są do pokazania, iż mają coś wspólnego. Dzięki temu diagram cięciw jest idealny do porównywania podobieństw w zestawie danych lub między różnymi grupami danych. Wartości przypisujemy do każdego połączenia, co jest proporcjonalnie reprezentowane przez rozmiar każdego łuku. Kolor może służyć do grupowania danych w różne kategorie, co pomaga w dokonywaniu porównań i rozróżnianiu grup.

Prawdziwym plusem przy tym wykresie jest interaktywność, dzięki której diagram cięciw jest bardziej zrozumiały. W bibliotece takiej jak plotly możesz najechać kursorem na określoną grupę, aby wyróżnić wszystkie jej połączenia.

Diagram cięciw przyciąga uwagę i jest dość popularny w wizualizacji danych dotyczących przepływów, szczególnie w badaniach migracji, przepływach ekonomicznych czy badaniach genomu.

Kod w python

W tym momencie (końcówka 2021) można znaleźć coraz więcej bibliotek ułatwiających stworzenie diagramu cięciw (chord diagram).

1. Holoviews

Najprostszym sposobem narysowania diagramu cięciw jest użycie elementu Chord z biblioteki holoview. Biblioteka ta korzysta z bokeh i matplotlib jako backendów. Poniższy przykład pochodzi z dokumentacji holoview. Reprezentuje związek między każdym bohaterem książki „Les misérables” („Nędznicy”).

import pandas as pd import holoviews as hv from holoviews import opts, dim from bokeh.sampledata.les_mis import data hv.extension('bokeh') hv.output(size=200) links = pd.DataFrame(data['links']) print(links.head(3))
hv.Chord(links)

Jak widzisz obrazek nie jest zbyt czytelny. Wczytajmy i dodajmy opisy.

nodes = hv.Dataset(pd.DataFrame(data['nodes']), 'index') nodes.data.head()
chord = hv.Chord((links, nodes)) chord.opts( opts.Chord(cmap='Category20', edge_cmap='Category20', edge_color=dim('source').str(), labels='name', node_color=dim('index').str()))

Uwaga! Bardzo częstym błedem w tego rodzajach wykresu jest to, iż staramy sie pokazać zbyt wiele rzeczy i zaciemniają one obraz. Spójrz o ile powyższa wizualizacja będzie bardziej przejrzysta, jeżeli wyświetlimy tylko połączenia występujace wiecej niz 5 razy.

chord = hv.Chord((links, nodes)).select(value=(5, None)) chord.opts( opts.Chord(cmap='Category20', edge_cmap='Category20', edge_color=dim('source').str(), labels='name', node_color=dim('index').str()))
2. Plotapi

Drugą pomocną biblioteką w rysowaniu diagramu cięciw jest plotapi (niestety nie jest darmowa). Wystarczy, iż zerkniesz do dokumentacji i zobaczysz, iż również można stworzyć wykres kilkoma linijkami komend.

3. Plotly

Plotly to potężna biblioteka Pythona do wizualizacji danych, która pozwala również budować diagram cięciw. Dobrą stroną jest to, iż buduje interaktywne wykresy. Niestety aby stworzyć wykres, musisz napisać wiele lini kodu (PRZYKŁAD). Mam natomiast dużą nadzieję, ze w kolejnych wersjach ułatwią rysowanie tego rodzaju wykresów.

Życzę udanych wizualizacji!

Pozdrawiam z całego serducha,

Idź do oryginalnego materiału