Overplot seaborn regplot and swarmplot

时间:2017-01-22 03:52:27

标签: python matplotlib seaborn

我想在seaborn上绘制一个swarmplot和regplot,以便我可以通过我的swarmplot获得y = x行。

import matplotlib.pyplot as plt
import seaborn as sns

sns.regplot(y=y, x=x, marker=' ', color='k')
sns.swarmplot(x=x_data, y=y_data)

我绘制时没有任何错误,但是regplot从未显示在情节上。我该如何解决这个问题?

plot

编辑:我的regplot和swarmplot不会过度绘图,而是在同一帧中绘制,但是以一些未指定的y量分隔。如果我翻转它们以使regplot高于swarmplot的调用,则regplot根本不显示。

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

df = pd.DataFrame({"x":x_data,"y":y_data} )

sns.regplot(y="y", x="x", data= df, color='k', scatter_kws={"alpha" : 0.0})
sns.swarmplot(y="y", x="x", data= df)

updated plot

第二次编辑:下面的双轴解决方案效果很好!

1 个答案:

答案 0 :(得分:1)

原则上,绘制swarmplot和regplot的方法可以很好地协同工作。

这里的问题是你设置了一个空标记(marker = " ")。这会破坏regplot,使其无法显示。显然,在将几个事物绘制到同一个图形时,这只是一个问题;使用空标记绘制单个regplot可以正常工作。

解决方案不是指定标记参数,而是使用scatter_kws参数设置标记不可见:scatter_kws={"alpha" : 0.0}

这是一个完整的例子:

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

## generate some data
n=19; m=9
y_data = []
for i in range(m):
    a = (np.random.poisson(lam=0.99-float(i)/m,size=n)+i*.9+np.random.rand(1)*2)
    a+=(np.random.rand(n)-0.5)*2
    y_data.append(a*m)
y_data = np.array(y_data).flatten()
x_data = np.floor(np.sort(np.random.rand(n*m))*m)
## put them into dataframe
df = pd.DataFrame({"x":x_data,"y":y_data} )

## plotting
sns.regplot(y="y", x="x", data= df, color='k', scatter_kws={"alpha" : 0.0})
sns.swarmplot(x="x", y="y", data= df)

plt.show()

enter image description here

<小时/> 关于问题的编辑部分:
由于swarmplot是一个分类图,图中的轴仍然从-0.5到8.5,而不是标签从10到18。 一种可能的解决方法是使用两个轴和twiny

fig, ax = plt.subplots()
ax2 = ax.twiny()
sns.swarmplot(x="x", y="y", data= df, ax=ax)
sns.regplot(y="y", x="x", data= df, color='k', scatter_kws={"alpha" : 0.0},  ax=ax2)
ax2.grid(False) #remove grid as it overlays the other plot