Создайте дискретную цветовую полосу в matplotlib

Я пробовал другие темы, но не могу понять, как решить. Я пытаюсь создать дискретную цветовую полосу. Похоже, что большая часть кода работает, дискретная полоса появляется, но метки неверны, и выдается ошибка: «Не найдено сопоставление для создания цветовой полосы. Сначала определите сопоставление, например изображение (с помощью imshow) или набор контуров (с контуромf)».

Почти уверен, что ошибка связана с тем, что мне не хватает аргумента в plt.colorbar, но я не уверен, что он запрашивает или как его определить.

Ниже то, что у меня есть. Любые мысли с благодарностью получены:

import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

fig, ax = plt.subplots()
norm = mpl.colors.BoundaryNorm(np.arange(-0.5,4), cmap.N) 

ex2 = sample_data.plot.scatter(x='order_count', y='total_value',c='cluster', marker='+', ax=ax, cmap='plasma', norm=norm, s=100, edgecolor ='none', alpha=0.70)

plt.colorbar(ticks=np.linspace(0,3,4))
plt.show()

person Winby    schedule 18.11.2018    source источник


Ответы (1)


В самом деле, первым аргументом 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) 

Панды рисуют

Проблема в том, что панды не предоставляют вам доступ к этому 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()

Выход в обоих случаях идентичен.

введите описание изображения здесь

person ImportanceOfBeingErnest    schedule 18.11.2018
comment
Поскольку значения дискретны, вместо np.linspace(0,3,4) вы можете использовать range(4), и результат будет таким же (если вы не хотите придерживаться диапазонов NumPy). - person noamtm; 17.02.2020
comment
Что, если я не хочу, чтобы это были числа 0,1,2,3? Но вместо имен А, В, С, D - person Satyapriya Krishna; 23.03.2021