fbpx
  • Обзор пакетов для визуализации данных на Python

    python data visualization

    Есть много способов построения графиков на Python, но какой из них лучше? Когда вы делаете визуализацию, важно задать несколько вопросов о цели построения графика: пытаетесь ли вы создать первичное представление ваших данных для дальнейшего анализа, или пытаетесь произвести впечатление на презентации?

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

    Перевод статьи «Reviewing Python Visualization Packages», автор — Aaron Frederick, ссылка на оригинал — в подвале статьи.

    Matplotlib, Seaborn и Pandas

    Я собираюсь включить их в одну группу по нескольким причинам. Во-первых, из-за того, что графики Seaborn и Pandas были построены на основе Matplotlib — когда вы используете Seaborn или df.plot() в Pandas, вы фактически используете код, который использует для построения Matplotlib. Таким образом, эстетика для них схожа, и настройка ваших графиков будет выглядеть очень похожим образом.

    Когда я думаю об этих инструментах визуализации, я думаю о трех словах: исследовательский анализ данных. Эти пакеты отлично подходят для первого взгляда на ваши данные, но их не хватает, когда дело доходит до презентации. Matplotlib — это низкоуровневая библиотека, которая обеспечивает невероятные уровни настройки (так что не стоит исключать ее как вариант для презентации!), Но есть много других инструментов, которые делают великолепную графику, достойную презентации, намного проще. Matplotlib также имеет набор стилей, которые по внешнему стилю имитируют другие популярные пакеты, такие как ggplot2 и xkcd. Ниже приведены некоторые примеры графиков, созданных с использованием Matplotlib и его двоюродных братьев.

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

    import seaborn as sns
    import matplotlib.pyplot as plt
    
    color_order = ['xkcd:cerulean', 'xkcd:ocean',
    'xkcd:black','xkcd:royal purple',
    'xkcd:royal purple', 'xkcd:navy blue',
    'xkcd:powder blue', 'xkcd:light maroon',
    'xkcd:lightish blue','xkcd:navy']
    
    sns.barplot(x=top10.Team,
    y=top10.Salary,
    Простая гистограмма в matplotlib
    Простая гистограмма в matplotlib

    Этот второй график представляет собой график Q-Q остатков регрессионного эксперимента. Основная цель этой визуализации — показать, сколько строк необходимо для создания полезной визуализации, даже если эстетика не сногсшибательна.

    import matplotlib.pyplot as plt
    import scipy.stats as stats
    
    #model2 is a regression model
    log_resid = model2.predict(X_test)-y_test
    stats.probplot(log_resid, dist="norm", plot=plt)
    plt.title("Normal Q-Q plot")
    plt.show()

    Q-Q график на matplotlib

    В конечном счете, Matplotlib и его родственники очень эффективны, но, как правило, не являются конечным продуктом в плане презентации.

    ggplot (2)

    «Почему ты говоришь о ggplot, самом популярном пакете визуализации R? Разве это не обзор пакетов для Python? »- спросите вы. Люди реализовали ggplot2 в Python, копируя все от эстетики до синтаксиса. Он выглядит и ощущается как ggplot2, но с дополнительным бонусом наличия зависимости от уже устаревшей версии пакета Pandas. Если вы хотите использовать НАСТОЯЩИЙ ggplot в R (который имеет такой же синтаксис и внешний вид, но без зависимостей), я расскажу о некоторых его преимуществах здесь! Тем не менее, если вы действительно хотите использовать ggplot в Python, вы должны установить Pandas версии 0.19.2, но я бы предостерег вас от понижения версии вашего Pandas.

    В чем ggplot2 (и, я думаю, ggplot для Python) меняет правила игры, так это то, что он использует «Грамматику графики» для построения фигуры. Основная предпосылка заключается в том, что вы можете создать экземпляр своего графика, а затем отдельно добавить к нему различные функции, т.е. Заголовок, оси, точки данных и линия тренда добавляются по отдельности со своими собственными эстетическими свойствами. Ниже приведен простой пример кода ggplot на R. Сначала мы создаем наш рисунок с помощью ggplot, устанавливаем наше оформление и данные, затем добавляем точки, тему и метки оси/заголовка.

    #All Salaries
    ggplot(data=df, aes(x=season_start, y=salary, colour=team)) +
    geom_point() +
    theme(legend.position="none") +
    labs(title = 'Salary Over Time', x='Year', y='Salary ($)')

    График в ggplot

    Bokeh

    Bokeh это красиво. Концептуально похож на ggplot в том,что он тоже использует грамматику графики для структурирования своих фигур. Bokeh имеет простой в использовании интерфейс, который создает очень профессиональные графики и информационные панели. Чтобы проиллюстрировать мою точку зрения (извините!), Ниже приведен пример кода для создания гистограммы из набора данных 538 Masculinity Survey.

    import pandas as pd
    from bokeh.plotting import figure
    from bokeh.io import show
    
    # is_masc is a one-hot encoded dataframe of responses to the question:
    # "Do you identify as masculine?"
    
    #Dataframe Prep
    counts = is_masc.sum()
    resps = is_masc.columns
    
    #Bokeh
    p2 = figure(title='Do You View Yourself As Masculine?',
              x_axis_label='Response',
              y_axis_label='Count',
              x_range=list(resps))
    p2.vbar(x=resps, top=counts, width=0.6, fill_color='red', line_color='black')
    show(p2)
    
    #Pandas
    counts.plot(kind='bar')
    
    
    Гистограмма в Bokeh
    Гистограмма в Bokeh

    Гистограмма показывает ответы на вопрос «Вы идентифицируете себя как мужского пола?», как было задано в недавнем опросе (538 Masculinity Survey). Код Bokeh создает элегантную и профессиональную гистограмму подсчета ответов с разумным размером шрифта, засечками по осям и форматированием. Большая часть кода, который я написал, была посвящена маркировке осей и заголовков, а также приданию столбцам цвета и границы. Делая красивые, презентабельные фигуры, я очень сильно склоняюсь к Bokeh — много эстетической работы уже сделано для нас!

    Гистограмма по умолчанию в Pandas
    Та же гистограмма по умолчанию в Pandas

    Синий график — это то, что происходит из единственной последней строки из кода выше. Обе гистограммы имеют одинаковые значения, но служат разным целям. В исследовательской обстановке гораздо удобнее написать одну строку в Pandas, чтобы увидеть данные, но эстетика Bokeh явно явно лучше. Каждое удобство, которое обеспечивает Bokeh по умолчанию, требует настройки в matplotlib, будь то угол наложения меток вдоль горизонтальной оси, фоновые линии, разброс делений по вертикальной оси, изменение размера шрифта/выделение курсивом/выделение жирным и т.д.

    На приведенном ниже графике показано несколько случайных трендов с использованием нескольких дополнительных настроек с легендами и различными типами линий и цветами:

    Тренды с легендой в Bokeh
    Тренды с легендой в Bokeh

    Bokeh также отличный инструмент для создания интерактивных графиков (dashboards). Я не хочу вдаваться в интерактивные графики в этом посте, но есть отличные посты (вроде этого), которые больше рассказывают о применении и реализации интерактивных графиков в Bokeh.

    Plotly

    Plotly чрезвычайно мощный, но настройка и создание графиков в нем занимают много времени, и эта настройка не является интуитивно понятной. Проведя большую часть утра, работая с Plotly, я пошел на обед, почти ничего не показав в результате. Я создал гистограмму без меток на осях и диаграмму рассеяния, в которой были линии, которые я не мог удалить. Некоторые заметные минусы при начале работы с Plotly:

    • Требуется ключ API и регистрация, а не просто установка через pip
    • Он строит графики данных/слоев (layouts), которые являются уникальными для Plotly и не являются интуитивно понятными
    • Слой на графике у меня не сработал (40 строк кода буквально ничего!)

    Однако для всех его недостатков настройки есть свои плюсы и обходные пути:

    • Вы можете редактировать графики на веб-сайте Plotly, а также в среде Python.
    • Много функционала поддержки интерактивных графиков/панелей
    • Plotly сотрудничает с Mapbox, что позволяет создавать индивидуальные карты
    • Потрясающий потенциал для отличной графики

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

    #plot 1 - barplot
    # **note** - the layout lines do nothing and trip no errors
    data = [go.Bar(x=team_ave_df.team,
      y=team_ave_df.turnovers_per_mp)]
    
    layout = go.Layout(
    
    title=go.layout.Title(
      text='Turnovers per Minute by Team',
      xref='paper',
      x=0
    ),
    
    xaxis=go.layout.XAxis(
      title = go.layout.xaxis.Title(
        text='Team',
        font=dict(
          family='Courier New, monospace',
          size=18,
          color='#7f7f7f'
        )
      )
    ),
    
    yaxis=go.layout.YAxis(
      title = go.layout.yaxis.Title(
        text='Average Turnovers/Minute',
        font=dict(
          family='Courier New, monospace',
          size=18,
          color='#7f7f7f'
        )
      )
    ),
    
    autosize=True,
    hovermode='closest')
    
    py.iplot(figure_or_data=data, layout=layout, filename='jupyter-plot', sharing='public', fileopt='overwrite')
    
    #plot 2 - attempt at a scatterplot
    data = [go.Scatter(x=player_year.minutes_played,
    y=player_year.salary,
    marker=go.scatter.Marker(color='red',
    size=3))]
    
    layout = go.Layout(title="test",
    xaxis=dict(title='why'),
    yaxis=dict(title='plotly'))
    
    py.iplot(figure_or_data=data, layout=layout, filename='jupyter-plot2', sharing='public')
    Гистограмма в Plotly
    Гистограмма, представляющая среднее количество оборотов в минуту у различных баскетбольных команд
    Попытка создания диаграммы рассеивания в Plotly
    Попытка создания диаграммы рассеяния, представляющей зарплату как функцию от времени игры в баскетбол

    В целом, эстетика из коробки выглядит хорошо, но многочисленные попытки исправить метки осей, дословно копирующие документацию, не дали никаких изменений. Однако, как я и обещал ранее, вот несколько графиков, на которых показан потенциал Plotly и почему стоит потратить больше нескольких часов:

    Потенциал графиков в Plotly
    Потенциал графиков в Plotly

    Pygal

    Pygal — немного менее известный пакет для визуализаций, который, как и другие популярные пакеты, использует грамматику графики для построения своих изображений. Это относительно простой пакет из-за того, что все объекты на графике очень примитивные. Использование Pygal очень простое:

    1. Инициализация холста
    2. Форматирование объектов рисунка с использованием атрибутов
    3. Добавление данных к своей фигуре, используя figure.add()

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

    График в Pygal

    Networkx

    Networkx — отличное решение для анализа и визуализации графов, хотя визуально оно основано на matplotlib. Графы и сети — это не моя предметная область, но Networkx позволяет быстро и легко графически представлять подключенные сети. Ниже приведены несколько различных представлений простого графа, который я построил, и код, начинающий строить небольшую сеть Facebook, загруженную из SNAP в Стэнфорде.

    Граф в Networkx

    Код, который я использовал для цветового кодирования каждого узла по его номеру (1–10), приведен ниже:

    options = {
    'node_color' : range(len(G)),
    'node_size' : 300,
    'width' : 1,
    'with_labels' : False,
    'cmap' : plt.cm.coolwarm
    }
    nx.draw(G, **options)

    Разноцветные вершины графа в Networkx

    Ниже приведен код, который я написал для визуализации разреженного графа Facebook, упомянутого выше:

    import itertools
    import networkx as nx
    import matplotlib.pyplot as plt
    
    f = open('data/facebook/1684.circles', 'r')
    circles = [line.split() for line in f]
    f.close()
    
    network = []
    for circ in circles:
    cleaned = [int(val) for val in circ[1:]]
    network.append(cleaned)
    
    G = nx.Graph()
    for v in network:
    G.add_nodes_from(v)
    
    edges = [itertools.combinations(net,2) for net in network]
    
    for edge_group in edges:
    G.add_edges_from(edge_group)
    
    options = {
    'node_color' : 'lime',
    'node_size' : 3,
    'width' : 1,
    'with_labels' : False,
    }
    nx.draw(G, **options)
    Разреженный граф в Networkx
    Это разреженный граф. Networkx показывает это, давая каждому кластеру максимальное разделение

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