Цвета оттенка, цветовой полосы или диаграммы рассеяния не совпадают в seaborn.scatterplot - PullRequest
0 голосов
/ 13 июля 2020

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

x= [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 200]
y= [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 200]
z= [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 255]

df = pd.DataFrame(list(zip(x, y, z)), columns =['x', 'y', 'z']) 


colormap=matplotlib.cm.viridis
#A continuous color bar needs to be added independently
norm = plt.Normalize(df.z.min(), df.z.max())
sm = plt.cm.ScalarMappable(cmap=colormap, norm=norm)
sm.set_array([])

fig = plt.figure(figsize = (10,8), dpi=300)
ax = fig.add_subplot(1,1,1) 
sb.scatterplot(x="x", y="y",
                 hue="z", 
                 hue_norm=(0,255),
                 data=df,
                 palette=colormap,
                 ax=ax
                 )
ax.legend(bbox_to_anchor=(0, 1), loc=2, borderaxespad=0., title='hue from sb.scatterplot')
ax.figure.colorbar(sm).set_label('hue from sm')

plt.xlim(0,255)
plt.ylim(0,255)
plt.show()

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

Обратите внимание, как оттенок из диаграммы рассеяния, даже с hue_norm, изменяется до 300. В свою очередь, оттенок из colorbar колеблется от 0 до 255. Экспериментируя со значениями в hue_norm, кажется, что matplotlib всегда округляет его, чтобы у вас было «хорошее» (даже?) Количество интервалов.

Мои вопросы:

  1. Какой из них показывает неправильный диапазон: диаграмма рассеяния, легенда диаграммы рассеяния или цветовая шкала? И как это исправить?
  2. Как вы могли получить минимальный и максимальный оттенок из диаграммы рассеяния (в данном случае 0 и 300 соответственно), чтобы установить их как максимальные и минимальные из colorbar?

1 Ответ

1 голос
/ 13 июля 2020

Вам действительно нужно использовать scatterplot() seaborn. Использование числового hue всегда довольно беспорядочно.

Следующий код намного проще и дает однозначный результат

fig, ax = plt.subplots()
g = ax.scatter(df['x'],df['y'], c=df['z'], cmap=colormap)
fig.colorbar(g)

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

...