【问题标题】:Overplot seaborn regplot and swarmplotOverplot seaborn regplot 和 swarmplot
【发布时间】:2020-07-21 00:42:30
【问题描述】:

我想在 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 中的 x 轴是分类的,而不是定量的。你为什么要这样做?
  • 我想在swarmplot中展示趋势。
  • 这不能回答问题。你需要更加努力地思考你想要做什么。

标签: python matplotlib seaborn swarmplot


【解决方案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()


关于问题的已编辑部分:
由于 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

【讨论】:

  • 这适用于 violinplot 和 regplot,但不适用于 swarmplot 和 regplot。
  • 正如我所说,我无法使用 seaborn > 0.7.dev 对其进行测试。在我的示例中使用 swarmplot 而不是 violinplot 会发生什么?与问题中的问题相同?
  • 我现在已经修改了一个使用 swarmplot 的解决方案。其实和之前用小提琴的情节是一样的,所以真的没有区别。
  • 太棒了!谢谢!这不是我投的反对票,但我能够投赞成票并取消投票。
  • 我在尝试这个时遇到了问题。我完全复制了您的代码,但将 x_data 和 y_data 替换为我的实际数据。我将我的问题添加为上面的编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-09
  • 1970-01-01
  • 1970-01-01
  • 2015-08-01
  • 2017-10-03
  • 2016-01-05
  • 2021-05-01
相关资源
最近更新 更多