我有一个带状图,其中使用合并的数据为数据点着色。我想显示一个色条,而不是图例。我看过许多示例,但我一直坚持如何在Seaborn Stripplot(和我的数据集)中使用它。
我有一个数据框dfBalance,它在Balance列中有数值数据,而在Parameter列中有不同的类别。它还在“时间”列中包含时间,我用于对数据点进行着色的分箱
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.DataFrame([[40, 'A',65], [-10, 'A',125], [60, 'B',65], [5, 'B',135], [8, 'B',205], [14, 'B',335]], columns=['Balance', 'Parameter', 'Time'])
bin = np.arange(0,max(df['Time']),60)
df['bin'] = pd.cut(abs(df['Time']),bin,precision=0)
plt.figure()
cpal=sns.color_palette('cmo.balance',n_colors=28,desat=0.8)
plt.style.use("seaborn-dark")
ax = sns.stripplot(x='Balance', y='Parameter', data=df, jitter=0.15, edgecolor='none', alpha=0.4, size=4, hue='bin', palette=cpal)
sns.despine()
ax.set_xlim([-45,45])
plt.title("L/R Balance")
plt.xlabel("Balance % L/R")
plt.ylabel("Parameter")
sns.set_context("notebook", font_scale=1.5, rc={"lines.linewidth": 2.5})
plt.legend(loc=1)
plt.show()
是否可以用颜色条替换图例?
答案 0 :(得分:1)
最后,我认为解决方案应该与the one proposed in this recent question完全相同,并且可以/应该将当前问题标记为重复。
我不得不稍微修改一下您的代码,因为我不能很好地理解要点,但是希望不会有太大的改变。
from matplotlib.cm import ScalarMappable
df = pd.DataFrame({'Balance': np.random.normal(loc=0, scale=40, size=(1000,)),
'Parameter': [['A','B'][i] for i in np.random.randint(0,2, size=(1000,))],
'Time': np.random.uniform(low=0, high=301, size=(1000,))})
bin = np.arange(0,max(df['Time']),60)
df['bin'] = pd.cut(abs(df['Time']),bin,precision=0)
plt.figure()
cpal=sns.color_palette('Spectral',n_colors=5,desat=1.)
plt.style.use("seaborn-dark")
ax = sns.stripplot(x='Balance', y='Parameter', data=df, jitter=0.15, edgecolor='none', alpha=0.4, size=4, hue='bin', palette=cpal)
sns.despine()
ax.set_xlim([-45,45])
plt.title("L/R Balance")
plt.xlabel("Balance % L/R")
plt.ylabel("Parameter")
sns.set_context("notebook", font_scale=1.5, rc={"lines.linewidth": 2.5})
# This is the part about the colormap
cmap = plt.get_cmap("Spectral")
norm = plt.Normalize(0, df['Time'].max())
sm = ScalarMappable(norm=norm, cmap=cmap)
sm.set_array([])
cbar = fig.colorbar(sm, ax=ax)
cbar.ax.set_title("\"bins\"")
#remove the legend created by seaborn
ax.legend_.remove()
plt.show()