Python Seaborn散点图图例显示真实值和标准化连续颜色
我有一个数据框,我想用它来构建一个散点图,其中不同的点有不同的颜色:Python Seaborn散点图图例显示真实值和标准化连续颜色,python,pandas,matplotlib,seaborn,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']-d
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))
如您所见,列c_norm
显示c
列已在0和1之间标准化。我想显示一个连续的图例,其颜色范围反映标准化值,但使用原始c
值作为标签进行标记。比如说,最小值(1
),最大值(86
)和中间值(49
)。我还希望根据组
使用不同的标记
到目前为止,我能够做到这一点:
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)
问题:-如何基于这些值生成连续图例? -如何调整其刻度以在
c
中显示原始刻度,或至少在min
、max
和平均值或中值中显示原始刻度
提前感谢部分回答。您真的需要根据标准值确定标记颜色吗?请参见下面代码段的输出
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()
您完全可以修改第二个颜色栏,使其与第一个颜色栏匹配,但这是必要的吗?您要求连续的颜色栏,这让我想建议您使用颜色栏。这能满足你的需要吗?@Patol75是的,那会有用的!我唯一关心的是,我仍然需要区分两种类型的标记(点和叉,对于dat['group']
),我还添加了用于生成图形的代码