Библиотеки Python Часть 2. Практическое применение (страница 6)

Страница 6

Тепловые карты полезны для отображения матриц данных, например, уровня продаж в разных регионах и месяцах.

```python

import numpy as np

regions = ['North', 'South', 'East', 'West']

months = ['January', 'February', 'March', 'April']

sales_data = np.random.randint(100, 1000, size=(4, 4))

fig = go.Figure(data=go.Heatmap(

z=sales_data,

x=months,

y=regions,

colorscale='Viridis' # Цветовая схема

))

fig.update_layout(

title='Уровень продаж по регионам и месяцам',

xaxis_title='Месяцы',

yaxis_title='Регионы'

)

fig.show()

```

Объяснение:

– Используем `go.Heatmap` для отображения данных в виде тепловой карты.

– Параметр `colorscale` задаёт цветовую палитру, визуально усиливая различия между значениями.

Построение трёхмерного графика

Plotly поддерживает трёхмерные визуализации. Например, график, отображающий поверхность функции.

```python

x = np.linspace(-5, 5, 50)

y = np.linspace(-5, 5, 50)

X, Y = np.meshgrid(x, y)

Z = np.sin(np.sqrt(X**2 + Y**2))

fig = go.Figure(data=[go.Surface(z=Z, x=X, y=Y)])

fig.update_layout(

title='3D График поверхности',

scene=dict(

xaxis_title='X',

yaxis_title='Y',

zaxis_title='Z'

)

)

fig.show()

```

Особенности:

– Используем `go.Surface` для построения трёхмерной поверхности.

– Параметры `scene` задают подписи к осям в трёхмерном пространстве.

Интерактивность с помощью виджетов

Plotly позволяет добавлять интерактивные элементы, такие как слайдеры. Например, график, где пользователь может выбирать диапазон времени.

```python

from plotly.subplots import make_subplots

years = ['2020', '2021', '2022', '2023']

values = [500, 700, 800, 600]

fig = make_subplots(rows=1, cols=1)

fig.add_trace(go.Scatter(

x=years,

y=values,

mode='lines+markers',

name='Yearly Data'

))

fig.update_layout(

title='Интерактивный график с выбором диапазона',

xaxis=dict(rangeslider=dict(visible=True)), # Добавляем ползунок

template='plotly_white'

)

fig.show()

```

Интерактивность:

– Ползунок позволяет выбирать диапазон данных на оси X.

– Это полезно для работы с временными рядами.

Plotly – универсальный инструмент для создания интерактивных графиков. Благодаря множеству типов графиков и богатым возможностям настройки, библиотека подходит для самых разнообразных задач: от анализа данных до их визуальной презентации. Используя Plotly, вы можете не только создавать красивые графики, но и предоставлять пользователям возможность активно взаимодействовать с ними.

Задачи для практики

Задача 1: Построение графика изменения температуры

Описание:

Имеется набор данных о температуре за неделю:

– Дни: `['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']`

– Температура: `[15, 17, 20, 22, 19, 18, 16]`

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

Решение:

```python

import plotly.graph_objects as go

# Данные

days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']

temperatures = [15, 17, 20, 22, 19, 18, 16]

# Построение графика

fig = go.Figure()

fig.add_trace(go.Scatter(

x=days,

y=temperatures,

mode='lines+markers',

name='Temperature',

line=dict(color='blue', width=2),

marker=dict(size=8)

))

# Настройка графика

fig.update_layout(

title='Изменение температуры за неделю',

xaxis_title='Дни недели',

yaxis_title='Температура (°C)',

template='plotly_white'

)

# Показ графика

fig.show()

```

Задача 2: Построение круговой диаграммы

Описание:

Имеется информация о продажах по категориям:

– Категории: `['Electronics', 'Clothing', 'Groceries', 'Books', 'Furniture']`

– Продажи: `[1200, 1500, 800, 600, 900]`

Постройте круговую диаграмму, отображающую доли продаж по категориям.

Решение:

```python

import plotly.graph_objects as go

# Данные

categories = ['Electronics', 'Clothing', 'Groceries', 'Books', 'Furniture']

sales = [1200, 1500, 800, 600, 900]

# Построение круговой диаграммы

fig = go.Figure(data=[go.Pie(

labels=categories,

values=sales,

hole=0.4 # Делает диаграмму "пончиковой"

)])

# Настройка графика

fig.update_layout(

title='Распределение продаж по категориям',

template='plotly_white'

)

# Показ графика

fig.show()

```

Задача 3: Построение столбчатого графика с несколькими категориями

Описание:

Имеется информация о продажах в двух магазинах по категориям товаров:

– Категории: `['Electronics', 'Clothing', 'Groceries', 'Books', 'Furniture']`

– Продажи в магазине A: `[1000, 1400, 800, 500, 700]`

– Продажи в магазине B: `[1200, 1500, 600, 700, 900]`

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

Решение:

```python

# Данные

categories = ['Electronics', 'Clothing', 'Groceries', 'Books', 'Furniture']

sales_a = [1000, 1400, 800, 500, 700]

sales_b = [1200, 1500, 600, 700, 900]

# Построение графика

fig = go.Figure()

fig.add_trace(go.Bar(

x=categories,

y=sales_a,

name='Store A',

marker=dict(color='blue')

))

fig.add_trace(go.Bar(

x=categories,

y=sales_b,

name='Store B',

marker=dict(color='orange')

))

# Настройка графика

fig.update_layout(

title='Сравнение продаж по категориям в двух магазинах',

xaxis_title='Категории',

yaxis_title='Продажи ($)',

barmode='group',

template='plotly_white'

)

# Показ графика

fig.show()

```

