Разброс графиков в Pandas/Pyplot: как строить по категориям с разными маркерами

Основываясь на этом предыдущем вопросе: Разброс графиков в Pandas/Pyplot: Как построить график по категориям.

Приведенный ниже код является решением для этого поста и отображает каждую группу другим цветом. Как можно изобразить каждую группу как отдельный маркер?

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
np.random.seed(1974)

# Generate Data
num = 20
x, y = np.random.random((2, num))
labels = np.random.choice(['a', 'b', 'c'], num)
df = pd.DataFrame(dict(x=x, y=y, label=labels))

groups = df.groupby('label')

# Plot
fig, ax = plt.subplots()
ax.margins(0.05) # Optional, just adds 5% padding to the autoscaling
for name, group in groups:
    ax.plot(group.x, group.y, marker='o', linestyle='', ms=12, label=name)
ax.legend()

plt.show()

1 ответ

Решение

Пока вы перебираете свои группы, вы можете перебирать список маркеров, используя zip, Код ниже будет перебирать markers список и назначить каждый элемент, в свою очередь, используя marker=marker в ax.plot линия.

Я также добавил itertools.cycle что приведет к тому, что итерация перейдет к началу, как только будет достигнут конец, это означает, что если у вас более 3 групп, это не сработает Если бы у вас было 4 группы, то маркеры были бы 'x', 'o', '^', 'x', например.

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
np.random.seed(1974)

from itertools import cycle

# Generate Data
num = 20
x, y = np.random.random((2, num))
labels = np.random.choice(['a', 'b', 'c'], num)
df = pd.DataFrame(dict(x=x, y=y, label=labels))

groups = df.groupby('label')

markers = ['x', 'o', '^']

# Plot
fig, ax = plt.subplots()
ax.margins(0.05) # Optional, just adds 5% padding to the autoscaling
for (name, group), marker in zip(groups, cycle(markers)):
    ax.plot(group.x, group.y, marker=marker, linestyle='', ms=12, label=name)
ax.legend()

plt.show()

Пример сюжета

Другие вопросы по тегам