gpt4 book ai didi

matplotlib - Seaborn 的箱线图+群图 : different color for x, 不同的色调符号

转载 作者:行者123 更新时间:2023-12-03 16:53:03 31 4
gpt4 key购买 nike

我正在尝试使用具有不同 x 的 seaborn 生成箱线图组和其他 hues .看到这个代码:

tips = sns.load_dataset("tips")

sns.stripplot(x="day", y="total_bill", hue="smoker",
data=tips, jitter=True,
palette="Set2", split=True,linewidth=1,edgecolor='gray')

sns.boxplot(x="day", y="total_bill", hue="smoker",
data=tips,palette="Set2",fliersize=0)

enter image description here

我要每个 x箱线图(在本例中,每天)是不同的颜色,而每个 hue (在这种情况下,吸烟者/非吸烟者)在 swarmplot 上用不同的符号表示。

我试过玩 palette争论,但没有得到我想要的。我也试过玩 artists直接,但更改 facecolor箱线图也改变了 edgecolor出于某种原因,我不知道如何更改 swarmplot 上的符号。

最佳答案

我意识到,when answering this question ,我从未针对这个问题提出我自己的解决方案,即使我不久前已经一起破解了一些东西。

# From itertools' receipes https://docs.python.org/3/library/itertools.html#itertools-recipes
from itertools import zip_longest
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return zip_longest(*args, fillvalue=fillvalue)


fig, ax = plt.subplots()
# 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()

sns.swarmplot(x="day", y="total_bill", hue="smoker", data=tips, dodge=True, size=6, lw=2, edgecolor='k')
swarm_cols = ax.collections

sns.boxplot(x="day", y="total_bill", hue="smoker", data=tips, fliersize=0)
box_cols = ax.artists

ax.legend_.remove()

N_cats = len(np.unique(tips.day))
N_hues = len(np.unique(tips.smoker))
print(N_cats,N_hues)

pastels = matplotlib.cm.get_cmap('Pastel1')
cat_colors = [pastels(x) for x in np.linspace(0,1,N_cats)]
hue_markers = [square_mk, triangle_up_mk]

for boxes,color in zip(grouper(box_cols, N_hues),cat_colors):
for box in boxes:
box.set_facecolor(color)
for swarms,color in zip(grouper(swarm_cols, N_hues), cat_colors):
for swarm,marker in zip(swarms,hue_markers):
print(swarm, len(swarm.get_offsets()))
swarm.set_paths([marker])
swarm.set_facecolors([color])
swarm.set_linewidths([1.])
swarm.set_edgecolors(['xkcd:dark grey'])

# recreate legend
for swarm,marker in zip(swarm_cols[-2:],hue_markers):
print(swarm, len(swarm.get_offsets()))
swarm.set_paths([marker])
swarm.set_facecolors(["none"])
swarm.set_linewidths([1.])
swarm.set_edgecolors(['xkcd:dark grey'])
ax.legend(swarm_cols[-2:],np.unique(tips.smoker))

enter image description here

关于matplotlib - Seaborn 的箱线图+群图 : different color for x, 不同的色调符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40721242/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com