Руководство по настройке маркеров в Matplotlib

PythonPythonBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

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

Советы по работе с ВМ

После запуска ВМ кликните в левом верхнем углу, чтобы переключиться на вкладку Notebook и получить доступ к Jupyter Notebook для практики.

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

Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.

Определение точек данных

Во - первых, мы определяем точки данных, которые будем использовать для наших графиков. В этом примере мы используем numpy для генерации набора значений x и y для синусоидальной волны.

import matplotlib.pyplot as plt
import numpy as np

## определить список случаев markevery для построения
cases = [
    None,
    8,
    (30, 8),
    [16, 24, 32],
    [0, -1],
    slice(100, 200, 3),
    0.1,
    0.4,
    (0.2, 0.4)
]

## точки данных
delta = 0.11
x = np.linspace(0, 10 - 2 * delta, 200) + delta
y = np.sin(x) + 1.0 + delta

Создание графиков с линейными шкалами

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

## create plots with linear scales
fig, axs = plt.subplots(3, 3, figsize=(10, 6), layout='constrained')
for ax, markevery in zip(axs.flat, cases):
    ax.set_title(f'markevery={markevery}')
    ax.plot(x, y, 'o', ls='-', ms=4, markevery=markevery)

Создание графиков с логарифмическими шкалами

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

## create plots with logarithmic scales
fig, axs = plt.subplots(3, 3, figsize=(10, 6), layout='constrained')
for ax, markevery in zip(axs.flat, cases):
    ax.set_title(f'markevery={markevery}')
    ax.set_xscale('log')
    ax.set_yscale('log')
    ax.plot(x, y, 'o', ls='-', ms=4, markevery=markevery)

Создание масштабированных графиков

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

## create zoomed plots
fig, axs = plt.subplots(3, 3, figsize=(10, 6), layout='constrained')
for ax, markevery in zip(axs.flat, cases):
    ax.set_title(f'markevery={markevery}')
    ax.plot(x, y, 'o', ls='-', ms=4, markevery=markevery)
    ax.set_xlim((6, 6.7))
    ax.set_ylim((1.1, 1.7))

Создание полярных графиков

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

## create polar plots
r = np.linspace(0, 3.0, 200)
theta = 2 * np.pi * r

fig, axs = plt.subplots(3, 3, figsize=(10, 6), layout='constrained',
                        subplot_kw={'projection': 'polar'})
for ax, markevery in zip(axs.flat, cases):
    ax.set_title(f'markevery={markevery}')
    ax.plot(theta, r, 'o', ls='-', ms=4, markevery=markevery)

Обзор

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