Визуализации - отличный способ показать историю, которую хотят рассказать данные. Однако не все визуализации построены одинаково. Мое практическое правило - придерживаться простых, понятных и хорошо размеченных графиков. Лучше всего всегда работают линейные графики, гистограммы и гистограммы. Наиболее известные библиотеки для визуализации - matplotlib и seaborn. Seaborn построен на основе matplotlib, поэтому сначала стоит взглянуть на matplotlib, но в этой статье мы рассмотрим только matplotlib. Давайте начнем. Сначала мы импортируем все библиотеки, с которыми будем работать.

import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

Мы импортировали numpy, поэтому можем генерировать случайные данные. Из matplotlib мы импортировали pyplot. Если вы работаете над визуализацией в jupyter notebook, вы можете вызвать встроенную команду% matplotlib. Это позволит jupyter notebook отображать ваши визуализации непосредственно под запущенным кодом. Если вам нужна интерактивная диаграмма, вы можете вызвать команду% matplotlib. Это позволит вам управлять визуализацией, например увеличивать и уменьшать масштаб, а также перемещать их вокруг своей оси.

Гистограммы

Во-первых, давайте посмотрим на гистограммы на matplotlib. Посмотрим на нормальное распределение. Давайте создадим его с помощью numpy и визуализируем с помощью matplotlib.

normal_distribution = np.random.normal(0,1,10000)
plt.hist(normal_distribution)
plt.show()

Большой! У нас была гистограмма. Но что мы только что сделали? Сначала мы взяли 10 000 случайных выборок из распределения среднего 0 и стандартного отклонения 1. Затем мы вызвали метод hist () из matplotlib. Наконец, мы вызвали метод show () для отображения нашей фигуры. Однако наша гистограмма выглядит как… квадратной. Не бойся! Вы можете изменить ширину каждого бункера с помощью аргумента бункеры. Matplotlib по умолчанию 10, если аргумент не указан. Есть несколько способов подсчета интервалов, но я предпочитаю установить его на «авто».

plt.hist(normal_distribution,bins='auto')
plt.show()

!

Намного лучше. Знаете, что было бы вдвое веселее? Если мы визуализируем другое распределение, но если мы визуализируем его на той же гистограмме, то это будет в три раза веселее. Это именно то, что мы собираемся делать.

modified_distribution = np.random.normal(3,1.5,10000)
plt.hist(normal_distribution,bins='auto',color='purple',label='Purple')
plt.hist(modified_distribution,bins='auto',color='green',alpha=.75,label='Green')
plt.legend(['Purple','Green'])
plt.show()

Ух ты! Это забавная гистограмма. Что только что случилось? Мы перешли от одной синей гистограммы к одной фиолетовой и одной зеленой. Давайте пройдемся по тому, что мы добавили. Во-первых, мы создали еще один дистрибутив с именем modified_distribution. Затем мы изменили цвет каждого распределения с помощью аргумента color, передали аргумент label для наименования каждого распределения и передали аргумент alpha. чтобы зеленое распределение было видно насквозь. Наконец, мы передали имя каждого распределения методу legend (). Если у вас есть более одного набора данных на одной диаграмме, необходимо пометить данные, чтобы иметь возможность различать данные. В этом примере данные можно легко разделить, но в реальном мире каждый набор данных может представлять вещи, которые нельзя идентифицировать по цвету. Например, зеленый цвет может обозначать рост студентов мужского пола, а фиолетовый - рост студенток колледжа. Конечно, если бы это было так, ось X была бы в другом масштабе.

Гистограммы

Продолжим веселье. Теперь посмотрим на гистограммы. Этот вид диаграмм действительно полезен при попытке визуализировать количества, поэтому давайте рассмотрим пример. В этом случае мы визуализируем, как люди голосовали, когда их спрашивали о том, какое животное они имеют или хотели бы иметь. Давайте сгенерируем данные случайным образом.

