Друзья, которым нравится использовать Python для создания проектов, неизбежно столкнутся с такой ситуацией: какой красивый и практичный инструментарий визуализации использовать при создании диаграмм? Когда в предыдущих статьях есть красивые диаграммы, всегда есть читатели на заднем плане, которые спрашивают, какие инструменты использовались для создания диаграммы. Ниже автор представляет восемь инструментов визуализации, реализованных на Python, некоторые из которых можно использовать и на других языках. Приходите и попробуйте, какой из них вам нравится?
Выбрано из среды,Автор: Аарон Фредерик, составлено Heart of Machines, участие: Ли Шимэн, Ван Шутин.
В Python существует множество способов создания графиков, но какой из них лучше? Прежде чем мы займемся визуализацией, давайте проясним некоторые вопросы о цели изображения: Вы хотите получить предварительное представление о распределении данных? Хотите произвести впечатление на людей своим шоу? Может быть, вы хотите показать кому-то внутренний образ, подлый образ?
В этой статье будут представлены некоторые часто используемые пакеты визуализации Python, включая преимущества и недостатки этих пакетов и сценарии, для которых они подходят. Эта статья расширяется только до 2D-диаграмм, оставляя место для следующего раза, когда я буду говорить о 3D-диаграммах и бизнес-отчетах (приборная панель), но многие из пакетов, о которых мы поговорим в этот раз, могут хорошо поддерживать 3D-диаграммы и бизнес-отчеты.
Matplotlib, Сиборн и Панды
Есть несколько причин для объединения этих трех пакетов: во-первых, Seaborn и Pandas построены поверх Matplotlib, и когда вы используете df.plot() в Seaborn или Pandas, вы фактически используете что-то, написанное в Matplotlib другим кодом. Таким образом, графы похожи по эстетике, и синтаксис для настройки графиков очень похож.
Когда речь заходит об этих инструментах визуализации, на ум приходят три слова: исследование, данные, анализ. Эти пакеты отлично подходят для изучения данных в первый раз, но их недостаточно для демонстрационных целей.
Matplotlib — относительно низкоуровневая библиотека, но уровень настройки, который она поддерживает, невероятен (поэтому не стоит просто исключать ее из демо-пакета!), но есть и другие инструменты, которые лучше подходят для презентации.
Matplotlib также имеет выбор стиля, который эмулирует популярные инструменты для украшения, такие как ggplot2 и xkcd. Вот пример графика, который я сделал с помощью Matplotlib и связанных с ним инструментов:
При работе с данными о зарплате баскетбольной команды я хочу найти команду с самой высокой средней зарплатой. Чтобы показать результаты, я выделил цветом зарплату каждой команды в виде гистограммы, чтобы показать, к какой команде присоединился игрок, чтобы получить более выгодную сделку.
import seaborn as snsimport matplotlib.pyplot as pltcolor_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, palette=color_order).set_title('Teams with Highest Median Salary')plt.ticklabel_format(style='sci', axis='y', scilimits=(0,0))
Второй график представляет собой график Q-Q остатков регрессионного эксперимента. Основная цель этой диаграммы — показать, как сделать полезную диаграмму с минимальным количеством линий, хотя, конечно, она может быть не такой красивой.
import matplotlib.pyplot as pltimport scipy.stats as stats#model2 is a regression modellog_resid = model2.predict(X_test)-y_teststats.probplot(log_resid, dist="norm", plot=plt)plt.title("Normal Q-Q plot")plt.show()
Matplotlib и связанные с ней инструменты оказались очень эффективными, но не лучшими инструментами для презентации.
ggplot(2)
Вы можете спросить: «Аарон, ggplot — наиболее часто используемый пакет визуализации в R, но не собираетесь ли вы написать пакет для Python?». Люди реализовали ggplot2 на Python, воспроизведя в этом пакете все, от украшения до синтаксиса.
Во всем материале, который я видел, он очень похож на ggplot2 во всем, но что приятно в этом пакете, так это то, что он опирается на пакет Pandas Python. Однако пакет Pandas Python недавно устарел для некоторых методов, что привело к несовместимости версий Python.
Если вы хотите использовать настоящие ggplots в R (они выглядят, работают и синтаксис такие же, за исключением зависимостей), я обсуждал это в другом посте.
Тем не менее, если вы должны использовать ggplot в Python, у вас должен быть установлен Pandas версии 0.19.2, но я рекомендую вам не понижать версию Pandas, чтобы использовать пакеты для построения графиков более низкого уровня.
Причина, по которой ggplot2 (и я думаю, что ggplot Python тоже) так важны, заключается в том, что они используют «грамматику графики» для построения изображений. Основная предпосылка заключается в том, что вы можете создать экземпляр графика, а затем добавить различные функции по отдельности, то есть вы можете отдельно украсить заголовки, оси, точки данных, линии тренда и т. д.
Ниже приведен простой пример кода ggplot. Сначала мы создаем экземпляр графика с помощью ggplot, настраиваем свойства и данные украшения, а затем добавляем точки, темы, а также метки осей и заголовков.
#All Salariesggplot(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 ($)')
Bokeh
Боке красивое. Концептуально Bokeh похож на ggplot тем, что оба используют графический синтаксис для создания изображений, но Bokeh имеет простой в использовании интерфейс для профессиональной графики и бизнес-отчетов. Чтобы проиллюстрировать это, я написал код для создания гистограммы на основе набора данных 538 Masculinity Survey:
import pandas as pdfrom bokeh.plotting import figurefrom bokeh.io import show# is_masc is a one-hot encoded dataframe of responses to the question:# "Do you identify as masculine?"#Dataframe Prepcounts = is_masc.sum()resps = is_masc.columns#Bokehp2 = 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)#Pandascounts.plot(kind='bar')
Красная полоса представляет собой ответы 538 человек на вопрос «Считаете ли вы себя мужественным?» Строки 9–14 кода Bokeh строят элегантную и профессиональную гистограмму количества откликов — с разумным размером шрифта, масштабом по оси Y и форматированием.
Большая часть кода, который я пишу, используется для маркировки осей и заголовков, а также для добавления цветов и границ к столбчатым диаграммам. Когда дело доходит до создания красивых и выразительных изображений, я предпочитаю использовать Боке — оно нам очень помогло.
Синее изображение — строка 17 выше. Значения двух гистограмм одинаковы, но назначение разное. В исследовательской среде удобно написать одну строку кода в Pandas для просмотра данных, но возможности украшения Bokeh очень мощные.
Все удобства, которые предоставляет Bokeh, настраиваются в matplotlib, включая угол наклона меток оси X, фоновые линии, деления оси Y и шрифты (размер, курсив, полужирный) и т. д. На изображении ниже показаны некоторые случайные тренды с более высокой степенью настройки: используются легенда, разные цвета и линии.
Боке также является отличным инструментом для создания интерактивных бизнес-отчетов.
Plotly
Plotly — очень мощный инструмент, но его настройка и создание графиков отнимает много времени и не интуитивно понятна. Проработав с Plotly большую часть утра, я почти ничего не приготовил и сразу пошел ужинать. Я создал только гистограммы без меток координат и «графики рассеяния» без возможности удаления линий. Приступая к работе с Ploty, следует помнить о нескольких вещах.
При установке у вас должен быть API-ключ и регистрация, а не просто установка с помощью pip;
Данные и объекты макета, отображаемые Plotly, уникальны, но не интуитивно понятны;
Макет изображения у меня не работает (40 строк кода ничего не значат!)
Но у него есть и плюсы, а все минусы в настройке имеют соответствующие обходные пути:
Вы можете редактировать изображения на веб-сайте Plotly и в среде Python;
Поддержка интерактивных изображений и бизнес-отчетов;
Plotly сотрудничает с Mapbox для настройки карты;
Большой потенциал для рисования хорошей графики.
Вот код, который я написал для этого пакета:
#plot 1 - barplot# **note** - the layout lines do nothing and trip no errorsdata = [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 scatterplotdata = [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')[Image: image.png]
Гистограмма, показывающая средние обороты в минуту для разных команд НБА.
Диаграмма рассеяния, показывающая взаимосвязь между зарплатой и игровым временем в НБА.
В целом, инструменты для украшения выглядят нормально из коробки, но мои многочисленные попытки скопировать документ дословно и изменить метки осей не увенчались успехом. Но на графике ниже показан потенциал Plotly и то, почему я трачу на него часы:
Pygal
Pygal менее известен, и, как и другие широко используемые пакеты для построения графиков, он использует синтаксис графического фреймворка для построения изображений. Это относительно простой пакет рисования из-за простоты цели рисования. Использовать Pygal очень просто:
созданное изображение;
отформатировано с атрибутом цели изображения;
Используйте figure.add() для добавления данных к изображению.
Основная проблема, с которой я столкнулся при работе с Pygal, — это рендеринг изображений. Пришлось использовать опцию render_to_file и открыть файл в веб-браузере, чтобы увидеть, что я только что построил.
В конце концов, кажется, оно того стоит, потому что изображения интерактивны, с приятными и настраиваемыми функциями украшения. В целом, пакет выглядит хорошо, но он немного громоздкий в части создания файла и рендеринга.
Networkx
Хотя Networkx основан на matplotlib, он по-прежнему является отличным решением для анализа и визуализации графов. Графики и сети не являются моей областью знаний, но Networkx позволяет быстро и легко графически представлять связи между сетями. Вот различные представления, которые я построил для простого графика, и некоторый код, загруженный из Stanford SNAP (для рисования небольших сетей Facebook).
Я закодировал каждый узел цветом по номеру (1~10) со следующим кодом:
options = { 'node_color' : range(len(G)), 'node_size' : 300, 'width' : 1, 'with_labels' : False, 'cmap' : plt.cm.coolwarm}nx.draw(G, **options)
Код, используемый для визуализации упомянутого выше разреженного графа Facebook, выглядит следующим образом:
import itertoolsimport networkx as nximport matplotlib.pyplot as pltf = 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 демонстрирует эту разреженность за счет максимального разделения каждого кластера.
Существует множество пакетов для визуализации данных, но нельзя сказать, какой из них лучший. Надеюсь, прочитав эту статью, вы сможете понять, как использовать различные инструменты и коды для украшения в разных ситуациях.