Data visualization#

# # для установки библиотек
# ! pip3 install seaborn
# ! pip3 install plotly
# ! pip3 install ggplot
# ! pip3 install matplotlib
# ! pip3 install matplotlib==3.0.0
#графики в svg выглядят более четкими
%config InlineBackend.figure_format = 'svg' 

#увеличим дефолтный размер графиков
from pylab import rcParams
rcParams['figure.figsize'] = 10,5
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
Cell In[2], line 8
      6 rcParams['figure.figsize'] = 10,5
      7 import numpy as np
----> 8 import pandas as pd
      9 import matplotlib.pyplot as plt
     10 import seaborn as sns

ModuleNotFoundError: No module named 'pandas'

Matplotlib#

xs = np.linspace(0, 2*np.pi, num=10)
plt.scatter(xs, np.sin(xs), c='r')
plt.axhline(c='k', alpha=0.75)
plt.axvline(c='k', alpha=0.75);
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[3], line 2
      1 xs = np.linspace(0, 2*np.pi, num=10)
----> 2 plt.scatter(xs, np.sin(xs), c='r')
      3 plt.axhline(c='k', alpha=0.75)
      4 plt.axvline(c='k', alpha=0.75);

NameError: name 'plt' is not defined

We’ll use Kaggle Video Games Dataset for visualizations.

df = pd.read_csv('Video_Games_Sales.csv.zip')
print(df.shape)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[4], line 1
----> 1 df = pd.read_csv('Video_Games_Sales.csv.zip')
      2 print(df.shape)

NameError: name 'pd' is not defined
df.head()
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[5], line 1
----> 1 df.head()

NameError: name 'df' is not defined
df.info()
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[6], line 1
----> 1 df.info()

NameError: name 'df' is not defined
df = df.dropna()
print(df.shape)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[7], line 1
----> 1 df = df.dropna()
      2 print(df.shape)

NameError: name 'df' is not defined
df.head()
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[8], line 1
----> 1 df.head()

NameError: name 'df' is not defined
df['User_Score'] = df.User_Score.astype('float64')
df['Year_of_Release'] = df.Year_of_Release.astype('int64')
df['User_Count'] = df.User_Count.astype('int64')
df['Critic_Count'] = df.Critic_Count.astype('int64')
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[9], line 1
----> 1 df['User_Score'] = df.User_Score.astype('float64')
      2 df['Year_of_Release'] = df.Year_of_Release.astype('int64')
      3 df['User_Count'] = df.User_Count.astype('int64')

NameError: name 'df' is not defined
useful_cols = ['Name', 'Platform', 'Year_of_Release', 'Genre', 
               'Global_Sales', 'Critic_Score', 'Critic_Count',
               'User_Score', 'User_Count', 'Rating'
              ]
df[useful_cols].head(10)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[10], line 5
      1 useful_cols = ['Name', 'Platform', 'Year_of_Release', 'Genre', 
      2                'Global_Sales', 'Critic_Score', 'Critic_Count',
      3                'User_Score', 'User_Count', 'Rating'
      4               ]
----> 5 df[useful_cols].head(10)

NameError: name 'df' is not defined

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

В библиотеку pandas встроен wrapper для matplotlib.

[x for x in df.columns if 'Sales' in x]
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[11], line 1
----> 1 [x for x in df.columns if 'Sales' in x]

NameError: name 'df' is not defined
df1 = df[[x for x in df.columns if 'Sales' in x] + ['Year_of_Release']]\
    .groupby('Year_of_Release').sum()
df1.head()
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[12], line 1
----> 1 df1 = df[[x for x in df.columns if 'Sales' in x] + ['Year_of_Release']]\
      2     .groupby('Year_of_Release').sum()
      3 df1.head()

NameError: name 'df' is not defined
df1.plot();
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[13], line 1
----> 1 df1.plot();

NameError: name 'df1' is not defined

В этом случае мы сконцентрировались на отображении трендов продаж в разных регионах.

C помощью параметра kind можно изменить тип графика, например, на bar chart. Matplotlib позволяет очень гибко настраивать графики. На графике можно изменить почти все, что угодно, но потребуется порыться в документации и найти нужные параметры. Например, параметра rot отвечает за угол наклона подписей к оси x.

df1.plot(kind='bar', rot=45, stacked=True);
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[14], line 1
----> 1 df1.plot(kind='bar', rot=45, stacked=True);