options = ['Cats','Dogs','Parrots','Hamsters']
votes = [np.random.randint(10,100) for i in range(len(options)]
votes.sort(reverse=True)

Отлично, у нас есть список домашних животных и список случайно сгенерированных чисел. Обратите внимание, мы отсортировали список в порядке убывания. Мне нравится упорядочивать список таким образом, потому что легче увидеть, какая категория самая большая и самая маленькая. Конечно, в этом примере мы просто упорядочили голоса, не упорядочивая варианты, которые ему соответствуют. На самом деле нам пришлось бы заказать и то, и другое. Я обнаружил, что самый простой способ сделать это - создать словарь и упорядочить словарь по значениям. Щелкните здесь для получения полезного руководства по stackoverflow о том, как упорядочивать словари по значениям. Теперь давайте визуализируем наши данные.

plt.bar(options,votes)
plt.title('Favorite Pet Survey')
plt.xlabel('Options')
plt.ylabel('Votes')
plt.show()

Большой! У нас есть потрясающе выглядящий график. Обратите внимание, мы легко можем сказать, что кошки получили наибольшее количество голосов, а хомяки получили наименьшее количество голосов. Посмотрим на код. После того, как мы определили наш X и высоту, мы вызвали метод bar () для построения гистограммы. Мы передали параметры как X и голоса как высоту. Затем мы пометили заголовок, ось X и ось y с помощью методов title (), xlabel () и ylabel () соответственно. Достаточно просто! Однако эта гистограмма выглядит немного скучной. Давайте сделаем так, чтобы это выглядело весело.

with plt.style.context('ggplot'):
    plt.bar(options,votes)
    plt.title('Favorite Pet Survey')
    plt.xlabel('Options')
    plt.ylabel('Votes')
    plt.show()

Этот график очень интересный. Как мы это сделали? Обратите внимание, весь наш код выглядит в основном одинаково, но есть важный код, который мы добавили, и мы изменили формат. Мы добавили ключевое слово with и метод context () из plt.style, чтобы изменить стиль нашей диаграммы. На самом деле круто то, что он меняет его только для всего, что находится непосредственно под ним и с отступом. Важно делать отступ в коде после первой строки. Мы использовали стиль ggplot, чтобы сделать наш график более увлекательным. Щелкните здесь, чтобы просмотреть все стили, доступные в matplotlib. Если мы хотим сравнить два набора данных с одинаковыми параметрами, это немного сложнее, чем в гистограммах, но это не менее интересно. Допустим, мы хотим визуализировать голосование мужчин и женщин по каждой категории.

votes_male = votes
votes_female = [np.random.randint(10,100) for i in range(len(options))]
import pandas as pd
with plt.style.context('ggplot'):
    pd.DataFrame({'male':votes_male,'female':votes_female,index=options).plot(kind='bar')
    plt.title('Favorite Pet Survey (Male vs Female)')
    plt.xticks(rotation=0)
    plt.ylabel('votes')
    plt.show()

Здесь много чего происходит, но большую часть вы уже видели. Начнем сверху. Во-первых, мы переименовали данные о голосах в vote_male и сгенерировали новые данные для Vote_female. Затем мы импортировали pandas - библиотеку для работы с фреймами данных. Мы создали фрейм данных для наших данных с мужчинами и женщинами в качестве столбцов и параметрами домашних животных в качестве индекса. После этого мы вызвали метод plot () из фрейма данных и передали столбец для аргумента kind, чтобы мы могли построить столбчатую диаграмму. С помощью метода построения фрейма данных он добавляет за вас X-метки, но они расположены под углом 90 градусов. Чтобы исправить это, вы можете вызвать метод xticks () из pyplot и передать аргумент вращение 0. Это сделает текст похожим на график выше.

Линейный график

Теперь давайте посмотрим на линейные графики. Эти графики отлично подходят для визуализации того, как изменяется Y при изменении X. Чаще всего они используются для визуализации данных временных рядов. В этом примере мы визуализируем, сколько воды использует новый город по мере роста его населения.

town_population = np.linspace(0,10,10)
town_water_usage = [i*5 for i in town_population]
with plt.style.context('seaborn'):
    plt.plot(town_population,town_water_usage)
    plt.title('Water Usage of Cool Town by Population')
    plt.xlabel('Population (in thousands)')
    plt.ylabel('Water usage (in thousand gallons)')
    plt.show()

Какой красивый график! Как видите, мы использовали все, что узнали до сих пор, для создания этого графика. Единственная разница в том, что метод, который мы вызвали, не такой интуитивно понятный, как другие. В этом случае мы вызвали метод plot (). Мы передали X и Y, пометили нашу диаграмму и визуализировали ее с помощью метода show (). Давайте добавим больше данных. На этот раз мы собираемся добавить использование воды в соседнем городе.

nearby_town_water_usage = [i*.85 for i in town_water_usage]
with plt.style.context('seaborn'):
    plt.plot(town_population,town_water_usage,label='Cool Town')
    plt.plot(town_population,nearby_town_water_usage,label='Lame Town')
    plt.title('Water Usage of Cool Town and Lame Town')
    plt.xlabel('Population (in thousands)')
    plt.ylabel('Water usage (in thousand gallons)')
    plt.legend(['Cool Town','Lame Town'])
    plt.show()

Как вы можете видеть, мы только что добавили еще один график (), пометили каждую строку, обновили заголовок и показали легенду графика. По большей части это тот же процесс, что и для других графиков. Из графика мы видим, что Хромой Город на самом деле использует меньше воды, чем Прохладный город. Думаю, Lame Town не такой уж и хромой.

Заключение

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