Легенда Seaborn Scatterplot, показывающая истинные значения и нормализованный непрерывный цвет - PullRequest
0 голосов
/ 17 октября 2019

У меня есть фрейм данных, который я хотел бы использовать для построения диаграммы рассеяния, в которой разные точки имеют разные цвета:

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd

dat=pd.DataFrame(np.random.rand(20, 2), columns=['x','y'])
dat['c']=np.random.randint(0,100,20)
dat['c_norm']=(dat['c']-dat['c'].min())/(dat['c'].max()-dat['c'].min())
dat['group']=np.append(np.repeat('high',10), np.repeat('low',10))

enter image description here

AsВы можете видеть, что столбец c_norm показывает, что столбец c нормализован между 0 и 1. Я хотел бы показать непрерывную легенду, цветовой диапазон которой отражает нормализованные значения, но помеченный с использованием исходных значений c в качестве метки,Скажем, минимум (1), максимум (86) и медиана (49). Я также хочу иметь разные маркеры в зависимости от group.

До сих пор я был в состоянии сделать это:

fig = plt.figure(figsize = (8,8))
ax = fig.add_subplot(1,1,1) 

for row in dat.index:
    if(dat.loc[row,'group']=='low'):
        i_marker='.'
    else:
        i_marker='x'

    ax.scatter(
        x=dat.loc[row,'x'],
        y=dat.loc[row,'y'],
        s=50, alpha=0.5,
        marker=i_marker
    )
    ax.legend(dat['c_norm'], loc='center right', bbox_to_anchor=(1.5, 0.5), ncol=1)

enter image description here

Вопросы:
- Как создать непрерывную легенду на основе значений? - Как адаптировать свои галочки для отображения оригинальных галочек в c, или, по крайней мере, min, max и mean или median?

Заранее спасибо

1 Ответ

0 голосов
/ 17 октября 2019

Частичный ответ. Вам действительно нужно определить цвета вашего маркера на основе нормированных значений? Смотрите вывод фрагмента ниже.

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

dat = pd.DataFrame(np.random.rand(20, 2), columns=['x', 'y'])
dat['c'] = np.random.randint(0, 100, 20)
dat['c_norm'] = (dat['c'] - dat['c'].min()) / (dat['c'].max() - dat['c'].min())
dat['group'] = np.append(np.repeat('high', 10), np.repeat('low', 10))
fig, (ax, bx) = plt.subplots(nrows=1, ncols=2, num=0, figsize=(16, 8))
mask = dat['group'] == 'low'
scat = ax.scatter(dat['x'][mask], dat['y'][mask], s=50, c=dat['c'][mask],
                  marker='s', vmin=np.amin(dat['c']), vmax=np.amax(dat['c']),
                  cmap='plasma')
ax.scatter(dat['x'][~mask], dat['y'][~mask], s=50, c=dat['c'][~mask],
           marker='X', vmin=np.amin(dat['c']), vmax=np.amax(dat['c']),
           cmap='plasma')
cbar = fig.colorbar(scat, ax=ax)
scat = bx.scatter(dat['x'][mask], dat['y'][mask], s=50, c=dat['c_norm'][mask],
                  marker='s', vmin=np.amin(dat['c_norm']),
                  vmax=np.amax(dat['c_norm']), cmap='plasma')
bx.scatter(dat['x'][~mask], dat['y'][~mask], s=50, c=dat['c_norm'][~mask],
           marker='X', vmin=np.amin(dat['c_norm']),
           vmax=np.amax(dat['c_norm']), cmap='plasma')
cbar2 = fig.colorbar(scat, ax=bx)
plt.show()

enter image description here

Вы можете определенно изменить вторую цветовую панель так, чтобы она соответствовала первой, но это то, чтонеобходимо?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...