Задача 4: Построение тепловой карты продаж по регионам и месяцам

Описание:

Имеются данные о продажах в четырёх регионах за три месяца:

– Регионы: `['North', 'South', 'East', 'West']`

– Месяцы: `['January', 'February', 'March']`

– Продажи (матрица):

```

[[500, 600, 700],

[400, 500, 600],

[700, 800, 900],

[300, 400, 500]]

```

Постройте тепловую карту, отображающую продажи.

Решение:

```python

import plotly.graph_objects as go

# Данные

regions = ['North', 'South', 'East', 'West']

months = ['January', 'February', 'March']

sales_matrix = [

[500, 600, 700],

[400, 500, 600],

[700, 800, 900],

[300, 400, 500]

]

# Построение тепловой карты

fig = go.Figure(data=go.Heatmap(

z=sales_matrix,

x=months,

y=regions,

colorscale='Viridis' # Цветовая схема

))

# Настройка графика

fig.update_layout(

title='Тепловая карта продаж',

xaxis_title='Месяцы',

yaxis_title='Регионы'

)

# Показ графика

fig.show()

```

Задача 5: Построение 3D-графика поверхности функции

Описание: Построить 3D-график для функции ( z = cos(x^2 + y^2) cdot *sin(x – y) ) на диапазоне (x) и (y) от (-5) до (5) с использованием более высокой сетки и с улучшенной цветовой гаммой.

Решение:

```python

import numpy as np

import plotly.graph_objects as go

# Данные

x = np.linspace(-5, 5, 100) # Увеличение разрешения

y = np.linspace(-5, 5, 100)

X, Y = np.meshgrid(x, y)

Z = np.cos(X**2 + Y**2) * np.sin(X – Y) # Сложная функция

# Построение 3D-графика

fig = go.Figure(data=[go.Surface(z=Z, x=X, y=Y, colorscale='Viridis')]) # Изменение цветовой гаммы

# Настройка графика

fig.update_layout(

title='3D График сложной поверхности',

scene=dict(

xaxis_title='X',

yaxis_title='Y',

zaxis_title='Z'

),

scene_camera=dict(

eye=dict(x=1.5, y=1.5, z=1.5) # Изменение угла обзора

)

)

# Показ графика

fig.show()

```

Задача 6: Анимация изменения температуры по дням недели

Описание:

Имеется информация о температуре за каждый день недели для нескольких городов:

– Дни: `['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']`

– Города: `['New York', 'Los Angeles', 'Chicago']`

– Температуры (матрица):

```

New York: [22, 24, 26, 25, 23, 21, 20]

Los Angeles: [30, 31, 29, 28, 27, 26, 25]

Chicago: [15, 18, 20, 17, 16, 14, 12]

```

Создайте анимацию, показывающую изменение температуры для каждого города.

Решение:

```python

import plotly.graph_objects as go

# Данные

days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']

cities = ['New York', 'Los Angeles', 'Chicago']

temperatures = {

'New York': [22, 24, 26, 25, 23, 21, 20],

'Los Angeles': [30, 31, 29, 28, 27, 26, 25],

'Chicago': [15, 18, 20, 17, 16, 14, 12]

}

# Создание анимации

fig = go.Figure()

for city in cities:

fig.add_trace(go.Scatter(

x=days,

y=temperatures[city],

mode='lines+markers',

name=city

))

# Настройка анимации

frames = [

go.Frame(

data=[

go.Scatter(

x=days[:i],

y=temperatures[city][:i],

mode='lines+markers',

name=city

)

for city in cities

]

)

for i in range(1, len(days) + 1)

]

fig.update(frames=frames)

# Настройка кнопок

fig.update_layout(

updatemenus=[

dict(

type='buttons',

showactive=False,

buttons=[

dict(label='Play', method='animate', args=[None, {'frame': {'duration': 500, 'redraw': True}}]),

dict(label='Pause', method='animate', args=[[None], {'frame': {'duration': 0, 'redraw': False}}])

]

)

]

)

# Оформление графика

fig.update_layout(

title='Изменение температуры по дням недели',

xaxis_title='День недели',

yaxis_title='Температура (°C)',

template='plotly_white'

)

fig.show()

```

Задача 7: Трёхмерная анимация COVID-19

Описание:

Используйте вымышленные данные о росте случаев COVID-19 в трёх странах (`USA`, `India`, `Brazil`) за шесть месяцев:

– Месяцы: `['January', 'February', 'March', 'April', 'May', 'June']`

– Число случаев (матрица):

```

USA: [1000, 2000, 4000, 8000, 15000, 20000]

India: [500, 1500, 3000, 6000, 12000, 18000]

Brazil: [800, 1600, 3200, 6400, 13000, 19000]

```

Создайте трёхмерную анимацию, показывающую рост числа случаев по месяцам.

Решение:

```python

import plotly.graph_objects as go

# Данные

months = ['January', 'February', 'March', 'April', 'May', 'June']

countries = ['USA', 'India', 'Brazil']

cases = {

'USA': [1000, 2000, 4000, 8000, 15000, 20000],

'India': [500, 1500, 3000, 6000, 12000, 18000],

'Brazil': [800, 1600, 3200, 6400, 13000, 19000]

}

# Построение графика

fig = go.Figure()

for month, idx in zip(months, range(len(months))):

fig.add_trace(go.Scatter3d(

x=countries,

y=[month] * len(countries),

z=[cases[country][idx] for country in countries],

mode='markers',

marker=dict(size=10, color=[cases[country][idx] for country in countries], colorscale='Viridis'),