Overplot seaborn regplot 和 swarmplot
Overplot seaborn regplot and swarmplot
我想在 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 从未显示在绘图上。我该如何解决这个问题?
编辑:我的 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)
第二次编辑:下面的双轴解决方案效果很好!
原则上,同时绘制 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()
关于问题的编辑部分:
由于 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
我想在 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 从未显示在绘图上。我该如何解决这个问题?
编辑:我的 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)
第二次编辑:下面的双轴解决方案效果很好!
原则上,同时绘制 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()
关于问题的编辑部分:
由于 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