为了平移绘图上的点,可以使用变换。在这种情况下,a
ScaledTranslation是有用的。不幸的是,seaborn不允许直接使用变换,也无法访问绘制的对象。因此,需要从轴获取绘制的对象(在本例中为PathCollection)。如果要偏移的图是轴上的第一个图
ax,我们可以简单地通过获取它
ax.collections[0]。然后我们可以通过设置转换
.set_transform。
fig, ax = plt.subplots()sns.pointplot(... , ax=ax)#produce transform with 5 points offset in x directionoffset = transforms.ScaledTranslation(5/72., 0, ax.figure.dpi_scale_trans)trans = ax.collections[0].get_transform()ax.collections[0].set_transform(trans + offset)
完整的代码:
import pandas as pdimport numpy as npimport seaborn as snsimport matplotlib.pyplot as pltimport matplotlib.transforms as transformstrial_vec = np.tile(np.arange(16)+1, 10) stimulus_vec = np.repeat([-2., -1.75, -1., -0.75, -0.5, 0.5, 1., 1.25, 1.75, 2.5 ], 16)data_vec = np.random.randint(0, 16, size=160)spi_num = pd.Dataframe({'trial': trial_vec, 'stimulus': stimulus_vec, 'data': data_vec})fig, ax = plt.subplots()sns.pointplot(x="stimulus", y="data", data=spi_num, linestyles='', scale=1, color='k', errwidth=1.5, capsize=0.2, markers='x', ax=ax)#produce transform with 5 points offset in x directionoffset = transforms.ScaledTranslation(5/72., 0, ax.figure.dpi_scale_trans)trans = ax.collections[0].get_transform()ax.collections[0].set_transform(trans + offset)sns.swarmplot(x="stimulus", y="data", data=spi_num, edgecolor="black", linewidth=.9, ax=ax)sns.boxplot(x="stimulus", y="data", data=spi_num, saturation=1, ax=ax)sns.pointplot(x="stimulus", y="data", data=spi_num, linestyles='--', scale=0.4, color='k', errwidth=0, capsize=0, ax=ax)plt.ylabel("number of spikes")plt.title("Median Number of Spikes");plt.show()为了转移lineplot还有,你需要做的与上面相同,其散射点(
ax.collections[1]),并在情节的所有行(
ax.lines)
sns.pointplot(x="stimulus", y="data", data=spi_num, linestyles='--', scale=0.4, color='k', errwidth=0, capsize=0, ax=ax, gid="Nm")# shift points of connecting line:trans = ax.collections[1].get_transform()ax.collections[1].set_transform(trans + offset)# shift everything else:for line in ax.lines: trans = line.get_transform() line.set_transform(trans + offset)



