Библиотеки Python Часть 2. Практическое применение (страница 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'),