Побудова графіків
Огляд
Викладання: 15 хв
Вправи: 15 хвПитання
Я побудувати графік за моїми даними?
Як зберегти графік для публікації?
Цілі
Створити графік часового ряду для одного набору даних.
Створити діаграму розсіювання, що показує зв’язок між двома наборами даних.
matplotlib
є найбільш відомою науковою бібіліотекою візуалізації даних на Python.
- Найчастіше використовують підбібліотеку, що має назву
matplotlib.pyplot
. - Jupyter Notebook відтворюватиме графікі вбудовано, якщо ми попросимо його про це за допомогою «магічної» команди
%matplotlib inline
import matplotlib.pyplot as plt
- Прості графіки (досить) легко створити.
time = [0, 1, 2, 3]
position = [0, 100, 200, 300]
plt.plot(time, position)
plt.xlabel('Time (hr)')
plt.ylabel('Position (km)')
Побудова графіків безпосередньо з Pandas dataframe
.
- Можна також використовувати Pandas dataframes.
- Це опосередковано використовує
matplotlib.pyplot
. - Перед побудовою графіка ми перетворюємо заголовки стовпців з типу даних “string” на “integer”, оскільки вони представляють числові значення.
import pandas as pd
data = pd.read_csv('data/gapminder_gdp_oceania.csv', index_col='country')
# Вилучаємо рік з останніх 4 символів назви кожного стовпця
# Поточні назви стовпців структуровані як 'gdpPercap_(year)',
# тому ми зберігаємо частину назви (рік) лише для чіткості під час побудови ВВП за роками
# Для цього ми використовуємо strip(), яка видаляє з рядка символи, що зазначені як аргумент
# Цей метод працює з рядками, тому ми викликаємо str перед strip()
years = data.columns.str.strip('gdpPercap_')
# Перетворіть значення років в цілі числа, зберігаючи результати назад у dataframe
data.columns = years.astype(int)
data.loc['Australia'].plot()
Виберіть і трансформуйте дані, а потім будуйте графік»
- За замовчуванням,
DataFrame.plot
зображує рядки на осі X. - Ми можемо транспонувати дані, щоб побудувати кілька графіків разом.
data.T.plot()
plt.ylabel('ВВП на душу населення')
Доступно багато типів графіків.
- Наприклад, створіть стовпчикову діаграму, використовуючи більш вишуканий стиль.
plt.style.use('ggplot')
data.T.plot(kind='bar')
plt.ylabel('ВВП на душу населення)
Графік також можна побудувати, викликавши безпосередньо функцію plot
бібліотеки matplotlib
.
- Формат команди є таким:
plt.plot(x, y)
- Колір / формат маркерів також можна вказати як оптичний аргумент: напр. «b-» — синя лінія, «g–» — зелена пунктирна лінія.
Отримаємо дані Австралії з dataframe.
years = data.columns
gdp_australia = data.loc['Australia']
plt.plot(years, gdp_australia, 'g--')
Можна побудувати кілька графіків за різними наборами даних разом
# Виберіть дані для двох країн.
gdp_australia = data.loc['Australia']
gdp_nz = data.loc['New Zealand']
# Побудуйте графіки з маркерами різних кольорів.
plt.plot(years, gdp_australia, 'b-', label='Australia')
plt.plot(years, gdp_nz, 'g-', label='New Zealand')
# Створіть легенду.
plt.legend(loc='upper left')
plt.xlabel('Year')
plt.ylabel('ВВП на душу населення ($)')
Додавання легенди
Часто при побудові графіків з кількох наборів даних разом бажано мати легенду, що містить опис даних.
Легенда може бути створеною in
matplotlib
за два кроки:
- Забезпечимо мітку для кожного набору даних на графіку:
plt.plot(years, gdp_australia, label='Australia') plt.plot(years, gdp_nz, label='New Zealand')
- Доручимо
matplotlib
створити легенду.plt.legend()
За замовчуванням matplotlib спробує розмістити легенду у відповідному місці. Якщо необхідно вказати конкретне розташування, можна застосувати аргументи функції
loc=
, наприклад, щоб розмістити легенду в лівому верхньому куті графіку, задайтеloc='upper left'
- Побудуємо точкову діаграму співвідношення ВВП Австралії та Нової Зеландії
- Використаємо
plt.scatter
абоDataFrame.plot.scatter
plt.scatter(gdp_australia, gdp_nz)
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(rotation=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())
Рішення
Здається, варіабельність цього значення пов’язана з різким падінням після 1972 року Можливо, якісь геополітичні фактори грають роль? Враховуючи домінування нафтовидобувних країн, можливо, індекс нафти Brent стане цікавим порівнянням? У той час як М’янма постійно має найнижчий ВВП, найвищий ВВП країн варіюється більш помітно.
Більше кореляцій
Ця невеличка програма створює графік, який демонструє кореляцію між ВВП і очікуваною тривалістю життя на 2007 рік, нормалізуючи розмір маркерів за чисельністю населення:
data_all = pd.read_csv('data/gapminder_all.csv', index_col='country') data_all.plot(kind='scatter', x='ВВП_на_душу_населення_2007', y='Тривалість_Життя_2007', s=data_all['pop_2007']/1e6)
Використовуючи онлайн help та інші ресурси, поясніть кожний аргумент функції
plot
.Рішення
Багато корисної інформації щодо функції plot - help(data_all.plot).
kind - Як уже було показано, цей параметр визначає тип графіку, який буде створено.
x та y - Назва стовпця або індекс, який визначає, які дані будуть розміщені на осях x і y графіка
s - Подробиці щодо цього параметру є в документації по plt.scatter. Це одне число або одне значення для кожної точки даних. Визначає розмір маркера.
Збереження вашого графіка в файл
Якщо вас задовольняє графік, який ви бачите, ви можете зберегти його у файл, можливо, щоб включити його у публікацію. Існує функція в модулі matplotlib.pyplot , яка виконує це: savefig. Виклик цієї функції, наприклад, наступним чином:
plt.savefig('my_figure.png')
збереже поточний графік у файл
my_figure.png
. Формат файла буде автоматично визначений з розширення файлу у його назві (інші формати
- це pdf, ps, eps and svg).
Зауважимо, що функції в
plt
посилаються на глобальну змінну графіка і після того, як графік виведено на екран (наприклад, за допомогоюplt.show
) matplotlib змусить цю змінну посилатися на новий порожній графік. Тому переконайтеся, що ви викликаєтеplt.savefig
перед тим, як графік буде відображено на екрані, інакше ви можете створити файл із порожнім графіком.При використанні dataframes дані часто генеруються та відображаються на екрані в один рядок, тому
plt.savefig
вважається не найкращім рішенням. Однією з можливостей зберегти графік у файл є
- зберегти посилання на поточний графік у локальну змінну (з
plt.gcf
) ,- та викликати метод
savefig
з класу тієї змінної.fig = plt.gcf() # посилання на поточний графік у локальній змінній data.plot(kind='bar') fig.savefig('my_figure.png')
Зробіть ваш графік доступним
Щоразу, коли ви створюєте графіки для статті чи презентації, ви можете зробити кілька речей, щоб переконатися, що всі зрозуміють ваші графіки.
- Завжди переконайтеся, що ваш текст достатньо великий для читання. Використовуйте параметр
fontsize
вxlabel
,ylabel
,title
, таlegend
, andtick_params
withlabelsize
щоб збільшити розмір тексту чисел на ваших осях.- Подібним чином, ви маєте зробити елементи графіка легкими для перегляду. Використовуйте
s
щоб збільшити розмір маркерів діаграми розсіювання, іlinewidth
щоб збільшити розміри ліній вашого графіка.- Використання кольору (і нічого іншого) для розрізнення різних елементів графіку зробить ваші графіки нечитабельними для будь-кого, хто є дальтоніком або має чорно-білий офісний принтер. Для ліній параметр
linestyle
дозволяє використовувати різні типи ліній. Для діаграм розсіюванняmarker
дозволяє змінювати форму ваших точок. Якщо ви не впевнені щодо своїх кольорів, ви можете скористатися Coblis or Color Oracle щоб імітувати, як виглядатимуть ваші графіки для людей з дальтонізмом
Ключові моменти
matplotlib
є найбільш розповсюдженою графічною бібліотекою у Python.Будуйте графіки безпосередньо з фрейму даних Pandas.
Виберіть і трансформуйте дані, а потім будуйте графік.
Доступно багато стилів графіку: перегляньте Python Graph Gallery for more options.
Можна будувати разом графіки за багатьма наборами даних.