Графика на языке Python с matplotlib
matplotlib — это наиболее широко используемая научная библиотека построения графиков в Python.
- Обычно используется суб-библиотека под названием matplotlib.pyplot.
- Записная книжка Jupyter будет отображать графики встраиваемыми, если мы попросим ее использовать “волшебную” команду.
%matplotlibinline
importmatplotlib.pyplotкакplt
- Обычные сюжеты (довольно) просты в создании.
time = [0, 1, 2, 3]
position = [0, 100, 200, 300]plt.plot(time, position)
plt.xlabel(‘Время (hr)’)
plt.ylabel(‘Позиция (km)’)
Простой позиционно-временной график
Отображение всех открытых фигур
В нашем примере JupyterNotebook с %matplotlibinline запуск ячейки генерирует фигуру непосредственно под кодом. Рисунок также включен в документ блокнота для дальнейшего просмотра. Однако другие среды Python требуют дополнительной команды для отображения рисунка.
Проинструктируйте matplotlib, чтобы показать фигуру:
plt.show()
Эта команда также может быть использована в Записной книжке — например, для отображения нескольких фигур, если несколько созданы одной ячейкой.
Построение графика данных непосредственно из фрейма данных Pandas
- Мы также можем построить фреймы данных панд.
- Он неявно использует matplotlib.pyplot.
- Перед построением графика мы преобразуем заголовки столбцов из строкового типа данных в целочисленный, так как они представляют собой числовые значения
import pandas as pd
data = pd.read_csv(‘data/gapminder_gdp_oceania.csv’, index_col=’страна’)
Извлечь год из последних 4 символов имени каждого столбца. Текущие имена столбцов структурированы как » gdpPercap_(year)»., таким образом, мы хотим сохранить часть (год) только для ясности при построении графика ВВП по сравнению с годами. Для этого мы используем strip(), который удаляет из строки символы, указанные в аргументе. Этот метод работает со строками, поэтому мы вызываем str перед strip()
years = data.columns.str.strip(‘gdpPercap_’)
Преобразование значений года в целые числа, сохранение результатов обратно в фрейм данных.
data.columns = years.astype(int)
data.loc[‘Австралия’].plot()
График ВВП Австралии
Выберите и преобразуйте данные, а затем постройте график.
- По умолчанию DataFrame.plot строит графики со строками в качестве оси X.
- Мы можем транспонировать данные, чтобы построить несколько рядов.
data.T.plot()
plt.ylabel(‘ВВП на душу населения’)
График ВВП Австралии и Новой Зеландии
Доступно множество стилей сюжета. Например, сделайте гистограмму, используя более причудливый стиль.
plt.style.use(‘ggplot’)
data.T.plot(kind=’bar’)
plt.ylabel(‘ВВП на душу населения’)
Барплот ВВП Австралии
Данные также могут быть построены путем прямого вызова функции matplotlibplot.
- Команда plt.plot(x, y)
- Цвет и формат маркеров также могут быть заданы в качестве дополнительного необязательного аргумента, например, b — синяя линия, g-зеленая пунктирная линия.
Получение данных Австралии из dataframe
years = data.columns
gdp_australia = data.loc[‘Австралия’]plt.plot(years, gdp_australia, ‘g—‘)
Форматированный график ВВП для Австралии
Можно построить множество наборов данных вместе.
- Выберите данные по двум странам.
gdp_australia = data.loc[‘Австралия’]
gdp_nz = data.loc[‘Новая Зеландия’]
- Участок с разноцветными маркерами.
plt.plot(years, gdp_australia, ‘b-‘, label=’Australia’)
plt.plot(years, gdp_nz, ‘g-‘, label=’New Zealand’)
- СоздайтеLegend.
plt.legend(loc=’верхний левый’)
plt.xlabel(‘Год’)
plt.ylabel(‘ВВП на душу населения ($)’)
Добавление Legend
Часто при построении нескольких наборов данных на одном и том же рисунке желательно иметь легенду, описывающую данные. Это можно сделать в matplotlib в два этапа:
- Предоставьте метку для каждого набора данных на рисунке:
plt.plot(years, gdp_australia, label=’Australia’)
plt.plot(years, gdp_nz, label=’New Zealand’)
- Проинструктируйте matplotlib,чтобы создать легенду.
plt.legend()
По умолчанию matplotlib попытается поместить легенду в подходящее положение. Если вы предпочитаете указать позицию, это можно сделать с помощью аргумента loc=, например, чтобы поместить легенду в верхний левый угол графика, укажите loc=’верхний левый’
Форматированный график ВВП для Австралии и Новой Зеландии
- Постройте точечную диаграмму корреляции ВВП Австралии и Новой Зеландии
- Используйте либо plt.scatter, либо DataFrame.plot.scatter
plt.scatter(gdp_australia, gdp_nz)
Корреляция ВВП с использованием plt.scatter
data.T.plot.scatter(x = ‘Австралия’, y = ‘Новая Зеландия’)
Минимумы и максимумы
Заполните пробелы ниже, чтобы построить график минимального ВВП на душу населения с течением времени для всех стран Европы. Измените его еще раз, чтобы построить график максимального ВВП на душу населения в Европе с течением времени.
data_europe = pd.read_csv(‘data/gapminder_gdp_europe.csv’, index_col=’country’)
data_europe.___.plot(label=’min’)
data_europe.___
plt.legend(loc=’best’)
plt.xticks(вращение=90)
Решение
data_europe = pd.read_csv(‘data/gapminder_gdp_europe.csv’, index_col=’country’)
data_europe.min().plot(label=’min’)
data_europe.max().plot(label=’max’)
plt.legend(loc=’best’)
plt.xticks(rotation=90)
Корреляции
Измените пример в примечаниях, чтобы создать точечную диаграмму, показывающую взаимосвязь между минимальным и максимальным ВВП на душу населения среди стран Азии за каждый год в наборе данных. Какие отношения вы видите (если они есть)?
data_asia = pd.read_csv(‘data/gapminder_gdp_asia.csv’, index_col=’country’)
data_asia.describe().T.plot(kind=’scatter’, x=’min’, y=’max’)
Решение
Никаких особых корреляций между минимальными и максимальными значениями ВВП из года в год не наблюдается. Похоже, судьбы азиатских стран не растут и не падают вместе.
Вы можете заметить, что вариабельность максимума намного выше, чем вариабельность минимума. Взгляните на максимальные и максимальные индексы:
data_asia = pd.read_csv(‘data/gapminder_gdp_asia.csv’, index_col=’country’) data_asia
.max().plot()
print(data_asia.idxmax())
print(data_asia.idxmin())
Решение
Больше корреляций
Эта короткая программа создает график, показывающий корреляцию между ВВП и ожидаемой продолжительностью жизни в 2007 году, нормализуя размер маркера по населению:
data_all = pd.read_csv(‘data/gapminder_all.csv’, index_col=’country’)
data_all.plot(kind=’scatter’, x=’gdpPercap_2007′, y=’lifeExp_2007′,
s=data_all[‘pop_2007’]/1e6)
Используя онлайн — справку и другие ресурсы, объясните, что делает каждый аргумент для построения графика.
Решение
Сохранение вашего сюжета в файл
Если вы удовлетворены сюжетом, который видите, вы можете сохранить его в файл, возможно, включить в публикацию. В модуле matplotlib.pyplot есть функция, которая выполняет эту задачу: savefig. Вызов этой функции, например, с помощью:
plt.savefig(‘my_figure.png’)
Эта команда сохранит текущую цифру в файл my_figure.png. Формат файла будет автоматически выведен из расширения имени файла (другие форматы — pdf, ps, eps и svg).
Обратите внимание, что функции в plt ссылаются на глобальную переменную figure, и после отображения фигуры на экране (например, с помощью plt.show) matplotlib заставит эту переменную ссылаться на новую пустую фигуру. Поэтому обязательно вызовите plt.savefig перед отображением графика на экране, иначе вы можете найти файл с пустым графиком.
При использовании фреймов данных данные часто генерируются и выводятся на экран в одну строку, и plt.savefig, по-видимому, не является возможным подходом. Одна из возможностей сохранить рисунок в файл заключается в следующем:
- сохраняет ссылку на текущую цифру в локальной переменной (с помощью plt.gcf)
- вызывает метод класса savefig из этой переменной.
fig = plt.gcf() # get current figure
data.plot(kind=’bar’)
fig.savefig(‘my_figure.png’)
Сделайте ваши сюжеты доступными
Всякий раз, когда вы создаете сюжеты для статьи или презентации, есть несколько вещей, которые вы можете сделать, чтобы убедиться, что все могут понять ваши сюжеты. Всегда следите за тем, чтобы ваш текст был достаточно большим для чтения. Используйте параметр fontsize в xlabel, ylabel, title и legend, а также tick_params с labelsize, чтобы увеличить размер текста чисел на ваших осях.
Точно так же вы должны сделать так, чтобы элементы вашего графика были легко видны. Используйте s, чтобы увеличить размер маркеров диаграммы рассеяния, и linewidth, чтобы увеличить размеры линий графика.
Использование цвета (и ничего больше) для различения различных элементов сюжета сделает ваши сюжеты нечитаемыми для тех, кто дальтоник или у кого есть черно-белый офисный принтер. Для линий параметр linestyle позволяет использовать различные типы линий. Для диаграмм рассеяния маркер позволяет изменять форму точек. Если вы не уверены в своих цветах, вы можете использовать Coblis или ColorOracle, чтобы смоделировать, как ваши графики будут выглядеть для тех, кто страдает дальтонизмом.
Ключевые моменты
- Постройте график данных непосредственно из фрейма данных Pandas.
- Выберите и преобразуйте данные, а затем постройте график.
- Доступно множество стилей построения графиков: дополнительные параметры см. в галерее графиков Python.
- Можно построить множество наборов данных вместе.