Действительно, первый аргумент colorbar
должен быть ScalarMappable
, который будет представлять собой график рассеяния PathCollection
.
Настройка
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas as pd
df = pd.DataFrame({"x" : np.linspace(0,1,20),
"y" : np.linspace(0,1,20),
"cluster" : np.tile(np.arange(4),5)})
cmap = mpl.colors.ListedColormap(["navy", "crimson", "limegreen", "gold"])
norm = mpl.colors.BoundaryNorm(np.arange(-0.5,4), cmap.N)
Pandas plotting
Проблема заключается в том, что pandas не предоставляет вам доступ к этому ScalarMappable
напрямую.Таким образом, его можно поймать из списка коллекций на осях, что легко сделать, если присутствует только одна коллекция: ax.collections[0]
.
fig, ax = plt.subplots()
df.plot.scatter(x='x', y='y', c='cluster', marker='+', ax=ax,
cmap=cmap, norm=norm, s=100, edgecolor ='none', alpha=0.70, colorbar=False)
fig.colorbar(ax.collections[0], ticks=np.linspace(0,3,4))
plt.show()
Построение Matplotlib
Можно рассмотретьиспользуя matplotlib напрямую для построения диаграммы, в этом случае вы бы непосредственно использовали возврат функции scatter
в качестве аргумента для colorbar
.
fig, ax = plt.subplots()
scatter = ax.scatter(x='x', y='y', c='cluster', marker='+', data=df,
cmap=cmap, norm=norm, s=100, edgecolor ='none', alpha=0.70)
fig.colorbar(scatter, ticks=np.linspace(0,3,4))
plt.show()
Вывод в обоих случаях идентичен.
