Как нарисовать линейный график и столбчатую диаграмму в Matplotlib: Пошаговое руководство

Введение в Matplotlib для визуализации данных

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

Установка и импорт библиотеки Matplotlib

Установить Matplotlib можно с помощью pip:

pip install matplotlib

Для использования библиотеки в вашем коде необходимо импортировать модуль pyplot, который предоставляет интерфейс, похожий на MATLAB:

import matplotlib.pyplot as plt

Основные компоненты графика в Matplotlib (Figure, Axes)

В Matplotlib график состоит из двух основных частей:

  • Figure: Это контейнер верхнего уровня, представляющий собой целое окно или страницу, на которой отображаются графики.
  • Axes: Это область на Figure, на которой фактически рисуется график. Одна Figure может содержать несколько Axes.

Подготовка данных для построения графиков

Перед построением графика необходимо подготовить данные. Обычно это списки или массивы NumPy с числовыми значениями. Например, для линейного графика нужны координаты X и Y, а для столбчатой диаграммы — категории и соответствующие значения.

Создание линейного графика в Matplotlib

Простой линейный график: plot() функция

Функция plot() используется для создания линейных графиков. Ей передаются массивы X и Y координат:

import matplotlib.pyplot as plt
from typing import List

# Sample data for ad campaign performance
days: List[int] = list(range(1, 8)) # Days of the week
impressions: List[int] = [1500, 1800, 2200, 2500, 2300, 2000, 1900] # Number of impressions each day

plt.plot(days, impressions)
plt.xlabel("Day")
plt.ylabel("Impressions")
plt.title("Ad Campaign Performance")
plt.show()

Настройка внешнего вида линейного графика (цвет, стиль линии, маркеры)

Можно настроить внешний вид графика, указав цвет, стиль линии и маркеры:

import matplotlib.pyplot as plt

# Search query volume data
months: List[str] = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"] # Months of the year
search_volume: List[int] = [800, 1200, 1500, 1800, 1600, 1400] # Search volume for a specific keyword

plt.plot(months, search_volume, color='green', linestyle='dashed', marker='o')
plt.xlabel("Month")
plt.ylabel("Search Volume")
plt.title("Keyword Search Volume Trend")
plt.show()

Добавление заголовка, меток осей и легенды

Для улучшения читабельности графика добавьте заголовок, метки осей и легенду:

import matplotlib.pyplot as plt

# Website traffic data for two sources
time: List[int] = list(range(1, 11)) # Hours of the day
source_a_traffic: List[int] = [10, 15, 13, 17, 20, 18, 22, 25, 23, 21] # Website traffic from source A
source_b_traffic: List[int] = [8, 12, 10, 14, 16, 15, 18, 20, 19, 17] # Website traffic from source B

plt.plot(time, source_a_traffic, label='Source A')
plt.plot(time, source_b_traffic, label='Source B')
plt.xlabel("Time (Hour)")
plt.ylabel("Website Traffic")
plt.title("Website Traffic Comparison")
plt.legend()
plt.show()

Работа с несколькими графиками на одном рисунке (subplot)

Функция subplot() позволяет размещать несколько графиков на одной Figure:

import matplotlib.pyplot as plt

# Conversion rate and bounce rate data
months: List[str] = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"] # Months of the year
conversion_rate: List[float] = [0.02, 0.025, 0.028, 0.032, 0.03, 0.027] # Conversion rate
bounce_rate: List[float] = [0.4, 0.38, 0.35, 0.32, 0.33, 0.36] # Bounce rate

plt.subplot(1, 2, 1) # 1 row, 2 columns, first subplot
plt.plot(months, conversion_rate)
plt.xlabel("Month")
plt.ylabel("Conversion Rate")
plt.title("Conversion Rate Trend")

plt.subplot(1, 2, 2) # 1 row, 2 columns, second subplot
plt.plot(months, bounce_rate)
plt.xlabel("Month")
plt.ylabel("Bounce Rate")
plt.title("Bounce Rate Trend")

plt.tight_layout() # Adjust subplots for better layout
plt.show()

Создание столбчатой диаграммы (bar chart) в Matplotlib

Простая столбчатая диаграмма: bar() функция

Функция bar() используется для создания столбчатых диаграмм. Ей передаются категории и соответствующие значения:

import matplotlib.pyplot as plt

# Sales data for different products
products: List[str] = ["Product A", "Product B", "Product C", "Product D"] # Product names
sales: List[int] = [120, 150, 90, 110] # Sales for each product

plt.bar(products, sales)
plt.xlabel("Product")
plt.ylabel("Sales")
plt.title("Product Sales Comparison")
plt.show()

Настройка внешнего вида столбцов (цвет, ширина, границы)

Можно настроить цвет, ширину и границы столбцов:

import matplotlib.pyplot as plt

# Website traffic from different sources
sources: List[str] = ["Organic", "Paid Ads", "Referral", "Direct"] # Traffic sources
traffic: List[int] = [500, 300, 150, 200] # Traffic from each source

plt.bar(sources, traffic, color='skyblue', width=0.7, edgecolor='black')
plt.xlabel("Source")
plt.ylabel("Traffic")
plt.title("Website Traffic by Source")
plt.show()

Горизонтальные столбчатые диаграммы: barh() функция

