Знайте разницу - и сделайте так, чтобы они выглядели потрясающе!

Прошло несколько дней с момента моей последней публикации в библиотеке Plotly, причем последняя статья посвящена гистограммам и линейным диаграммам. Хотя я рекомендую прочитать его перед этим, это ни в коем случае не обязательно, поскольку каждая статья написана так, чтобы рассказывать всю историю.

Если вы хотите продолжить серию, вот ссылки:

  1. 4 причины, по которым я выбираю графику в качестве основной библиотеки визуализаций
  2. График спереди назад: гистограммы и линейные диаграммы

Хорошо, давайте без лишних слов поговорим о том, о чем идет речь в этой статье. Основная идея состоит в том, чтобы взять набор данных (хорошо известный, но об этом чуть позже) и изучить, как его можно визуализировать - с помощью точечных и пузырьковых диаграмм.

Используемый набор данных довольно мал, но его будет достаточно для наших нужд, и его можно скачать с этого URL. Вам не нужно загружать его, поскольку мы импортируем его прямо из Интернета.

Хорошо, без лишних слов, приступим!

Импорт и набор данных

Что касается импорта, нам понадобятся две библиотеки - Pandas и Plotly. Вот как их импортировать:

import pandas as pd
import plotly.graph_objs as go
import plotly.offline as pyo

Что касается набора данных, мы возьмем его прямо с GitHub. Это хорошо известный набор данных об автомобилях, идеально подходящий для того типа визуализации, который мы будем делать:

df = pd.read_csv(‘https://raw.githubusercontent.com/plotly/datasets/master/mtcars.csv')
df.head()

Хорошо, вот и все, давайте теперь перейдем к хорошему.

Диаграммы разброса

Основная идея диаграммы рассеяния состоит в том, чтобы визуализировать взаимосвязь между набором переменных. Под отношениями мы понимаем зависимость между переменными - или движение - что происходит со второй переменной, если первая переместится на некоторую величину - или корреляцию, чтобы выразиться проще.

Диаграммы разброса чрезвычайно просто создать с помощью Plotly - ну, почти все (кроме карт, они могут быть проблемой внизу, но подробнее об этом в паре статей), поскольку нам нужно определить хорошо известные параметры data и layout.

Как и в случае с линейными графиками, мы будем использовать go.Scatter() для наших данных, но нам нужно будет указать mode='markers', чтобы все работало правильно.

Вот как вы визуализируете атрибуты hp (лошадиные силы) по оси x и mpg (миль на галлон) по оси Y:

fig = go.Figure(
    data=[
        go.Scatter(
            x=df[‘hp’],
            y=df[‘mpg’],
            mode=’markers’,
        )
    ],
    layout=go.Layout(
        title=dict(
            text=’Horsepower vs. MPG’,
            font=dict(size=20)
        ),
        hovermode=’closest’
    )
)
pyo.plot(fig)

Не слишком много строк кода, но давайте посмотрим, к чему это приведет:

Я знаю, о чем вы сейчас думаете:

  • Базовые точки слишком скучны
  • Цвет ужасный
  • Маркеры слишком маленькие

Что ж, давайте исправим эти проблемы:

fig = go.Figure(
    data=[
        go.Scatter(
            x=df[‘hp’],
            y=df[‘mpg’],
            mode=’markers’,
            marker=dict(
                size=16,
                symbol=’x-dot’,
                color=’#d35400'
            )
        )
    ],
    layout=go.Layout(
        title=dict(
            text=’Horsepower vs. MPG’,
            font=dict(size=20)
        ),
        hovermode=’closest’
    )
)
pyo.plot(fig)

Каждую проблему, с которой мы сталкивались ранее, можно исправить, настроив параметры маркера с помощью аргумента marker. Вот как теперь выглядит наша диаграмма:

Все-таки не самое красивое, но пока сгодится. Давайте теперь исследуем старшего брата диаграмм рассеивания - пузырьковых диаграмм - чтобы увидеть, насколько просто отображать дополнительную информацию и устанавливать динамический размер.

Пузырьковые диаграммы

На всякий случай, если вы не прочитали всю статью, а вместо этого пропустили этот раздел, вам следует знать следующее: мы обычно используем пузырьковые диаграммы для отображения дополнительной информации либо через размер или color - или и то, и другое.

Например, предположим, что мы все еще хотим поместить hp (лошадиные силы) по оси x и mpg (миль на галлон) по оси Y, но мы также хотели бы установить размер как динамический - скажем, в соответствии с атрибуту wt (вес), а также установить динамический цвет - по количеству цилиндров cyl.

Звучит слишком много информации для одной диаграммы, но на самом деле это не так. Вот как реализовать вышесказанное в коде:

fig = go.Figure(
   data=[
       go.Scatter(
           x=df[‘hp’],
           y=df[‘mpg’],
           mode=’markers’,
           marker=dict(
               size=df[‘wt’] * 10,
               color=df[‘cyl’]
           )
       )
    ]
)
pyo.plot(fig)

Если вам интересно, мы умножили значение атрибута wt, потому что в противном случае оно было бы слишком маленьким. Не стесняйтесь настраивать это значение по своему усмотрению. Вот как выглядит диаграмма:

Отлично. У нас есть та же информация по обеим осям, что и с простой точечной диаграммой, но здесь отображаются два дополнительных элемента информации.

Если вы спросите меня, этого оттенка желтого слишком много, поэтому давайте посмотрим, как изменить цветовую палитру:

fig = go.Figure(
    data=[
        go.Scatter(
            x=df[‘hp’],
            y=df[‘mpg’],
            mode=’markers’,
            marker=dict(
                size=df[‘wt’] * 10,
                color=df[‘cyl’],
                colorscale=’Viridis’
            )
        )
    ]
)
pyo.plot(fig)

Вот как выглядит диаграмма:

Как видите, эта визуализация немного проще для глаз. Вы можете обратиться к этой странице, чтобы получить полный список доступных палитр.

Думаю, на сегодня хватит.

Прежде чем ты уйдешь

Надеюсь, для вас это было не слишком много - я знаю, что к синтаксису Plotly может потребоваться некоторое время, чтобы привыкнуть, - но это того стоит, если вы спросите меня.

В следующей статье будут рассмотрены круговые диаграммы и карты деревьев, так что следите за новостями, если вам это интересно.

Спасибо за прочтение.