微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有颜色的swarmplot影响标记超出颜色

如何解决带有颜色的swarmplot影响标记超出颜色

实际上,我前段时间曾想到过同样的问题。我没有提出最好的解决方案,但是我有一个可以正常工作的技巧。不幸的是,如果使用,实现起来要容易得多dodge=True

这个想法是收集由PathCollections创建的对象swarmplot。如果是dodge=True这样,您将获得N_cat*N_hues+N_hues收藏(N_hues附加功能用于创建图例)。您可以简单地遍历该列表。由于我们希望所有色调都相同,因此我们使用N_hues步幅来获取与每种色调相对应的所有集合。之后,您可以自由地paths将该集合的更新为Path您选择的任何对象。请参考文档Path以了解如何创建路径。

为了简化操作,我在动手之前创建了一些虚拟散点图,以获得Paths可以使用的预制物。当然,任何人Path都应该能够工作。

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()

在此处输入图片说明

可以与一起使用的解决方dodge=False

如果您使用dodge=False,那么您将获得N + 2个集合,每个类别一个,图例+2。问题在于这些集合中所有不同的标记颜色都被弄乱了。

一种可能但很丑陋的解决方案是遍历集合的每个元素,并Path基于每个元素的颜色创建对象数组。

import seaborn as sns
import matplotlib.pyplot as plt
sns.set(style="whitegrid")
tips = sns.load_dataset("tips")

fig, ax = plt.subplots(1,1)
ax = sns.swarmplot(x="day", y="total_bill", hue="sex",data=tips,size=8,ax=ax, dodge=False)

collections = ax.collections
unique_colors = np.unique(collections[0].get_facecolors(), axis=0)
markers = [triangle_up_mk, square_mk]  # this array must be at least as large as the number of unique colors
for collection in collections:
    paths = []
    for current_color in collection.get_facecolors():
        for possible_marker,possible_color in zip(markers, unique_colors):
            if np.array_equal(current_color,possible_color):
                paths.append(possible_marker)
                break
    collection.set_paths(paths)
#update legend
ax.legend(collections[-2:],pd.unique(tips.sex))

plt.show()

在此处输入图片说明

解决方法

我正试图通过使色调不仅影响颜色而且影响标记的其他几何形状,使黑白字样的商品更容易阅读,并且对于有色盲的人也是如此。

MWE

import seaborn as sns
import matplotlib.pyplot as plt
sns.set(style="whitegrid")
tips = sns.load_dataset("tips")

fig,ax = plt.subplots(1,1)
ax = sns.swarmplot(x="day",y="total_bill",hue="sex",data=tips,size=8,ax=ax)
plt.show()

结果

在此处输入图片说明

所需结果(左侧)

在此处输入图片说明

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。