Home » Линейный график в Seaborn — создание диаграмм в Python
Линейный график в Seaborn — создание диаграмм в Python

Линейный график в Seaborn — создание диаграмм в Python

Приветствую! Сегодня разберём Seaborn — это библиотека для создания статистических визуализаций в Python, которая отлично подходит для создания линейных графиков. Почему это важно для админов и тех, кто работает с серверами? Очень просто — мониторинг метрик, анализ логов, отслеживание производительности, нагрузки на CPU, RAM, дисковую активность — всё это можно визуализировать с помощью линейных графиков. Seaborn делает это элегантно и с минимальным количеством кода.

Допустим, у вас есть CSV-файл с метриками сервера за последние 30 дней, или вы собираете данные из системы мониторинга — линейный график покажет тренды, пики, аномалии в одном взгляде. Это намного лучше, чем просматривать тысячи строк в логах или таблицах. Seaborn построен поверх matplotlib, но имеет более удобный API и красивые стили “из коробки”.

Как это работает?

Seaborn использует функцию lineplot() для создания линейных графиков. Основная идея — передать данные в виде pandas DataFrame или массивов, указать какие столбцы использовать для осей X и Y, и библиотека автоматически построит красивый график.

Основные компоненты:

  • Данные — pandas DataFrame или массивы numpy
  • Оси — x и y параметры для определения осей
  • Стилизация — автоматическая или кастомная
  • Группировка — возможность отображения нескольких линий по категориям

Внутри Seaborn обрабатывает данные, группирует их при необходимости, вычисляет статистики и передаёт результат в matplotlib для отрисовки.

Установка и базовая настройка

Для начала нужно установить все необходимые пакеты. Если вы работаете на VPS или выделенном сервере, то это особенно актуально:

pip install seaborn pandas matplotlib numpy
# или через conda
conda install seaborn pandas matplotlib numpy

Базовый импорт и настройка:

import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# Установка стиля
sns.set_style("whitegrid")
sns.set_palette("husl")

Создание простого линейного графика

Начнём с самого простого примера — допустим, у нас есть данные о загрузке CPU сервера по часам:

# Создаём тестовые данные
np.random.seed(42)
hours = list(range(24))
cpu_usage = np.random.normal(45, 15, 24)  # Средняя загрузка 45% с отклонением 15%
cpu_usage = np.clip(cpu_usage, 0, 100)  # Ограничиваем 0-100%

# Создаём DataFrame
df = pd.DataFrame({
    'hour': hours,
    'cpu_usage': cpu_usage
})

# Строим график
plt.figure(figsize=(12, 6))
sns.lineplot(data=df, x='hour', y='cpu_usage')
plt.title('CPU Usage Throughout the Day')
plt.xlabel('Hour')
plt.ylabel('CPU Usage (%)')
plt.show()

Работа с реальными данными сервера

Теперь более практический пример — парсим логи и строим график:

# Пример чтения данных из CSV файла с метриками
# Структура: timestamp, cpu_usage, memory_usage, disk_io
df = pd.read_csv('server_metrics.csv')
df['timestamp'] = pd.to_datetime(df['timestamp'])

# Создаём график с несколькими линиями
plt.figure(figsize=(15, 8))

# Нормализуем данные для отображения на одном графике
df['memory_usage_norm'] = df['memory_usage'] / df['memory_usage'].max() * 100
df['disk_io_norm'] = df['disk_io'] / df['disk_io'].max() * 100

# Строим мультилинейный график
sns.lineplot(data=df, x='timestamp', y='cpu_usage', label='CPU Usage (%)')
sns.lineplot(data=df, x='timestamp', y='memory_usage_norm', label='Memory Usage (normalized)')
sns.lineplot(data=df, x='timestamp', y='disk_io_norm', label='Disk I/O (normalized)')

plt.title('Server Performance Metrics')
plt.xlabel('Time')
plt.ylabel('Usage (%)')
plt.legend()
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

Продвинутые возможности

Seaborn предлагает множество параметров для кастомизации:

# Группировка по категориям (например, разные серверы)
df_servers = pd.DataFrame({
    'time': list(range(24)) * 3,
    'cpu_usage': np.random.normal(50, 10, 72),
    'server': ['web-01'] * 24 + ['web-02'] * 24 + ['db-01'] * 24
})

