Разброс графиков в 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()