Диаграммы рассеяния Matplotlib – Все, что вам нужно знать
Last updated
Last updated
В этом посте вы узнаете, как создавать диаграммы рассеяния Matplotlib, включая добавление нескольких цветов, добавление заголовков и меток осей, изменение размера маркеров, добавление легенд и настройку с помощью стилей Matplotlib.
Содержание
Для этого урока мы будем использовать Pandas и Matplotlib. Также давайте импортируем набор данных от Five Thirty Eight по очкам WNBA, который вы можете найти здесь
В наборе данных довольно много информации, и заголовки не самые понятные, поэтому нам придется немного их очистить.
Давайте начнем!
Matplotlib использует функцию .scatter()
для создания диаграмм рассеяния. Вы можете использовать аргументы x=
и y=
для передачи данных, а аргумент marker=
для установки типа маркера.
Давайте попробуем:
plt.scatter(x=df['Minutes'], y=df['Wins'],marker='o')
plt.show()
Это возвращает следующее изображение:
Это всего лишь один из многих доступных маркеров. Если вы хотите сменить маркер, вы можете выбрать из следующих маркеров:
available_markers = ['o', '.', ',', 'x', '+', 'v', '^', '<', '>', 's', 'd']
Добавление заголовков и меток осей к диаграммам рассеяния в Matplotlib может быть выполнено с помощью функций .title()
, .xlabel()
и .ylabel()
. Давайте добавим некоторые описательные заголовки к нашему графику:
plt.scatter(x=df['Minutes'], y=df['Wins'],marker='o')
plt.title('Minutes played vs. Games Won')
plt.xlabel('Minutes Played')
plt.ylabel('Games Won')
plt.show()
Это возвращает следующий график:
Мы можем изменить размер шрифта заголовка и меток осей, передав аргумент fontsize=
в соответствующие функции.
Let’s try changing the titles to make it a little prettier:
plt.scatter(x=df['Minutes'], y=df['Wins'],marker='o')
plt.title('Minutes played vs. Games Won', fontsize=18)
plt.xlabel('Minutes Played', fontsize=12)
plt.ylabel('Games Won', fontsize=12)
plt.show()
Это возвращает следующее изображение:
Добавление цвета на диаграмму рассеяния может быть отличным способом добавить еще одно измерение к вашим данным. Например, при использовании одного цвета на графике невозможно определить, какая команда какая. Следовательно, невозможно увидеть, существуют ли какие-либо необычные тенденции, связанные с одной командой по сравнению с другой.
Давайте изменим цвет команд, чтобы различать их:
atlanta = df[df['Team']=='Atlanta']
chicago = df[df['Team']=='Chicago']
plt.scatter(x=atlanta['Minutes'], y=atlanta['Wins'],marker='o', c='cornflowerblue')
plt.scatter(x=chicago['Minutes'], y=chicago['Wins'],marker='o', c='hotpink')
plt.title('Minutes played vs. Games Won', fontsize=18)
plt.xlabel('Minutes Played', fontsize=12)
plt.ylabel('Games Won', fontsize=12)
plt.show()
Мы разделили этот датафрейм на две разные команды. Это сделано для того, чтобы график каждого датафрейма можно было назначить одному цвету и затем наложить его на другой. Это не самый удобный способ, и, конечно, не такой упрощённый, как Seaborn делает это
Чтобы увидеть, какие еще цвета доступны, ознакомьтесь с официальной документацией, так как она довольно исчерпывающая.
В данный момент маркеры накладываются друг на друга, и невозможно увидеть, что находится под ними. Это можно исправить, добавив прозрачность маркерам. Мы можем сделать это с помощью параметра alpha=
в функции
Давайте установим прозрачность на уровне 0.6, что соответствует 60%:
plt.scatter(x=atlanta['Minutes'], y=atlanta['Wins'],marker='o', c='cornflowerblue', alpha=0.6)
plt.scatter(x=chicago['Minutes'], y=chicago['Wins'],marker='o', c='hotpink', alpha=0.6)
plt.title('Minutes played vs. Games Won', fontsize=18)
plt.xlabel('Minutes Played', fontsize=12)
plt.ylabel('Games Won', fontsize=12)
plt.show()
Это возвращает следующую диаграмму:
Добавление цвета по умолчанию не позволяет отличить каждую команду. Мы можем добавить легенду, используя параметр label=
в функции scatter()
, а затем добавив .legend(True)
.
По умолчанию Matplotlib попытается определить наилучшее место для легенды.
Давайте попробуем это в Python:
plt.scatter(x=atlanta['Minutes'], y=atlanta['Wins'],marker='o', c='cornflowerblue', alpha=0.6, label='Atlanta')
plt.scatter(x=chicago['Minutes'], y=chicago['Wins'],marker='o', c='hotpink', alpha=0.6, label='Chicago')
plt.title('Minutes played vs. Games Won', fontsize=18)
plt.xlabel('Minutes Played', fontsize=12)
plt.ylabel('Games Won', fontsize=12)
plt.legend()
plt.show()
Этот код возвращает следующий график:
Если мы захотим изменить место расположения на что-то конкретное, мы можем передать аргумент loc=
в функцию .legend()
. Давайте изменим его на нижний угол.
plt.scatter(x=atlanta['Minutes'], y=atlanta['Wins'],marker='o', c='cornflowerblue', alpha=0.6, label='Atlanta')
plt.scatter(x=chicago['Minutes'], y=chicago['Wins'],marker='o', c='hotpink', alpha=0.6, label='Chicago')
plt.title('Minutes played vs. Games Won', fontsize=18)
plt.xlabel('Minutes Played', fontsize=12)
plt.ylabel('Games Won', fontsize=12)
plt.legend(loc='lower right')
plt.show()
Это возвращает следующий график:
С таким количеством пустого пространства может быть сложно определить, где именно размещены значения. По этой причине полезно добавить сетку на график. В Matplotlib вы можете сделать это, добавив функцию .grid(True)
к объекту plt.
Давайте попробуем:
plt.scatter(x=atlanta['Minutes'], y=atlanta['Wins'],marker='o', c='cornflowerblue', alpha=0.6, label='Atlanta')
plt.scatter(x=chicago['Minutes'], y=chicago['Wins'],marker='o', c='hotpink', alpha=0.6, label='Chicago')
plt.title('Minutes played vs. Games Won', fontsize=18)
plt.xlabel('Minutes Played', fontsize=12)
plt.ylabel('Games Won', fontsize=12)
plt.legend(loc='lower right')
plt.grid(True)
plt.show()
Этот код возвращает следующий график:
Так же, как добавление цвета на график добавляет еще одно измерение, мы можем добавить еще один уровень детализации, изменяя размер маркера для каждой точки данных на основе другой серии данных.
Для этого мы будем использовать столбец Composite Rating для изменения размера каждой точки.
Изменим параметр s=
(размер) в функции .scatter()
plt.scatter(x=atlanta['Minutes'], y=atlanta['Wins'],marker='o', c='cornflowerblue', alpha=0.6, label='Atlanta', s=atlanta['Composite_Rating'])
plt.scatter(x=chicago['Minutes'], y=chicago['Wins'],marker='o', c='hotpink', alpha=0.6, label='Chicago', s=chicago['Composite_Rating'])
plt.title('Minutes played vs. Games Won', fontsize=18)
plt.xlabel('Minutes Played', fontsize=12)
plt.ylabel('Games Won', fontsize=12)
plt.legend(loc='lower right')
plt.grid(True)
plt.show()
Он возвращает следующий график:
Мы можем видеть, что все участки довольно маленькие. Мы можем умножить каждое значение на 10, чтобы увеличить его размер.
plt.scatter(x=atlanta['Minutes'], y=atlanta['Wins'],marker='o', c='cornflowerblue', alpha=0.6, label='Atlanta', s=atlanta['Composite_Rating']*10)
plt.scatter(x=chicago['Minutes'], y=chicago['Wins'],marker='o', c='hotpink', alpha=0.6, label='Chicago', s=chicago['Composite_Rating']*10)
plt.title('Minutes played vs. Games Won', fontsize=18)
plt.xlabel('Minutes Played', fontsize=12)
plt.ylabel('Games Won', fontsize=12)
plt.legend(loc='lower right')
plt.grid(True)
plt.show()
Этот код возвращает следующий, гораздо более разборчивый график:
Мы можем изменить стили в Matplotlib, используя функцию .style.use()
, передавая имя стиля в качестве аргумента в функцию use.
Если вы хотите узнать, какие стили доступны, вы можете выполнить print(plt.style.available)
, что вернет следующий список:
['Solarize_Light2', '_classic_test_patch', 'bmh', 'classic', 'dark_background', 'fast', 'fivethirtyeight', 'ggplot', 'grayscale', 'seaborn', 'seaborn-bright', 'seaborn-colorblind', 'seaborn-dark', 'seaborn-dark-palette', 'seaborn-darkgrid', 'seaborn-deep', 'seaborn-muted', 'seaborn-notebook', 'seaborn-paper', 'seaborn-pastel', 'seaborn-poster', 'seaborn-talk', 'seaborn-ticks', 'seaborn-white', 'seaborn-whitegrid', 'tableau-colorblind10']
Чтобы увидеть все доступные стили, вы можете ознакомиться с официальной документацией здесь
Давайте выведем различные стили графиков, используя цикл for. Мы изменим заголовок графика, установив его в используемый стиль.
for style in ['ggplot', 'fivethirtyeight', 'bmh', 'seaborn']:
plt.style.use(style)
plt.scatter(x=atlanta['Minutes'], y=atlanta['Wins'],marker='o', c='cornflowerblue', alpha=0.6, label='Atlanta')
plt.scatter(x=chicago['Minutes'], y=chicago['Wins'],marker='o', c='hotpink', alpha=0.6, label='Chicago')
plt.title(f'Style: {style}', fontsize=18)
plt.xlabel('Minutes Played', fontsize=12)
plt.ylabel('Games Won', fontsize=12)
plt.legend(loc='best')
plt.grid(True)
plt.show()
Это возвращает следующие графики:
В этом посте вы узнали, как создавать диаграммы рассеяния с помощью Matplotlib, включая добавление нескольких цветов, добавление заголовков и меток осей, изменение размера маркеров, добавление легенд и настройку с помощью стилей Matplotlib.
ID Year Age Team Minutes Composite_Rating Wins
0 montgre01w 2019 32 Atlanta 949 -2.4 1.22
1 williel01w 2019 26 Atlanta 909 0.6 2.51
2 sykesbr01w 2019 25 Atlanta 880 -3.4 0.70
3 hayesti01w 2019 29 Atlanta 817 -1.5 1.45
4 brelaje01w 2019 31 Atlanta 767 -0.8 1.62
df = pd.read_csv("https://github.com/fivethirtyeight/WNBA-stats/raw/master/wnba-player-stats.csv",
usecols = ['player_ID', 'Age', 'MP', 'Tm', 'Wins_Generated', 'year_ID', 'Composite_Rating']
)
df = df[df['Tm'].isin(['ATL', 'CHI'])]
df = df.rename(columns={
'player_ID': 'ID',
'MP':'Minutes',
'Tm':'Team',
'Wins_Generated': 'Wins',
'year_ID':'Year'
})
df['Team'] = df['Team'].str.replace('ATL', 'Atlanta')
df['Team'] = df['Team'].str.replace('CHI', 'Chicago')
print(df.head())