NameError: name 'df1' is not defined

Или можем сделать stacked bar chart, чтобы показать и динамику продаж и их разбиение по рынкам.

df1[list(filter(lambda x: x != 'Global_Sales', df1.columns))]\
    .plot(kind='bar', rot=45, stacked=True);
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[15], line 1
----> 1 df1[list(filter(lambda x: x != 'Global_Sales', df1.columns))]\
      2     .plot(kind='bar', rot=45, stacked=True);

NameError: name 'df1' is not defined
df1[list(filter(lambda x: x != 'Global_Sales', df1.columns))]\
    .plot(kind='area', rot=45);
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[16], line 1
----> 1 df1[list(filter(lambda x: x != 'Global_Sales', df1.columns))]\
      2     .plot(kind='area', rot=45);

NameError: name 'df1' is not defined

Еще один часто встречающийся тип графиков - это гистограммы. Посмотрим на распределение оценок критиков.

df.Critic_Score.hist(bins=40);
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[17], line 1
----> 1 df.Critic_Score.hist(bins=40);

NameError: name 'df' is not defined
ax = df.Critic_Score.hist()
ax.set_title('Critic Score distribution')
ax.set_xlabel('critic score')
ax.set_ylabel('games');
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[18], line 1
----> 1 ax = df.Critic_Score.hist()
      2 ax.set_title('Critic Score distribution')
      3 ax.set_xlabel('critic score')

NameError: name 'df' is not defined

У гистограмм можно контролировать, на сколько групп мы разбиваем распределение с помощью параметра bins.

ax = df.Critic_Score.hist(bins=20)
ax.set_title('Critic Score distribution')
ax.set_xlabel('critic score')
ax.set_ylabel('games');
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[19], line 1
----> 1 ax = df.Critic_Score.hist(bins=20)
      2 ax.set_title('Critic Score distribution')
      3 ax.set_xlabel('critic score')

NameError: name 'df' is not defined

Еще немного познакомимся с тем, как в pandas можно стилизовать таблицы.

top_developers_df = df.groupby('Developer')[['Global_Sales']].sum()\
    .sort_values('Global_Sales', ascending=False).head(10)
    
top_developers_df
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[20], line 1
----> 1 top_developers_df = df.groupby('Developer')[['Global_Sales']].sum()\
      2     .sort_values('Global_Sales', ascending=False).head(10)
      4 top_developers_df

NameError: name 'df' is not defined
# ! pip3 install jinja2
top_developers_df.style.bar()
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[22], line 1
----> 1 top_developers_df.style.bar()

NameError: name 'top_developers_df' is not defined
with open('developers_rend.html', 'w') as f:
    f.write(top_developers_df.style.bar().render())
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[23], line 2
      1 with open('developers_rend.html', 'w') as f:
----> 2     f.write(top_developers_df.style.bar().render())

NameError: name 'top_developers_df' is not defined

Полезные ссылки#

Seaborn#

Теперь давайте перейдем к библиотеке seaborn. Seaborn — это по сути более высокоуровневое API на базе библиотеки matplotlib. Seaborn содержит более адекватные дефолтные настройки оформления графиков. Если просто добавить в код import seaborn, то картинки станут гораздо симпатичнее. Также в библиотеке есть достаточно сложные типы визуализации, которые в matplotlib потребовали бы большого количество кода.

Познакомимся с первым таким “сложным” типом графиков pair plot (scatter plot matrix). Эта визуализация поможет нам посмотреть на одной картинке, как связаны между собой различные признаки.

import seaborn as sns
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
Cell In[24], line 1
----> 1 import seaborn as sns

ModuleNotFoundError: No module named 'seaborn'
# c svg pairplot браузер начинает тормозить
%config InlineBackend.figure_format = 'png' 
sns_plot = sns.pairplot(
    df[['Global_Sales', 'Critic_Score', 'User_Score']]);
sns_plot.savefig('pairplot.png')
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[25], line 3
      1 # c svg pairplot браузер начинает тормозить
      2 get_ipython().run_line_magic('config', "InlineBackend.figure_format = 'png'")
----> 3 sns_plot = sns.pairplot(
      4     df[['Global_Sales', 'Critic_Score', 'User_Score']]);
      5 sns_plot.savefig('pairplot.png')

NameError: name 'sns' is not defined

