<p>其实我之前也想过同样的问题。我没有想出最好的解决方案,但我有一个黑客,工作正常。不幸的是,如果使用<code>dodge=True</code>,则实现起来要容易得多。在</p>
<p>其思想是收集由<code>swarmplot</code>创建的<code>PathCollections</code>对象。如果<code>dodge=True</code>,那么您将得到<code>N_cat*N_hues+N_hues</code>个集合(N_hues extra用于创建图例)。您可以简单地遍历该列表。因为我们希望所有的色调都是相同的,所以我们使用N_hues步幅来获得与每个色调对应的所有集合。之后,您可以将该集合的<code>paths</code>更新为您选择的任何<code>Path</code>对象。请参阅<a href="https://matplotlib.org/api/path_api.html#module-matplotlib.path" rel="nofollow noreferrer">the documentation for ^{<cd7>}</a>以了解如何创建路径。在</p>
<p>为了简化操作,我在手之前创建了一些虚拟的散点图,以获得一些可以使用的预制<code>Paths</code>。当然,任何<code>Path</code>都应该能够工作。在</p>
<pre><code>import seaborn as sns
import matplotlib.pyplot as plt
sns.set(style="whitegrid")
tips = sns.load_dataset("tips")
fig, ax = plt.subplots(1,1)
# dummy plots, just to get the Path objects
a = ax.scatter([1,2],[3,4], marker='s')
b = ax.scatter([1,2],[3,4], marker='^')
square_mk, = a.get_paths()
triangle_up_mk, = b.get_paths()
a.remove()
b.remove()
ax = sns.swarmplot(x="day", y="total_bill", hue="sex",data=tips,size=8,ax=ax, dodge=True)
N_hues = len(pd.unique(tips.sex))
c = ax.collections
for a in c[::N_hues]:
a.set_paths([triangle_up_mk])
for a in c[1::N_hues]:
a.set_paths([square_mk])
#update legend
ax.legend(c[-2:],pd.unique(tips.sex))
plt.show()
</code></pre>
<p><a href="https://i.stack.imgur.com/9hdFq.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/9hdFq.png" alt="enter image description here"/></a></p>
<p><strong>更新</strong>与<code>dodge=False</code>“合作”的解决方案。在</p>
<p>如果使用<code>dodge=False</code>,那么将得到N+2个集合,每个类别一个,图例+2个。问题是所有不同的标记颜色在这些集合中都是混乱的。在</p>
<p>一个可能的,但很难看的解决方案是循环访问集合的每个元素,并基于每个元素的颜色创建一个<code>Path</code>对象的数组。在</p>
^{pr2}$
<p><a href="https://i.stack.imgur.com/1nLI7.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/1nLI7.png" alt="enter image description here"/></a></p>