matplotlib 如何使Swarmplot(Seaborn)中的点相互重叠?

dly7yett  于 2023-04-21  发布在  其他
关注(0)|答案(3)|浏览(194)

我用seaborn做了一个蜂群图,但我似乎找不到使点彼此重叠的选项。
他们彼此之间,只有彼此,只有彼此。
我希望他们作出重叠无处不在时,他们将不能适合,但现在他们只重叠在双方。

data = sns.load_dataset('iris')
sns.swarmplot(data=data, y="sepal_length", x="species", edgecolor="black",alpha=.5, s=15,linewidth=1.0)

jgovgodb

jgovgodb1#

我认为在群体图中不可能故意让标记重叠。当然,如果需要的话,较小的标记根本不会重叠。
否则,一个黑客的说法是使用seaborn硬编码标记之间的距离为一个特定的数字大小的事实。因此,当绘制一个巨大的数字,没有重叠发生,但然后使数字更小 * 之后 *,重叠应该是相当高的。

import seaborn as sns
import matplotlib.pyplot as plt

data = sns.load_dataset('iris')
fig, ax = plt.subplots(figsize=(19,4.8))
sns.swarmplot(data=data, y="sepal_length", x="species", 
                   edgecolor="black",alpha=.5, s=15,linewidth=1.0, ax=ax)
fig.set_size_inches(6.4,4.8)

plt.show()

在这里,您需要为figsize找到合适的值,以便您对结果感到满意。

cuxqih21

cuxqih212#

你也可以用stripplot来代替swarmplot。据我所知,swarmplot的全部意义是有一个类似于stripplot的输出,但是点 * 不 * 重叠。

data = sns.load_dataset('iris')
sns.stripplot(data=data, y="sepal_length", x="species", edgecolor="black",alpha=.5, s=15,linewidth=1.0)

此外,还可以使用the jitter= keyword控制重叠量

jm2pwxwz

jm2pwxwz3#

另一个根据分布(stripplot不可能)和项目之间的重叠(以及速度)进行聚类的解决方案是定义一个自定义的density_jitter函数:

def density_jitter(values, width=1.0, cluster_factor=1.0):
    """
    Add jitter to a 1D array of values, using a kernel density estimate
    """
    inds = np.arange(len(values))
    np.random.shuffle(inds)
    values = values[inds]
    N = len(values)
    nbins = 100
    quant = np.round(nbins * (values - np.min(values)) / (np.max(values) - np.min(values) + 1e-8))
    inds = np.argsort(quant + np.random.randn(N) * 1e-6)
    layer = 0
    last_bin = -1
    ys = np.zeros(N)
    for ind in inds:
        if quant[ind] != last_bin:
            layer = 0
        ys[ind] = cluster_factor * (np.ceil(layer / 2) * ((layer % 2) * 2 - 1))
        layer += 1
        last_bin = quant[ind]
    ys *= 0.9 * (width / np.max(ys + 1))

    return ys

data = sns.load_dataset('iris')

for ind, species in enumerate(data.species.unique()):
    ys = density_jitter(data[data.species == species].sepal_length.values, width=0.4, cluster_factor=0.2)
    plt.scatter(ind + ys, data[data.species == species].sepal_length.values, alpha=0.3, color=plt.cm.tab10(ind))
plt.xticks(np.arange(3), data.species.unique())
plt.show()

相关问题