Также с помощью seaborn можно построить распределение, для примера посмотрим на распределение оценок критиков Critic_Score. Для этого построим distplot. По default’у на графике отображается гистограмма и kernel density estimation.

%config InlineBackend.figure_format = 'svg' 
sns.distplot(df.Critic_Score);
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[26], line 2
      1 get_ipython().run_line_magic('config', "InlineBackend.figure_format = 'svg'")
----> 2 sns.distplot(df.Critic_Score);

NameError: name 'sns' is not defined

Для того чтобы подробнее посмотреть на взаимосвязь двух численных признаков, есть еще и joint_plot – это гибрид scatter plot и histogram (отображаются также гистограммы распределений признаков). Посмотрим на то, как связаны между собой оценка критиков Critic_Score и оценка пользователя User_Score.

sns.jointplot(x='Critic_Score', y='User_Score', 
              data=df, kind='scatter');
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[27], line 1
----> 1 sns.jointplot(x='Critic_Score', y='User_Score', 
      2               data=df, kind='scatter');

NameError: name 'sns' is not defined
sns.jointplot(x='Critic_Score', y='User_Score', 
              data=df, kind='reg');
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[28], line 1
----> 1 sns.jointplot(x='Critic_Score', y='User_Score', 
      2               data=df, kind='reg');

NameError: name 'sns' is not defined

Box-and-Wisker Plot#

Еще один полезный тип графиков - это box plot. Давайте сравним пользовательские оценки игр для топ-5 крупнейших игровых платформ.

top_platforms = df.Platform.value_counts().sort_values(ascending = False).head(5)
top_platforms
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[29], line 1
----> 1 top_platforms = df.Platform.value_counts().sort_values(ascending = False).head(5)
      2 top_platforms

NameError: name 'df' is not defined
sns.boxplot(x="Platform", y="Critic_Score", 
            data=df[df.Platform.isin(top_platforms.index.values)]);
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[30], line 1
----> 1 sns.boxplot(x="Platform", y="Critic_Score", 
      2             data=df[df.Platform.isin(top_platforms.index.values)]);

NameError: name 'sns' is not defined

Box plot состоит из коробки (поэтому он и называется box plot), усиков и точек. Коробка показывает интерквантильный размах распределения, то есть соответственно 25% (Q1) и 75% (Q3) процентили. Черта внутри коробки обозначает медиану распределения. С коробкой разобрались, перейдем к усам. Усы отображают весь разброс точек кроме выбросов, то есть минимальные и максимальные значения, которые попадают в промежуток (Q1 - 1.5*IQR, Q3 + 1.5*IQR), где IQR = Q3 - Q1 - интерквантильный размах. Точками на графике обозначаются выбросы (outliers) - те значения, которые не вписываются в промежуток значений, заданный усами графика.

https://miro.medium.com/max/1400/1*0MPDTLn8KoLApoFvI0P2vQ.png

И еще один тип графиков (последний из тех, которые мы рассмотрим в этой части) - это heat map. Heat map позволяет посмотреть на распределение какого-то численного признака по двум категориальным. Визуализируем суммарные продажи игр по жанрам и игровым платформам.

platform_genre_sales = df.pivot_table(
                        index='Platform', 
                        columns='Genre', 
                        values='Global_Sales', 
                        aggfunc=sum).fillna(0).applymap(float)

platform_genre_sales
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[31], line 1
----> 1 platform_genre_sales = df.pivot_table(
      2                         index='Platform', 
      3                         columns='Genre', 
      4                         values='Global_Sales', 
      5                         aggfunc=sum).fillna(0).applymap(float)
      7 platform_genre_sales

NameError: name 'df' is not defined
sns.heatmap(platform_genre_sales, annot=False, fmt=".1f", center = True);
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[32], line 1
----> 1 sns.heatmap(platform_genre_sales, annot=False, fmt=".1f", center = True);

NameError: name 'sns' is not defined

Полезные ссылки#

Plotly#

Мы рассмотрели визуализации на базе библиотеки matplotlib. Однако, это не единственная опция для построения графиков на языке python. Познакомимся также с библиотекой plotly. Plotly - это open-source библиотека, которая позволяет строить интерактивные графики в jupyter.notebook’e без необходимости зарываться в javascript код.

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

Перед началом работы импортируем все необходимые модули и инициализируем plotly с помощью команды init_notebook_mode.

from plotly.offline import init_notebook_mode, iplot
import plotly.graph_objects as go
import plotly
import plotly.graph_objs as go