plt.figure(figsize=(14, 8))
sns.lineplot(
    data=df_servers, 
    x='time', 
    y='cpu_usage',
    hue='server',  # Разные линии для разных серверов
    style='server',  # Разные стили линий
    markers=True,  # Добавляем маркеры
    linewidth=2.5
)

plt.title('CPU Usage Comparison Across Servers')
plt.xlabel('Hour')
plt.ylabel('CPU Usage (%)')
plt.legend(title='Server')
plt.show()

Интеграция с системным мониторингом

Практический скрипт для сбора метрик системы и их визуализации:

import psutil
import time
from datetime import datetime

def collect_system_metrics(duration_minutes=60, interval_seconds=30):
    """Собирает метрики системы в течение указанного времени"""
    metrics = []
    end_time = time.time() + (duration_minutes * 60)
    
    while time.time() < end_time:
        timestamp = datetime.now()
        cpu_percent = psutil.cpu_percent(interval=1)
        memory = psutil.virtual_memory()
        disk = psutil.disk_usage('/')
        
        metrics.append({
            'timestamp': timestamp,
            'cpu_usage': cpu_percent,
            'memory_usage': memory.percent,
            'disk_usage': (disk.used / disk.total) * 100
        })
        
        time.sleep(interval_seconds)
    
    return pd.DataFrame(metrics)

# Собираем данные
df_metrics = collect_system_metrics(duration_minutes=30, interval_seconds=60)

# Создаём dashboard
fig, axes = plt.subplots(3, 1, figsize=(15, 12))

# CPU Usage
sns.lineplot(data=df_metrics, x='timestamp', y='cpu_usage', ax=axes[0], color='red')
axes[0].set_title('CPU Usage Over Time')
axes[0].set_ylabel('CPU (%)')

# Memory Usage
sns.lineplot(data=df_metrics, x='timestamp', y='memory_usage', ax=axes[1], color='blue')
axes[1].set_title('Memory Usage Over Time')
axes[1].set_ylabel('Memory (%)')

# Disk Usage
sns.lineplot(data=df_metrics, x='timestamp', y='disk_usage', ax=axes[2], color='green')
axes[2].set_title('Disk Usage Over Time')
axes[2].set_ylabel('Disk (%)')

plt.tight_layout()
plt.show()

Сравнение с другими решениями

Решение Простота использования Кастомизация Производительность Интеграция
Seaborn Очень высокая Высокая Средняя Отличная с pandas
Matplotlib Средняя Максимальная Высокая Универсальная
Plotly Высокая Высокая Средняя Веб-интерфейс
Bokeh Средняя Высокая Высокая Веб-приложения

Оптимизация и производительность

При работе с большими объёмами данных (например, логи сервера за месяц) важно учитывать производительность:

# Оптимизация для больших datasets
def optimize_large_dataset(df, max_points=1000):
    """Уменьшает количество точек для оптимизации отрисовки"""
    if len(df) <= max_points:
        return df
    
    # Используем равномерную выборку
    step = len(df) // max_points
    return df.iloc[::step]

# Пример использования
large_df = pd.read_csv('large_server_logs.csv')
large_df['timestamp'] = pd.to_datetime(large_df['timestamp'])

# Оптимизируем данные
optimized_df = optimize_large_dataset(large_df, max_points=500)

# Строим график
plt.figure(figsize=(16, 8))
sns.lineplot(data=optimized_df, x='timestamp', y='response_time')
plt.title('Server Response Time (Optimized View)')
plt.xlabel('Time')
plt.ylabel('Response Time (ms)')
plt.show()

Автоматизация и интеграция в скрипты

Создаём функцию для автоматического создания отчётов:

