#025 Wykres roju (swarmplot)

miroslawmamczur.pl 8 miesięcy temu

Wykres roju (ang. swarmplot) pojawił się stosunkowo niedawno w dziedzinie wizualizacji danych. Został wprowadzony jako alternatywna metoda prezentacji rozkładu danych, szczególnie użyteczna w przypadku zbiorów danych o dużej liczbie punktów.

Wykres roju to rodzaj grafiki danych, który prezentuje rozkład punktów danych wzdłuż jednej osi, unikając nakładania się punktów na siebie. W przeciwieństwie do tradycyjnych wykresów punktowych swarmplot rozróżnia poszczególne punkty poprzez delikatne rozproszenie ich wzdłuż osi.

Ten typ wykresu pomaga w ukazaniu rozkładu danych wzdłuż zmiennej numerycznej, podkreślając gęstość i zmienność danych skuteczniej niż tradycyjne wykresy rozrzutu lub wykresy pudełkowe.

Na czym polega wykres roju (swarmplot)?

Pomyślcie, iż mamy do dyspozycji zbiór jakichś liczb, na przykład poniższą listę:

Teraz listę sortujemy i ustawiamy w rosnącej kolejności. Następnie nanosimy każdą obserwację na nasz wykres:

Ciekawostka

Inna nazwa tego wykresu w języku angielskim to beeswarm plot. Nazwa ta wywodzi się z obserwacji zachowania rojów pszczół w naturze, gdzie jednostki poruszają się w sposób rozproszony, unikając kolizji i nakładania się na siebie.

Zalety wykresu swarmplot

  • Lepsza czytelność: Dzięki rozproszeniu punktów, wykres rojowy zapewnia lepszą czytelność danych, szczególnie w przypadku większej ilości punktów.
  • Wizualizacja rozkładu: Pozwala on na łatwe zobrazowanie rozkładu danych, ujawniając skupiska i rozproszenie wartości.
  • Możliwość analizy zagęszczenia: Dzięki temu, iż punkty są rozproszone, łatwiej jest zauważyć obszary większego zagęszczenia danych.

Wady wykresu rojowego

  • Nie działają w przypadku dużej ilości danych: W takim przypadku swarmplot może stać się zbyt gęsty i trudny do odczytania. Wówczas lepiej skorzystać z wykresu skrzypcowego.
  • Brak prezentacji relacji między zmiennymi: Wykresy rojowe są skoncentrowane na prezentacji rozkładu danych wzdłuż jednej osi, co ogranicza ich zdolność do prezentacji zależności między różnymi zmiennymi w zestawie danych. W takich sytuacjach bardziej odpowiedni będzie wykres rozrzutu.

Kod w Python

Do wizualizacji wykorzystamy bibliotekę seaborn.

Najpierw zaimportujmy potrzebne pakiety oraz zobaczmy, jakie mamy do dyspozycji wbudowane zbiory danych:

import seaborn as sns from matplotlib import pyplot as plt from platform import python_version from matplotlib import __version__ as plt_ver print(f'python: {python_version()}') print(f'matplotlib: {plt_ver}') print(f'seaborn: {sns.__version__}\n') sns.set_style('whitegrid') print(f'Data sets from seaborn: \n{sns.get_dataset_names()}')

Tym razem pobawmy się dla przykładu danymi dotyczącymi zużycia paliwa i wydajności samochodów. Zbiór ten zawiera informacje takie jak marka, model, rok produkcji, pojemność silnika, zużycie paliwa w mieście i poza miastem oraz inne parametry techniczne.

Pozbądźmy się jeszcze braku danych i zobaczmy przykładowe trzy rekordy, by lepiej zapoznać się z danymi (jeśli ich nie znacie):

df_cars = sns.load_dataset('mpg').dropna() print(f'Shape: {df_cars.shape}') df_cars.head(3)

Narysujmy teraz zmienną horsepower dzięki wykresu roju:

sns.swarmplot(y='horsepower', data=df_cars);

Poszukajmy teraz innej zmiennej, według której podzielimy nasz zbiór na osobne kategorie. Napiszmy jeszcze od razu funkcję do sprawdzenia liczności danej grupy:

def draw_bar_chart(df, col): # Draw a bar chart for the numerical values in the 'origin' column sns.countplot(x=col, data=df, color='gray') # Add a title to the plot plt.title(f'Number of cars by {col}') # Add labels to the axes plt.xlabel(col) plt.ylabel('Number of cars') # Display the plot plt.show() draw_bar_chart(df_cars, 'origin')

Jak widzimy powyżej możemy zrobić podział po 3 osobnych rejonach geograficznych w celu ich porównania.

sns.swarmplot(x='origin', y='horsepower', data=df_cars, size=3);

Uwaga. Dodatkowo zmniejszyłem wielkość na wykresie, aby zmieściły się na nim wszystkie nasze obserwacje.

Zobaczcie jak prosto możemy dodać kolejny wymiar. Przyjrzyjmy się jeszcze zmiennej xx, czy przyda się do kolejnego podziału:

draw_bar_chart(df_cars, 'cylinders')

Widzimy, iż auta z 3 i 5 cylindrami prawie nie występują, więc możemy je przefiltrować:

df_cars_filtred = df_cars[df_cars['cylinders'].isin([4,6,8])] sns.swarmplot(x='origin', y='horsepower', hue='cylinders', data=df_cars_filtred, size=3);

Teraz z takiego wykresu możemy odczytać wiele ciekawych obserwacji. Chociażby wystarczy porównać ilość produkowanych aut 8 cylindrowych o dużej mocy w USA, Europie i Japonii. Różnice widać od razu.

Dodatkowe formatowanie swarmplot

Co możemy z takim wykresem jeszcze zrobić? Chociażby to, co z każdym innym. Możemy go sformatować na wybrane przez nas kolory (np. oficjalne kolory naszej firmy).

custom_palette = {4: 'crimson', 6: 'yellow', 8: 'black'} sns.swarmplot(x='origin', y='horsepower', hue='cylinders', data=df_cars_filtred, size=3, linewidth=0.5, edgecolor='black', palette=custom_palette);

Jeśli chcemy bardziej zróżnicować agregacje po cylindrach, możemy wykorzystać do tego parametr dodge. Zobaczcie, jak wówczas wygląda powyższy wykres:

To co mi się jeszcze podoba, to możliwość wykorzystania wykresu roju w połączeniu z wykresem pudełkowym poprzez naniesienie obu wykresów na siebie. Zobaczcie jakie to proste i jaki fajny efekt z dodatkowymi informacjami z wykresu pudełkowego otrzymujemy:

sns.swarmplot(x='origin', y='horsepower', hue='cylinders', data=df_cars_filtred, size=3, linewidth=0.5, edgecolor='black', palette=custom_palette); # Violin plot sns.boxplot(x='origin', y='horsepower', data=df_cars_filtred, color='lightgray') plt.show()

Analogicznie możemy zrobić z wykresem skrzypcowym:

sns.swarmplot(x='origin', y='horsepower', hue='cylinders', data=df_cars_filtred, size=3, linewidth=0.5, edgecolor='black', palette=custom_palette); # Violin plot sns.violinplot(x='origin', y='horsepower', data=df_cars_filtred, color='lightgray') plt.show()

Powodzenia w Waszych wizualizacjach!

Pozdrawiam serdecznie,

Idź do oryginalnego materiału