init_notebook_mode(connected=True)
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
Cell In[33], line 1
----> 1 from plotly.offline import init_notebook_mode, iplot
      2 import plotly.graph_objects as go
      3 import plotly

ModuleNotFoundError: No module named 'plotly'

Для начала построим line plot с динамикой числа вышедших игр и их продаж по годам.

global_sales_years_df = df.groupby('Year_of_Release')[['Global_Sales']].sum()
global_sales_years_df.head()
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[34], line 1
----> 1 global_sales_years_df = df.groupby('Year_of_Release')[['Global_Sales']].sum()
      2 global_sales_years_df.head()

NameError: name 'df' is not defined
released_years_df = df.groupby('Year_of_Release')[['Name']].count()
released_years_df.head()
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[35], line 1
----> 1 released_years_df = df.groupby('Year_of_Release')[['Name']].count()
      2 released_years_df.head()

NameError: name 'df' is not defined
years_df = global_sales_years_df.join(released_years_df)
years_df.head()
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[36], line 1
----> 1 years_df = global_sales_years_df.join(released_years_df)
      2 years_df.head()

NameError: name 'global_sales_years_df' is not defined
years_df.columns = ['Global_Sales', 'Number_of_Games']
years_df.head()
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[37], line 1
----> 1 years_df.columns = ['Global_Sales', 'Number_of_Games']
      2 years_df.head()

NameError: name 'years_df' is not defined

В plotly строится визуализация объекта Figure, который состоит из данных (массив линий, которые в библиотеке называются traces) и оформления/стиля, за который отвечает объект layout. В простых случаях можно вызывать функцию iplot и просто от массива traces.

trace0 = go.Scatter(
    x=years_df.index,
    y=years_df.Global_Sales,
    name='Global Sales'
)

trace1 = go.Scatter(
    x=years_df.index,
    y=years_df.Number_of_Games,
    name='Number of games released'
)

data = [trace0, trace1]
layout = {'title': 'Statistics of video games'}

fig = go.Figure(data=data, layout=layout)
#fig.show()
iplot(fig, show_link = False)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[38], line 1
----> 1 trace0 = go.Scatter(
      2     x=years_df.index,
      3     y=years_df.Global_Sales,
      4     name='Global Sales'
      5 )
      7 trace1 = go.Scatter(
      8     x=years_df.index,
      9     y=years_df.Number_of_Games,
     10     name='Number of games released'
     11 )
     13 data = [trace0, trace1]

NameError: name 'go' is not defined

Также можно сразу сохранить график в виде html-файла.

# plotly.offline.plot(fig, filename='years_stats.html', show_link=False);

Посмотрим также на рыночную долю игровых платформ, расчитанную по количеству выпущенных игр и по суммарной выручке. Для этого построим bar chart.

global_sales_platforms_df = df.groupby('Platform')[['Global_Sales']].sum()
released_platforms_df = df.groupby('Platform')[['Name']].count()
platforms_df = global_sales_platforms_df.join(released_platforms_df)

platforms_df.columns = ['Global_Sales', 'Number_of_Games']
platforms_df.sort_values('Global_Sales', inplace=True)
platforms_df = platforms_df.apply(lambda x: 100*x/platforms_df.sum(), axis = 1)
platforms_df.head()
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[40], line 1
----> 1 global_sales_platforms_df = df.groupby('Platform')[['Global_Sales']].sum()
      2 released_platforms_df = df.groupby('Platform')[['Name']].count()
      3 platforms_df = global_sales_platforms_df.join(released_platforms_df)

NameError: name 'df' is not defined
trace0 = go.Bar(
    x=platforms_df.index,
    y=platforms_df.Global_Sales,
    name='Global Sales',
    orientation = 'v'
)

trace1 = go.Bar(
    x=platforms_df.index,
    y=platforms_df.Number_of_Games,
    name='Number of games released',
    orientation = 'v'
)

data = [trace0, trace1]
layout = {'title': 'Platforms share', 'xaxis': {'title': 'platform'}}

fig = go.Figure(data=data, layout=layout)

iplot(fig, show_link=False)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[41], line 1
----> 1 trace0 = go.Bar(
      2     x=platforms_df.index,
      3     y=platforms_df.Global_Sales,
      4     name='Global Sales',
      5     orientation = 'v'
      6 )
      8 trace1 = go.Bar(
      9     x=platforms_df.index,
     10     y=platforms_df.Number_of_Games,
     11     name='Number of games released',
     12     orientation = 'v'
     13 )
     15 data = [trace0, trace1]