def generate_server_report(data_file, output_file='server_report.png'):
    """Генерирует отчёт о производительности сервера"""
    df = pd.read_csv(data_file)
    df['timestamp'] = pd.to_datetime(df['timestamp'])
    
    # Создаём фигуру с несколькими подграфиками
    fig, axes = plt.subplots(2, 2, figsize=(20, 12))
    
    # CPU Usage
    sns.lineplot(data=df, x='timestamp', y='cpu_usage', ax=axes[0,0])
    axes[0,0].set_title('CPU Usage')
    axes[0,0].set_ylabel('CPU (%)')
    
    # Memory Usage
    sns.lineplot(data=df, x='timestamp', y='memory_usage', ax=axes[0,1])
    axes[0,1].set_title('Memory Usage')
    axes[0,1].set_ylabel('Memory (%)')
    
    # Disk I/O
    sns.lineplot(data=df, x='timestamp', y='disk_io', ax=axes[1,0])
    axes[1,0].set_title('Disk I/O')
    axes[1,0].set_ylabel('I/O (MB/s)')
    
    # Network Traffic
    sns.lineplot(data=df, x='timestamp', y='network_traffic', ax=axes[1,1])
    axes[1,1].set_title('Network Traffic')
    axes[1,1].set_ylabel('Traffic (MB/s)')
    
    plt.tight_layout()
    plt.savefig(output_file, dpi=300, bbox_inches='tight')
    plt.show()

# Использование в cron-задаче
generate_server_report('/var/log/server_metrics.csv', '/tmp/daily_report.png')

Интересные факты и нестандартные применения

  • Анализ логов доступа — можно визуализировать количество запросов к серверу по времени
  • Мониторинг температуры — отслеживание температуры процессора и системы охлаждения
  • Анализ производительности баз данных — время отклика запросов, количество подключений
  • Сетевой мониторинг — пинг до различных серверов, потеря пакетов

Интересный пример — создание heat map из линейных данных:

# Преобразуем временные ряды в тепловую карту
def create_performance_heatmap(df):
    # Добавляем столбцы для часа и дня недели
    df['hour'] = df['timestamp'].dt.hour
    df['day_of_week'] = df['timestamp'].dt.day_name()
    
    # Создаём pivot table
    pivot_table = df.pivot_table(
        values='cpu_usage', 
        index='day_of_week', 
        columns='hour', 
        aggfunc='mean'
    )
    
    # Строим heatmap
    plt.figure(figsize=(16, 8))
    sns.heatmap(pivot_table, annot=True, fmt='.1f', cmap='YlOrRd')
    plt.title('CPU Usage Heatmap by Day of Week and Hour')
    plt.xlabel('Hour of Day')
    plt.ylabel('Day of Week')
    plt.show()

Интеграция с другими инструментами

Seaborn отлично работает с популярными инструментами мониторинга:

# Интеграция с Prometheus metrics
import requests
import json

def fetch_prometheus_metrics(prometheus_url, query, start_time, end_time):
    """Получает данные из Prometheus"""
    params = {
        'query': query,
        'start': start_time,
        'end': end_time,
        'step': '60s'
    }
    
    response = requests.get(f"{prometheus_url}/api/v1/query_range", params=params)
    data = response.json()
    
    # Преобразуем в DataFrame
    metrics = []
    for result in data['data']['result']:
        for timestamp, value in result['values']:
            metrics.append({
                'timestamp': pd.to_datetime(timestamp, unit='s'),
                'value': float(value),
                'metric': result['metric']['__name__']
            })
    
    return pd.DataFrame(metrics)

# Пример использования
# df_prometheus = fetch_prometheus_metrics(
#     'http://localhost:9090', 
#     'cpu_usage_percent', 
#     '2023-01-01T00:00:00Z', 
#     '2023-01-01T23:59:59Z'
# )

Полезные ссылки и ресурсы

Заключение и рекомендации

Seaborn — это мощный инструмент для создания линейных графиков, который особенно полезен для системных администраторов и DevOps-инженеров. Его основные преимущества:

  • Простота использования — минимальный код для создания красивых графиков
  • Интеграция с pandas — легко работать с данными из CSV, баз данных, API
  • Статистические возможности — встроенные функции для анализа данных
  • Гибкость — множество параметров для кастомизации

Когда использовать Seaborn:

  • Анализ производительности серверов
  • Мониторинг системных метрик
  • Создание дашбордов для отчётности
  • Исследование трендов в данных

Когда выбрать альтернативы:

  • Matplotlib — для максимальной кастомизации
  • Plotly — для интерактивных веб-графиков
  • Bokeh — для больших объёмов данных и веб-приложений

Рекомендую начать с простых примеров и постепенно добавлять сложности. Seaborn отлично подходит для создания скриптов мониторинга, которые можно запускать на VPS или выделенных серверах для регулярного анализа производительности системы.

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


В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.

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

Leave a reply

Your email address will not be published. Required fields are marked