Seaborn散点图图例显示真实值和标准化的连续色

时间:2019-10-17 08:40:40

标签: python pandas matplotlib seaborn

我有一个数据框,可用于构建散点图,其中不同点的颜色不同:

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

如您所见,列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或至少minmaxmeanmedian中的原始刻度?

预先感谢

1 个答案:

答案 0 :(得分:1)

部分答案。您实际上是否需要根据标准值确定标记颜色?请参见下面的代码段输出。

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

您绝对可以修改第二个颜色条,使其与第一个颜色条匹配,但这是必需的吗?