NameError: name 'go' is not defined

В plotly можно построить и box plot. Рассмотрим различия оценок критиков в зависимости от жанра игры.

df.Genre.unique()
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[42], line 1
----> 1 df.Genre.unique()

NameError: name 'df' is not defined
data = []

for genre in df.Genre.unique():
    data.append(
        go.Box(y=df[df.Genre==genre].Critic_Score, 
               name=genre)
    )
iplot(data, show_link = False)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[43], line 3
      1 data = []
----> 3 for genre in df.Genre.unique():
      4     data.append(
      5         go.Box(y=df[df.Genre==genre].Critic_Score, 
      6                name=genre)
      7     )
      8 iplot(data, show_link = False)

NameError: name 'df' is not defined

Давайте посмотрим на график зависимости средней оценки пользователей и оценки критиков по жанрам. Это будет обычный scatter plot.

scores_genres_df = df.groupby('Genre')[['Critic_Score', 'User_Score']].mean()
sales_genres_df = df.groupby('Genre')[['Global_Sales']].sum()

genres_df = scores_genres_df.join(sales_genres_df)
    
genres_df.head()
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[44], line 1
----> 1 scores_genres_df = df.groupby('Genre')[['Critic_Score', 'User_Score']].mean()
      2 sales_genres_df = df.groupby('Genre')[['Global_Sales']].sum()
      4 genres_df = scores_genres_df.join(sales_genres_df)

NameError: name 'df' is not defined
trace0 = go.Scatter(
    x=genres_df.Critic_Score,
    y=genres_df.User_Score,
    mode = 'markers'
)

data = [trace0]
layout = {'title': 'Statistics of video games genres', 'yaxis': {'title': 'user score'}, 
          'xaxis': {'title': 'critic score'}}

fig = go.Figure(data=data, layout=layout)

iplot(fig, show_link=False)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[45], line 1
----> 1 trace0 = go.Scatter(
      2     x=genres_df.Critic_Score,
      3     y=genres_df.User_Score,
      4     mode = 'markers'
      5 )
      7 data = [trace0]
      8 layout = {'title': 'Statistics of video games genres', 'yaxis': {'title': 'user score'}, 
      9           'xaxis': {'title': 'critic score'}}

NameError: name 'go' is not defined

Пока что ничего непонятно, давайте добавим к точкам подписи.

trace0 = go.Scatter(
    x=genres_df.Critic_Score,
    y=genres_df.User_Score,
    mode = 'markers+text',
    text = genres_df.index,
    textposition='bottom center'
)

data = [trace0]
layout = {'title': 'Statistics of video games genres'}

fig = go.Figure(data=data, layout=layout)

iplot(fig, show_link=False)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[46], line 1
----> 1 trace0 = go.Scatter(
      2     x=genres_df.Critic_Score,
      3     y=genres_df.User_Score,
      4     mode = 'markers+text',
      5     text = genres_df.index,
      6     textposition='bottom center'
      7 )
      9 data = [trace0]
     10 layout = {'title': 'Statistics of video games genres'}

NameError: name 'go' is not defined

Далее добавим на график еще одно измерение - размер жанра (суммарный объем продаж, который мы заранее посчитали) и получим bubble chart.

genres_df.index
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[47], line 1
----> 1 genres_df.index

NameError: name 'genres_df' is not defined
trace0 = go.Scatter(
    x=genres_df.Critic_Score,
    y=genres_df.User_Score,
    mode = 'markers+text',
    text = genres_df.index,
    #textposition='bottom',
    marker = dict(
        size = 1/10*genres_df.Global_Sales,
        color = [
            'aqua', 'azure', 'beige', 'lightgreen',
            'lavender', 'lightblue', 'pink', 'salmon',
            'wheat', 'ivory', 'silver'
        ]
    )
)

data = [trace0]
layout = {
    'title': 'Statistics of video games genres',
    'xaxis': {'title': 'Critic Score'},
    'yaxis': {'title': 'User Score'}
}

fig = go.Figure(data=data, layout=layout)