Для создания горизонтальной столбчатой диаграммы используйте функцию barh():

import matplotlib.pyplot as plt

# Customer satisfaction ratings for different aspects of a service
aspects: List[str] = ["Ease of Use", "Customer Support", "Pricing", "Features"] # Service aspects
satisfaction: List[float] = [4.5, 4.2, 3.8, 4.0] # Satisfaction ratings

plt.barh(aspects, satisfaction)
plt.xlabel("Satisfaction Rating")
plt.ylabel("Aspect")
plt.title("Customer Satisfaction")
plt.show()

Группированные и составные столбчатые диаграммы

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

import matplotlib.pyplot as plt
import numpy as np

# Data for two different cohorts' performance on A/B test
categories: List[str] = ["A", "B", "C", "D"] # Categories
cohort_1_values: List[int] = [10, 15, 13, 17] # Values for cohort 1
cohort_2_values: List[int] = [8, 12, 10, 14]  # Values for cohort 2

# Set the positions of the bars on the x-axis
x = np.arange(len(categories))
width = 0.35  # Width of the bars

fig, ax = plt.subplots()
rects1 = ax.bar(x - width/2, cohort_1_values, width, label='Cohort 1')
rects2 = ax.bar(x + width/2, cohort_2_values, width, label='Cohort 2')

# Add some text for labels, title and custom x-axis tick labels, etc.
ax.set_ylabel('Values')
ax.set_title('A/B Test Result Comparison')
ax.set_xticks(x)
ax.set_xticklabels(categories)
ax.legend()

fig.tight_layout()

plt.show()

Совместное использование линейных графиков и столбчатых диаграмм

Наложение линейного графика на столбчатую диаграмму

Можно наложить линейный график на столбчатую диаграмму, чтобы показать различные аспекты данных:

import matplotlib.pyplot as plt

# Website traffic and conversion rate data
months: List[str] = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"] # Months of the year
traffic: List[int] = [5000, 6000, 7500, 8000, 7000, 6500] # Website traffic
conversion_rate: List[float] = [0.02, 0.025, 0.028, 0.032, 0.03, 0.027] # Conversion rate

plt.bar(months, traffic, label='Traffic')
plt.plot(months, [x * 1000 for x in conversion_rate], color='red', marker='o', label='Conversion Rate (x1000)')
plt.xlabel("Month")
plt.ylabel("Traffic / Conversion Rate")
plt.title("Website Traffic and Conversion Rate")
plt.legend()
plt.show()

Использование различных осей Y для разных типов данных

Если данные имеют разные масштабы, используйте разные оси Y:

import matplotlib.pyplot as plt

# Ad spend and website traffic data
months: List[str] = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"] # Months of the year
ad_spend: List[int] = [1000, 1200, 1500, 1800, 1600, 1400] # Ad spend
traffic: List[int] = [5000, 6000, 7500, 8000, 7000, 6500] # Website traffic

fig, ax1 = plt.subplots()

ax1.bar(months, ad_spend, color='skyblue', label='Ad Spend')
ax1.set_xlabel("Month")
ax1.set_ylabel("Ad Spend", color='skyblue')
ax1.tick_params(axis='y', labelcolor='skyblue')

ax2 = ax1.twinx()
ax2.plot(months, traffic, color='red', marker='o', label='Traffic')
ax2.set_ylabel("Traffic", color='red')
ax2.tick_params(axis='y', labelcolor='red')

plt.title("Ad Spend and Website Traffic")
fig.tight_layout()
plt.show()

Примеры комбинированной визуализации данных

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

Дополнительные возможности и продвинутые техники

Добавление аннотаций и текста на графики

Функция annotate() позволяет добавлять аннотации на график:

import matplotlib.pyplot as plt

# Click-through rate data
days: List[int] = list(range(1, 8)) # Days of the week
ctr: List[float] = [0.015, 0.018, 0.02, 0.022, 0.021, 0.019, 0.017] # Click-through rate

plt.plot(days, ctr, marker='o')
plt.xlabel("Day")
plt.ylabel("Click-Through Rate")
plt.title("Click-Through Rate Trend")

plt.annotate('Peak CTR', xy=(4, 0.022), xytext=(5, 0.02), arrowprops=dict(facecolor='black', shrink=0.05))

plt.show()

Сохранение графиков в файл (PNG, JPG, SVG, PDF)

Функция savefig() позволяет сохранять графики в различные форматы:

import matplotlib.pyplot as plt

# Sample sales data
products: List[str] = ["Product A", "Product B", "Product C"] # Product names
sales: List[int] = [100, 120, 90] # Sales values

plt.bar(products, sales)
plt.xlabel("Product")
plt.ylabel("Sales")
plt.title("Product Sales")

plt.savefig('product_sales.png')

Использование стилей и шаблонов для улучшения внешнего вида

Matplotlib предоставляет стили и шаблоны для улучшения внешнего вида графиков:

import matplotlib.pyplot as plt

plt.style.use('ggplot') # Using the 'ggplot' style

# Sample data (replace with your actual data)
x = [1, 2, 3, 4, 5]
y = [2, 4, 1, 3, 5]

plt.plot(x, y)
plt.title('Styled Plot Example')
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()

Работа с большими объемами данных и оптимизация производительности

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


Добавить комментарий