iplot(fig, show_link=False)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[48], line 1
----> 1 trace0 = go.Scatter(
      2     x=genres_df.Critic_Score,
      3     y=genres_df.User_Score,
      4     mode = 'markers+text',
      5     text = genres_df.index,
      6     #textposition='bottom',
      7     marker = dict(
      8         size = 1/10*genres_df.Global_Sales,
      9         color = [
     10             'aqua', 'azure', 'beige', 'lightgreen',
     11             'lavender', 'lightblue', 'pink', 'salmon',
     12             'wheat', 'ivory', 'silver'
     13         ]
     14     )
     15 )
     17 data = [trace0]
     18 layout = {
     19     'title': 'Statistics of video games genres',
     20     'xaxis': {'title': 'Critic Score'},
     21     'yaxis': {'title': 'User Score'}
     22 }

NameError: name 'go' is not defined

В plotly есть возможность делать графики в drop down menus, когда в зависимости от выбранного среза будут отображаться различные графики. Давайте построим гистораммы распределений оценок пользователей по жанрам.

traces = []
for genre in ['Racing', 'Shooter', 'Sports', 'Action']:
    traces.append(
        go.Histogram(
            x=df[df.Genre == genre].User_Score,
            histnorm='probability', 
            name = genre, 
            visible = (genre == 'Racing'))
    )
    
layout = go.Layout(
    title='User Score Distribution',
    updatemenus=list([
        dict(
            x=-0.05,
            y=1,
            yanchor='top',
            buttons=list([
                dict(
                    args=['visible', [True] + [False]*3],
                    label='Racing',
                    method='restyle'
                ),
                dict(
                    args=['visible', [False] + [True] + [False]*2],
                    label='Shooter',
                    method='restyle'
                ),
                dict(
                    args=['visible', [False]*2 + [True] + [False]],
                    label='Sports',
                    method='restyle'
                ),
                dict(
                    args=['visible', [False]*3 + [True]],
                    label='Action',
                    method='restyle'
                )
            ]),
        )
    ]),
)

fig = {'data': traces, 'layout': layout}
iplot(fig, show_link=False)
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[49], line 4
      1 traces = []
      2 for genre in ['Racing', 'Shooter', 'Sports', 'Action']:
      3     traces.append(
----> 4         go.Histogram(
      5             x=df[df.Genre == genre].User_Score,
      6             histnorm='probability', 
      7             name = genre, 
      8             visible = (genre == 'Racing'))
      9     )
     11 layout = go.Layout(
     12     title='User Score Distribution',
     13     updatemenus=list([
   (...)
     41     ]),
     42 )
     44 fig = {'data': traces, 'layout': layout}

NameError: name 'go' is not defined

Полезные ссылки#

Plotly express#

Это обертка над plotly.graph_objects, которая позволяет строить графики проще.

Документация

import plotly.express as px
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
Cell In[50], line 1
----> 1 import plotly.express as px

ModuleNotFoundError: No module named 'plotly'
px.scatter(df, x= 'User_Score', y = 'Critic_Score')
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[51], line 1
----> 1 px.scatter(df, x= 'User_Score', y = 'Critic_Score')

NameError: name 'px' is not defined
px.scatter(df, x= 'User_Score', y = 'Critic_Score', color = 'Genre')
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[52], line 1
----> 1 px.scatter(df, x= 'User_Score', y = 'Critic_Score', color = 'Genre')

NameError: name 'px' is not defined
px.scatter(df, x= 'User_Score', y = 'Critic_Score', 
           marginal_y = 'histogram', marginal_x = 'histogram', trendline="ols")
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[53], line 1
----> 1 px.scatter(df, x= 'User_Score', y = 'Critic_Score', 
      2            marginal_y = 'histogram', marginal_x = 'histogram', trendline="ols")

NameError: name 'px' is not defined
px.scatter(df[df.Platform.isin(top_platforms)], x= 'User_Score', y = 'Critic_Score', 
           marginal_y = 'histogram', marginal_x = 'histogram', trendline="ols", facet_col = 'Platform')
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[54], line 1
----> 1 px.scatter(df[df.Platform.isin(top_platforms)], x= 'User_Score', y = 'Critic_Score', 
      2            marginal_y = 'histogram', marginal_x = 'histogram', trendline="ols", facet_col = 'Platform')

NameError: name 'px' is not defined
px.scatter_matrix(df[['Global_Sales', 'Critic_Score', 'User_Score']])
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[55], line 1
----> 1 px.scatter_matrix(df[['Global_Sales', 'Critic_Score', 'User_Score']])

NameError: name 'px' is not defined